utils.spec.ts 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import { get } from 'lodash'
  2. import { buildChatItemTree, getThreadMessages } from '../utils'
  3. import type { ChatItemInTree } from '../types'
  4. import branchedTestMessages from './branchedTestMessages.json'
  5. import legacyTestMessages from './legacyTestMessages.json'
  6. import mixedTestMessages from './mixedTestMessages.json'
  7. import multiRootNodesMessages from './multiRootNodesMessages.json'
  8. import multiRootNodesWithLegacyTestMessages from './multiRootNodesWithLegacyTestMessages.json'
  9. import realWorldMessages from './realWorldMessages.json'
  10. function visitNode(tree: ChatItemInTree | ChatItemInTree[], path: string): ChatItemInTree {
  11. return get(tree, path)
  12. }
  13. describe('build chat item tree and get thread messages', () => {
  14. const tree1 = buildChatItemTree(branchedTestMessages as ChatItemInTree[])
  15. it('should build chat item tree1', () => {
  16. const a1 = visitNode(tree1, '0.children.0')
  17. expect(a1.id).toBe('1')
  18. expect(a1.children).toHaveLength(2)
  19. const a2 = visitNode(a1, 'children.0.children.0')
  20. expect(a2.id).toBe('2')
  21. expect(a2.siblingIndex).toBe(0)
  22. const a3 = visitNode(a2, 'children.0.children.0')
  23. expect(a3.id).toBe('3')
  24. const a4 = visitNode(a1, 'children.1.children.0')
  25. expect(a4.id).toBe('4')
  26. expect(a4.siblingIndex).toBe(1)
  27. })
  28. it('should get thread messages from tree1, using the last message as the target', () => {
  29. const threadChatItems1_1 = getThreadMessages(tree1)
  30. expect(threadChatItems1_1).toHaveLength(4)
  31. const q1 = visitNode(threadChatItems1_1, '0')
  32. const a1 = visitNode(threadChatItems1_1, '1')
  33. const q4 = visitNode(threadChatItems1_1, '2')
  34. const a4 = visitNode(threadChatItems1_1, '3')
  35. expect(q1.id).toBe('question-1')
  36. expect(a1.id).toBe('1')
  37. expect(q4.id).toBe('question-4')
  38. expect(a4.id).toBe('4')
  39. expect(a4.siblingCount).toBe(2)
  40. expect(a4.siblingIndex).toBe(1)
  41. })
  42. it('should get thread messages from tree1, using the message with id 3 as the target', () => {
  43. const threadChatItems1_2 = getThreadMessages(tree1, '3')
  44. expect(threadChatItems1_2).toHaveLength(6)
  45. const q1 = visitNode(threadChatItems1_2, '0')
  46. const a1 = visitNode(threadChatItems1_2, '1')
  47. const q2 = visitNode(threadChatItems1_2, '2')
  48. const a2 = visitNode(threadChatItems1_2, '3')
  49. const q3 = visitNode(threadChatItems1_2, '4')
  50. const a3 = visitNode(threadChatItems1_2, '5')
  51. expect(q1.id).toBe('question-1')
  52. expect(a1.id).toBe('1')
  53. expect(q2.id).toBe('question-2')
  54. expect(a2.id).toBe('2')
  55. expect(q3.id).toBe('question-3')
  56. expect(a3.id).toBe('3')
  57. expect(a2.siblingCount).toBe(2)
  58. expect(a2.siblingIndex).toBe(0)
  59. })
  60. const tree2 = buildChatItemTree(legacyTestMessages as ChatItemInTree[])
  61. it('should work with legacy chat items', () => {
  62. expect(tree2).toHaveLength(1)
  63. const q1 = visitNode(tree2, '0')
  64. const a1 = visitNode(q1, 'children.0')
  65. const q2 = visitNode(a1, 'children.0')
  66. const a2 = visitNode(q2, 'children.0')
  67. const q3 = visitNode(a2, 'children.0')
  68. const a3 = visitNode(q3, 'children.0')
  69. const q4 = visitNode(a3, 'children.0')
  70. const a4 = visitNode(q4, 'children.0')
  71. expect(q1.id).toBe('question-1')
  72. expect(a1.id).toBe('1')
  73. expect(q2.id).toBe('question-2')
  74. expect(a2.id).toBe('2')
  75. expect(q3.id).toBe('question-3')
  76. expect(a3.id).toBe('3')
  77. expect(q4.id).toBe('question-4')
  78. expect(a4.id).toBe('4')
  79. })
  80. it('should get thread messages from tree2, using the last message as the target', () => {
  81. const threadMessages2 = getThreadMessages(tree2)
  82. expect(threadMessages2).toHaveLength(8)
  83. const q1 = visitNode(threadMessages2, '0')
  84. const a1 = visitNode(threadMessages2, '1')
  85. const q2 = visitNode(threadMessages2, '2')
  86. const a2 = visitNode(threadMessages2, '3')
  87. const q3 = visitNode(threadMessages2, '4')
  88. const a3 = visitNode(threadMessages2, '5')
  89. const q4 = visitNode(threadMessages2, '6')
  90. const a4 = visitNode(threadMessages2, '7')
  91. expect(q1.id).toBe('question-1')
  92. expect(a1.id).toBe('1')
  93. expect(q2.id).toBe('question-2')
  94. expect(a2.id).toBe('2')
  95. expect(q3.id).toBe('question-3')
  96. expect(a3.id).toBe('3')
  97. expect(q4.id).toBe('question-4')
  98. expect(a4.id).toBe('4')
  99. expect(a1.siblingCount).toBe(1)
  100. expect(a1.siblingIndex).toBe(0)
  101. expect(a2.siblingCount).toBe(1)
  102. expect(a2.siblingIndex).toBe(0)
  103. expect(a3.siblingCount).toBe(1)
  104. expect(a3.siblingIndex).toBe(0)
  105. expect(a4.siblingCount).toBe(1)
  106. expect(a4.siblingIndex).toBe(0)
  107. })
  108. const tree3 = buildChatItemTree(mixedTestMessages as ChatItemInTree[])
  109. it('should build mixed chat items tree', () => {
  110. expect(tree3).toHaveLength(1)
  111. const a1 = visitNode(tree3, '0.children.0')
  112. expect(a1.id).toBe('1')
  113. expect(a1.children).toHaveLength(2)
  114. const a2 = visitNode(a1, 'children.0.children.0')
  115. expect(a2.id).toBe('2')
  116. expect(a2.siblingIndex).toBe(0)
  117. const a3 = visitNode(a2, 'children.0.children.0')
  118. expect(a3.id).toBe('3')
  119. const a4 = visitNode(a1, 'children.1.children.0')
  120. expect(a4.id).toBe('4')
  121. expect(a4.siblingIndex).toBe(1)
  122. })
  123. it('should get thread messages from tree3, using the last message as the target', () => {
  124. const threadMessages3_1 = getThreadMessages(tree3)
  125. expect(threadMessages3_1).toHaveLength(4)
  126. const q1 = visitNode(threadMessages3_1, '0')
  127. const a1 = visitNode(threadMessages3_1, '1')
  128. const q4 = visitNode(threadMessages3_1, '2')
  129. const a4 = visitNode(threadMessages3_1, '3')
  130. expect(q1.id).toBe('question-1')
  131. expect(a1.id).toBe('1')
  132. expect(q4.id).toBe('question-4')
  133. expect(a4.id).toBe('4')
  134. expect(a4.siblingCount).toBe(2)
  135. expect(a4.siblingIndex).toBe(1)
  136. })
  137. it('should get thread messages from tree3, using the message with id 3 as the target', () => {
  138. const threadMessages3_2 = getThreadMessages(tree3, '3')
  139. expect(threadMessages3_2).toHaveLength(6)
  140. const q1 = visitNode(threadMessages3_2, '0')
  141. const a1 = visitNode(threadMessages3_2, '1')
  142. const q2 = visitNode(threadMessages3_2, '2')
  143. const a2 = visitNode(threadMessages3_2, '3')
  144. const q3 = visitNode(threadMessages3_2, '4')
  145. const a3 = visitNode(threadMessages3_2, '5')
  146. expect(q1.id).toBe('question-1')
  147. expect(a1.id).toBe('1')
  148. expect(q2.id).toBe('question-2')
  149. expect(a2.id).toBe('2')
  150. expect(q3.id).toBe('question-3')
  151. expect(a3.id).toBe('3')
  152. expect(a2.siblingCount).toBe(2)
  153. expect(a2.siblingIndex).toBe(0)
  154. })
  155. const tree4 = buildChatItemTree(multiRootNodesMessages as ChatItemInTree[])
  156. it('should build multi root nodes chat items tree', () => {
  157. expect(tree4).toHaveLength(2)
  158. const a5 = visitNode(tree4, '1.children.0')
  159. expect(a5.id).toBe('5')
  160. expect(a5.siblingIndex).toBe(1)
  161. })
  162. it('should get thread messages from tree4, using the last message as the target', () => {
  163. const threadMessages4 = getThreadMessages(tree4)
  164. expect(threadMessages4).toHaveLength(2)
  165. const a1 = visitNode(threadMessages4, '0.children.0')
  166. expect(a1.id).toBe('5')
  167. })
  168. it('should get thread messages from tree4, using the message with id 2 as the target', () => {
  169. const threadMessages4_1 = getThreadMessages(tree4, '2')
  170. expect(threadMessages4_1).toHaveLength(6)
  171. const a1 = visitNode(threadMessages4_1, '1')
  172. expect(a1.id).toBe('1')
  173. const a2 = visitNode(threadMessages4_1, '3')
  174. expect(a2.id).toBe('2')
  175. const a3 = visitNode(threadMessages4_1, '5')
  176. expect(a3.id).toBe('3')
  177. })
  178. const tree5 = buildChatItemTree(multiRootNodesWithLegacyTestMessages as ChatItemInTree[])
  179. it('should work with multi root nodes chat items with legacy chat items', () => {
  180. expect(tree5).toHaveLength(2)
  181. const q5 = visitNode(tree5, '1')
  182. expect(q5.id).toBe('question-5')
  183. expect(q5.parentMessageId).toBe(null)
  184. const a5 = visitNode(q5, 'children.0')
  185. expect(a5.id).toBe('5')
  186. expect(a5.children).toHaveLength(0)
  187. })
  188. it('should get thread messages from tree5, using the last message as the target', () => {
  189. const threadMessages5 = getThreadMessages(tree5)
  190. expect(threadMessages5).toHaveLength(2)
  191. const q5 = visitNode(threadMessages5, '0')
  192. const a5 = visitNode(threadMessages5, '1')
  193. expect(q5.id).toBe('question-5')
  194. expect(a5.id).toBe('5')
  195. expect(a5.siblingCount).toBe(2)
  196. expect(a5.siblingIndex).toBe(1)
  197. })
  198. const tree6 = buildChatItemTree(realWorldMessages as ChatItemInTree[])
  199. it('should work with real world messages', () => {
  200. expect(tree6).toMatchSnapshot()
  201. })
  202. it ('should get thread messages from tree6, using the last message as target', () => {
  203. const threadMessages6_1 = getThreadMessages(tree6)
  204. expect(threadMessages6_1).toMatchSnapshot()
  205. })
  206. it ('should get thread messages from tree6, using specified message as target', () => {
  207. const threadMessages6_2 = getThreadMessages(tree6, 'ff4c2b43-48a5-47ad-9dc5-08b34ddba61b')
  208. expect(threadMessages6_2).toMatchSnapshot()
  209. })
  210. const partialMessages = (realWorldMessages as ChatItemInTree[]).slice(-10)
  211. const tree7 = buildChatItemTree(partialMessages)
  212. it('should work with partial messages', () => {
  213. expect(tree7).toMatchSnapshot()
  214. })
  215. })