@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/.github/workflows/desktop-pr-build.yml +6 -6
  2. package/.github/workflows/release-desktop-beta.yml +4 -4
  3. package/.github/workflows/release.yml +1 -2
  4. package/.github/workflows/test.yml +4 -5
  5. package/.nvmrc +1 -1
  6. package/CHANGELOG.md +42 -0
  7. package/apps/desktop/tsconfig.json +0 -1
  8. package/changelog/v1.json +14 -0
  9. package/e2e/tsconfig.json +0 -1
  10. package/package.json +58 -58
  11. package/packages/const/src/version.ts +3 -3
  12. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  13. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  14. package/packages/web-crawler/tsconfig.json +0 -1
  15. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  16. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  17. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  18. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  20. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  21. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  22. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  23. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  24. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  25. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  26. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  27. package/src/app/[variants]/loading/index.tsx +1 -10
  28. package/src/components/Link.tsx +12 -0
  29. package/src/envs/app.ts +5 -8
  30. package/src/features/DataImporter/index.tsx +15 -60
  31. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  32. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  33. package/src/libs/trpc/client/index.ts +0 -1
  34. package/src/libs/trpc/client/lambda.ts +8 -5
  35. package/src/server/routers/desktop/mcp.ts +1 -3
  36. package/src/server/routers/lambda/config/index.test.ts +2 -2
  37. package/src/server/routers/tools/mcp.ts +2 -3
  38. package/src/server/routers/tools/search.test.ts +1 -7
  39. package/src/server/routers/tools/search.ts +1 -4
  40. package/src/services/__tests__/tool.test.ts +0 -3
  41. package/src/services/aiModel/index.test.ts +0 -3
  42. package/src/services/aiModel/index.ts +1 -7
  43. package/src/services/aiProvider/index.test.ts +0 -3
  44. package/src/services/aiProvider/index.ts +1 -7
  45. package/src/services/chatGroup/index.ts +1 -10
  46. package/src/services/config.ts +1 -65
  47. package/src/services/export/index.ts +1 -4
  48. package/src/services/file/index.ts +1 -11
  49. package/src/services/import/index.ts +1 -7
  50. package/src/services/message/index.ts +1 -11
  51. package/src/services/plugin/index.ts +1 -11
  52. package/src/services/session/index.ts +1 -11
  53. package/src/services/tableViewer/client.ts +12 -15
  54. package/src/services/thread/index.ts +1 -7
  55. package/src/services/topic/index.ts +1 -11
  56. package/src/services/user/index.ts +1 -13
  57. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  58. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  59. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  60. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  61. package/src/store/user/slices/common/action.test.ts +1 -4
  62. package/tsconfig.json +0 -1
  63. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  64. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  65. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  66. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  67. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  68. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  69. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  70. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  71. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  72. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  73. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  74. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  75. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  76. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  77. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  78. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  79. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  80. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  81. package/src/components/InnerLink.tsx +0 -20
  82. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  83. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  84. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  85. package/src/database/_deprecated/core/db.ts +0 -246
  86. package/src/database/_deprecated/core/index.ts +0 -2
  87. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  88. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  89. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  90. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  91. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  92. package/src/database/_deprecated/core/model.ts +0 -218
  93. package/src/database/_deprecated/core/schemas.ts +0 -88
  94. package/src/database/_deprecated/core/types/db.ts +0 -15
  95. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  96. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  97. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  98. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  99. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  100. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  101. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  102. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  103. package/src/database/_deprecated/models/file.ts +0 -51
  104. package/src/database/_deprecated/models/message.ts +0 -277
  105. package/src/database/_deprecated/models/plugin.ts +0 -62
  106. package/src/database/_deprecated/models/session.ts +0 -271
  107. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  108. package/src/database/_deprecated/models/topic.ts +0 -250
  109. package/src/database/_deprecated/models/user.ts +0 -69
  110. package/src/database/_deprecated/schemas/files.ts +0 -39
  111. package/src/database/_deprecated/schemas/message.ts +0 -50
  112. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  113. package/src/database/_deprecated/schemas/session.ts +0 -54
  114. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  115. package/src/database/_deprecated/schemas/topic.ts +0 -12
  116. package/src/database/_deprecated/schemas/user.ts +0 -40
  117. package/src/features/DataImporter/_deprecated.ts +0 -43
  118. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  119. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  120. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  121. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  122. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  123. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  124. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  125. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  126. package/src/features/InitClientDB/index.tsx +0 -37
  127. package/src/libs/trpc/client/edge.ts +0 -26
  128. package/src/libs/trpc/edge/context.ts +0 -71
  129. package/src/libs/trpc/edge/index.ts +0 -45
  130. package/src/libs/trpc/edge/init.ts +0 -26
  131. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  132. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  133. package/src/migrations/FromV0ToV1.ts +0 -10
  134. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  135. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  136. package/src/migrations/FromV1ToV2/index.ts +0 -82
  137. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  138. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  139. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  140. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  141. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  142. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  143. package/src/migrations/FromV2ToV3/index.ts +0 -30
  144. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  145. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  146. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  147. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  148. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  149. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  150. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  151. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  152. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  153. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  154. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  155. package/src/migrations/FromV3ToV4/index.ts +0 -102
  156. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  157. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  158. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  159. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  160. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  161. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  162. package/src/migrations/FromV4ToV5/index.ts +0 -58
  163. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  164. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  165. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  166. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  167. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  168. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  169. package/src/migrations/FromV5ToV6/index.ts +0 -61
  170. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  171. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  172. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  173. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  174. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  175. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  176. package/src/migrations/FromV6ToV7/index.ts +0 -101
  177. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  178. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  179. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  180. package/src/migrations/VersionController.test.ts +0 -88
  181. package/src/migrations/VersionController.ts +0 -67
  182. package/src/migrations/index.ts +0 -61
  183. package/src/server/routers/edge/appStatus.ts +0 -3
  184. package/src/server/routers/edge/index.ts +0 -14
  185. package/src/server/routers/edge/upload.ts +0 -16
  186. package/src/services/aiModel/client.ts +0 -70
  187. package/src/services/aiProvider/client.ts +0 -58
  188. package/src/services/baseClientService/index.ts +0 -9
  189. package/src/services/chatGroup/client.ts +0 -63
  190. package/src/services/export/_deprecated.ts +0 -155
  191. package/src/services/export/client.ts +0 -15
  192. package/src/services/file/_deprecated.test.ts +0 -119
  193. package/src/services/file/_deprecated.ts +0 -80
  194. package/src/services/file/client.test.ts +0 -199
  195. package/src/services/file/client.ts +0 -85
  196. package/src/services/import/_deprecated.ts +0 -115
  197. package/src/services/import/client.test.ts +0 -1015
  198. package/src/services/import/client.ts +0 -64
  199. package/src/services/message/_deprecated.test.ts +0 -398
  200. package/src/services/message/_deprecated.ts +0 -168
  201. package/src/services/message/client.test.ts +0 -410
  202. package/src/services/message/client.ts +0 -192
  203. package/src/services/plugin/_deprecated.test.ts +0 -162
  204. package/src/services/plugin/_deprecated.ts +0 -42
  205. package/src/services/plugin/client.test.ts +0 -177
  206. package/src/services/plugin/client.ts +0 -46
  207. package/src/services/session/_deprecated.test.ts +0 -440
  208. package/src/services/session/_deprecated.ts +0 -190
  209. package/src/services/session/client.test.ts +0 -413
  210. package/src/services/session/client.ts +0 -193
  211. package/src/services/thread/client.ts +0 -51
  212. package/src/services/topic/_deprecated.test.ts +0 -245
  213. package/src/services/topic/_deprecated.ts +0 -75
  214. package/src/services/topic/client.ts +0 -89
  215. package/src/services/topic/pglite.test.ts +0 -212
  216. package/src/services/user/_deprecated.test.ts +0 -101
  217. package/src/services/user/_deprecated.ts +0 -70
  218. package/src/services/user/client.test.ts +0 -111
  219. package/src/services/user/client.ts +0 -104
@@ -1,1015 +0,0 @@
1
- import { eq, inArray } from 'drizzle-orm';
2
- import { beforeEach, describe, expect, it, vi } from 'vitest';
3
-
4
- import { clientDB, initializeDB } from '@/database/client/db';
5
- import mockImportData from '@/database/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json';
6
- import {
7
- agents,
8
- agentsToSessions,
9
- messages,
10
- sessionGroups,
11
- sessions,
12
- topics,
13
- users,
14
- } from '@/database/schemas';
15
- import { CURRENT_CONFIG_VERSION } from '@/migrations';
16
- import { ImportResults, ImporterEntryData } from '@/types/importer';
17
-
18
- import { ClientService } from './client';
19
-
20
- const userId = 'test-user-id';
21
- const service = new ClientService(userId);
22
-
23
- beforeEach(async () => {
24
- await initializeDB();
25
-
26
- await clientDB.delete(users);
27
-
28
- // 创建测试数据
29
- await clientDB.transaction(async (tx) => {
30
- await tx.insert(users).values({ id: userId });
31
- });
32
- });
33
-
34
- describe('ImporterService', () => {
35
- describe('import sessionGroups', () => {
36
- it('should import session groups and return correct result', async () => {
37
- const data: ImporterEntryData = {
38
- version: CURRENT_CONFIG_VERSION,
39
- sessionGroups: [
40
- { id: 'group1', name: 'Group 1', createdAt: 1715186011586, updatedAt: 1715186015053 },
41
- { id: 'group2', name: 'Group 2', createdAt: 1715186011586, updatedAt: 1715186015053 },
42
- ],
43
- };
44
-
45
- let result: ImportResults;
46
- await service.importData(data, {
47
- onSuccess: (res) => {
48
- result = res;
49
- },
50
- });
51
-
52
- expect(result!.sessionGroups!.added).toBe(2);
53
- expect(result!.sessionGroups!.skips).toBe(0);
54
- expect(result!.sessionGroups!.errors).toBe(0);
55
-
56
- const groups = await clientDB.query.sessionGroups.findMany({
57
- where: eq(sessionGroups.userId, userId),
58
- });
59
- expect(groups).toHaveLength(2);
60
- });
61
-
62
- it('should skip existing session groups and return correct result', async () => {
63
- await clientDB
64
- .insert(sessionGroups)
65
- .values({ clientId: 'group1', name: 'Existing Group', userId })
66
- .execute();
67
-
68
- const data: ImporterEntryData = {
69
- version: CURRENT_CONFIG_VERSION,
70
- sessionGroups: [
71
- { id: 'group1', name: 'Group 1', createdAt: 1715186011586, updatedAt: 1715186015053 },
72
- { id: 'group2', name: 'Group 2', createdAt: 1715186011586, updatedAt: 1715186015053 },
73
- ],
74
- };
75
-
76
- let result: ImportResults;
77
- await service.importData(data, {
78
- onSuccess: (res) => {
79
- result = res;
80
- },
81
- });
82
-
83
- expect(result!.sessionGroups!.added).toBe(1);
84
- expect(result!.sessionGroups!.skips).toBe(1);
85
- expect(result!.sessionGroups!.errors).toBe(0);
86
- });
87
- });
88
-
89
- describe('import sessions', () => {
90
- it('should import sessions and return correct result', async () => {
91
- const data: ImporterEntryData = {
92
- version: CURRENT_CONFIG_VERSION,
93
- sessions: [
94
- {
95
- id: 'session1',
96
- createdAt: '2022-05-14T18:18:10.494Z',
97
- updatedAt: '2023-01-01',
98
- type: 'agent',
99
- config: {
100
- model: 'abc',
101
- chatConfig: {} as any,
102
- params: {},
103
- systemRole: 'abc',
104
- tts: {} as any,
105
- openingQuestions: [],
106
- },
107
- meta: {
108
- title: 'Session 1',
109
- },
110
- },
111
- {
112
- id: 'session2',
113
- createdAt: '2022-05-14T18:18:10.494Z',
114
- updatedAt: '2023-01-01',
115
- type: 'agent',
116
- config: {
117
- model: 'abc',
118
- chatConfig: {} as any,
119
- params: {},
120
- systemRole: 'abc',
121
- tts: {} as any,
122
- openingQuestions: [],
123
- },
124
- meta: {
125
- title: 'Session 2',
126
- },
127
- },
128
- ],
129
- };
130
-
131
- let result: ImportResults;
132
- await service.importData(data, {
133
- onSuccess: (res) => {
134
- result = res;
135
- },
136
- });
137
-
138
- expect(result!.sessions!.added).toBe(2);
139
- expect(result!.sessions!.skips).toBe(0);
140
- expect(result!.sessions!.errors).toBe(0);
141
-
142
- const importedSessions = await clientDB.query.sessions.findMany({
143
- where: eq(sessions.userId, userId),
144
- });
145
- expect(importedSessions).toHaveLength(2);
146
-
147
- const agentCount = await clientDB.query.agents.findMany({
148
- where: eq(agents.userId, userId),
149
- });
150
-
151
- expect(agentCount.length).toBe(2);
152
-
153
- const agentSessionCount = await clientDB.query.agentsToSessions.findMany();
154
- expect(agentSessionCount.length).toBe(2);
155
- });
156
-
157
- it('should skip existing sessions and return correct result', async () => {
158
- await clientDB.insert(sessions).values({ clientId: 'session1', userId }).execute();
159
-
160
- const data: ImporterEntryData = {
161
- version: CURRENT_CONFIG_VERSION,
162
- sessions: [
163
- {
164
- id: 'session1',
165
- createdAt: '2022-05-14T18:18:10.494Z',
166
- updatedAt: '2023-01-01',
167
- type: 'agent',
168
- config: {
169
- model: 'abc',
170
- chatConfig: {} as any,
171
- params: {},
172
- systemRole: 'abc',
173
- tts: {} as any,
174
- openingQuestions: [],
175
- },
176
- meta: {
177
- title: 'Session 1',
178
- },
179
- },
180
- {
181
- id: 'session2',
182
- createdAt: '2022-05-14T18:18:10.494Z',
183
- updatedAt: '2023-01-01',
184
- type: 'agent',
185
- config: {
186
- model: 'abc',
187
- chatConfig: {} as any,
188
- params: {},
189
- systemRole: 'abc',
190
- tts: {} as any,
191
- openingQuestions: [],
192
- },
193
- meta: {
194
- title: 'Session 2',
195
- },
196
- },
197
- ],
198
- };
199
-
200
- let result: ImportResults;
201
- await service.importData(data, {
202
- onSuccess: (res) => {
203
- result = res;
204
- },
205
- });
206
-
207
- expect(result!.sessions!.added).toBe(1);
208
- expect(result!.sessions!.skips).toBe(1);
209
- expect(result!.sessions!.errors).toBe(0);
210
- });
211
-
212
- it('should associate imported sessions with session groups', async () => {
213
- const data: ImporterEntryData = {
214
- version: CURRENT_CONFIG_VERSION,
215
- sessionGroups: [
216
- { id: 'group1', name: 'Group 1', createdAt: 1715186011586, updatedAt: 1715186015053 },
217
- { id: 'group2', name: 'Group 2', createdAt: 1715186011586, updatedAt: 1715186015053 },
218
- ],
219
- sessions: [
220
- {
221
- id: 'session1',
222
- createdAt: '2022-05-14T18:18:10.494Z',
223
- updatedAt: '2023-01-01',
224
- type: 'agent',
225
- group: 'group1',
226
- config: {
227
- model: 'abc',
228
- chatConfig: {} as any,
229
- params: {},
230
- systemRole: 'abc',
231
- tts: {} as any,
232
- openingQuestions: [],
233
- },
234
- meta: {
235
- title: 'Session 1',
236
- },
237
- },
238
- {
239
- id: 'session2',
240
- group: 'group2',
241
- createdAt: '2022-05-14T18:18:10.494Z',
242
- updatedAt: '2023-01-01',
243
- type: 'agent',
244
- config: {
245
- model: 'abc',
246
- chatConfig: {} as any,
247
- params: {},
248
- systemRole: 'abc',
249
- tts: {} as any,
250
- openingQuestions: [],
251
- },
252
- meta: {
253
- title: 'Session 2',
254
- },
255
- },
256
- {
257
- id: 'session3',
258
- group: 'group4',
259
- createdAt: '2022-05-14T18:18:10.494Z',
260
- updatedAt: '2023-01-01',
261
- type: 'agent',
262
- config: {
263
- model: 'abc',
264
- chatConfig: {} as any,
265
- params: {},
266
- systemRole: 'abc',
267
- tts: {} as any,
268
- openingQuestions: [],
269
- },
270
- meta: {
271
- title: 'Session 3',
272
- },
273
- },
274
- ],
275
- };
276
-
277
- let result: ImportResults;
278
- await service.importData(data, {
279
- onSuccess: (res) => {
280
- result = res;
281
- },
282
- });
283
-
284
- expect(result!.sessionGroups!.added).toBe(2);
285
- expect(result!.sessionGroups!.skips).toBe(0);
286
-
287
- expect(result!.sessions!.added).toBe(3);
288
- expect(result!.sessions!.skips).toBe(0);
289
-
290
- // session 1 should be associated with group 1
291
- const session1 = await clientDB.query.sessions.findFirst({
292
- where: eq(sessions.clientId, 'session1'),
293
- with: { group: true },
294
- });
295
- expect(session1?.group).toBeDefined();
296
-
297
- // session 3 should not have group
298
- const session3 = await clientDB.query.sessions.findFirst({
299
- where: eq(sessions.clientId, 'session3'),
300
- with: { group: true },
301
- });
302
- expect(session3?.group).toBeNull();
303
- });
304
-
305
- it('should create agents and associate them with imported sessions', async () => {
306
- const data: ImporterEntryData = {
307
- version: CURRENT_CONFIG_VERSION,
308
- sessions: [
309
- {
310
- id: 'session1',
311
- createdAt: '2022-05-14T18:18:10.494Z',
312
- updatedAt: '2023-01-01',
313
- type: 'agent',
314
- config: {
315
- model: 'abc',
316
- chatConfig: {} as any,
317
- params: {},
318
- systemRole: 'Test Agent 1',
319
- tts: {} as any,
320
- openingQuestions: [],
321
- },
322
- meta: {
323
- title: 'Session 1',
324
- },
325
- },
326
- {
327
- id: 'session2',
328
- createdAt: '2022-05-14T18:18:10.494Z',
329
- updatedAt: '2023-01-01',
330
- type: 'agent',
331
- config: {
332
- model: 'def',
333
- chatConfig: {} as any,
334
- params: {},
335
- systemRole: 'Test Agent 2',
336
- tts: {} as any,
337
- openingQuestions: [],
338
- },
339
- meta: {
340
- title: 'Session 2',
341
- },
342
- },
343
- ],
344
- };
345
-
346
- await service.importData(data);
347
-
348
- // 验证是否为每个 session 创建了对应的 agent
349
- const agentCount = await clientDB.query.agents.findMany({
350
- where: eq(agents.userId, userId),
351
- });
352
- expect(agentCount).toHaveLength(2);
353
-
354
- // 验证 agent 的属性是否正确设置
355
- const agent1 = await clientDB.query.agents.findFirst({
356
- where: eq(agents.systemRole, 'Test Agent 1'),
357
- });
358
- expect(agent1?.model).toBe('abc');
359
-
360
- const agent2 = await clientDB.query.agents.findFirst({
361
- where: eq(agents.systemRole, 'Test Agent 2'),
362
- });
363
- expect(agent2?.model).toBe('def');
364
-
365
- // 验证 agentsToSessions 关联是否正确建立
366
- const session1 = await clientDB.query.sessions.findFirst({
367
- where: eq(sessions.clientId, 'session1'),
368
- });
369
- const session1Agent = await clientDB.query.agentsToSessions.findFirst({
370
- where: eq(agentsToSessions.sessionId, session1?.id!),
371
- with: { agent: true },
372
- });
373
-
374
- expect((session1Agent?.agent as any).systemRole).toBe('Test Agent 1');
375
-
376
- const session2 = await clientDB.query.sessions.findFirst({
377
- where: eq(sessions.clientId, 'session2'),
378
- });
379
- const session2Agent = await clientDB.query.agentsToSessions.findFirst({
380
- where: eq(agentsToSessions.sessionId, session2?.id!),
381
- with: { agent: true },
382
- });
383
-
384
- expect((session2Agent?.agent as any).systemRole).toBe('Test Agent 2');
385
- });
386
-
387
- it('should not create duplicate agents for existing sessions', async () => {
388
- // 先导入一些 sessions
389
- await service.importData({
390
- sessions: [
391
- {
392
- id: 'session1',
393
- createdAt: '2022-05-14T18:18:10.494Z',
394
- updatedAt: '2023-01-01',
395
- type: 'agent',
396
- config: {
397
- model: 'abc',
398
- chatConfig: {} as any,
399
- params: {},
400
- systemRole: 'Test Agent 1',
401
- tts: {} as any,
402
- openingQuestions: [],
403
- },
404
- meta: {
405
- title: 'Session 1',
406
- },
407
- },
408
- ],
409
- version: CURRENT_CONFIG_VERSION,
410
- });
411
-
412
- // 再次导入相同的 sessions
413
- await service.importData({
414
- sessions: [
415
- {
416
- id: 'session1',
417
- createdAt: '2022-05-14T18:18:10.494Z',
418
- updatedAt: '2023-01-01',
419
- type: 'agent',
420
- config: {
421
- model: 'abc',
422
- chatConfig: {} as any,
423
- params: {},
424
- systemRole: 'Test Agent 1',
425
- tts: {} as any,
426
- openingQuestions: [],
427
- },
428
- meta: {
429
- title: 'Session 1',
430
- },
431
- },
432
- ],
433
- version: CURRENT_CONFIG_VERSION,
434
- });
435
-
436
- // 验证只创建了一个 agent
437
- const agentCount = await clientDB.query.agents.findMany({
438
- where: eq(agents.userId, userId),
439
- });
440
- expect(agentCount).toHaveLength(1);
441
- });
442
- });
443
-
444
- describe('import topics', () => {
445
- it('should import topics and return correct result', async () => {
446
- const data: ImporterEntryData = {
447
- version: CURRENT_CONFIG_VERSION,
448
- topics: [
449
- {
450
- id: 'topic1',
451
- title: 'Topic 1',
452
- createdAt: 1715186011586,
453
- updatedAt: 1715186015053,
454
- sessionId: 'session1',
455
- },
456
- {
457
- id: 'topic2',
458
- title: 'Topic 2',
459
- createdAt: 1715186011586,
460
- updatedAt: 1715186015053,
461
- sessionId: 'session2',
462
- },
463
- ],
464
- sessions: [
465
- {
466
- id: 'session1',
467
- createdAt: '2022-05-14T18:18:10.494Z',
468
- updatedAt: '2023-01-01',
469
- type: 'agent',
470
- config: {
471
- model: 'abc',
472
- chatConfig: {} as any,
473
- params: {},
474
- systemRole: 'abc',
475
- tts: {} as any,
476
- openingQuestions: [],
477
- },
478
- meta: {
479
- title: 'Session 1',
480
- },
481
- },
482
- {
483
- id: 'session2',
484
- createdAt: '2022-05-14T18:18:10.494Z',
485
- updatedAt: '2023-01-01',
486
- type: 'agent',
487
- config: {
488
- model: 'abc',
489
- chatConfig: {} as any,
490
- params: {},
491
- systemRole: 'abc',
492
- tts: {} as any,
493
- openingQuestions: [],
494
- },
495
- meta: {
496
- title: 'Session 2',
497
- },
498
- },
499
- ],
500
- };
501
-
502
- let result: ImportResults;
503
- await service.importData(data, {
504
- onSuccess: (res) => {
505
- result = res;
506
- },
507
- });
508
-
509
- expect(result!.topics!.added).toBe(2);
510
- expect(result!.topics!.skips).toBe(0);
511
- expect(result!.topics!.errors).toBe(0);
512
-
513
- const importedTopics = await clientDB.query.topics.findMany({
514
- where: eq(topics.userId, userId),
515
- });
516
- expect(importedTopics).toHaveLength(2);
517
- });
518
-
519
- it('should skip existing topics and return correct result', async () => {
520
- await clientDB
521
- .insert(topics)
522
- .values({ clientId: 'topic1', title: 'Existing Topic', userId })
523
- .execute();
524
-
525
- const data: ImporterEntryData = {
526
- version: CURRENT_CONFIG_VERSION,
527
- topics: [
528
- { id: 'topic1', title: 'Topic 1', createdAt: 1715186011586, updatedAt: 1715186015053 },
529
- { id: 'topic2', title: 'Topic 2', createdAt: 1715186011586, updatedAt: 1715186015053 },
530
- ],
531
- };
532
-
533
- let result: ImportResults;
534
- await service.importData(data, {
535
- onSuccess: (res) => {
536
- result = res;
537
- },
538
- });
539
-
540
- expect(result!.topics!.added).toBe(1);
541
- expect(result!.topics!.skips).toBe(1);
542
- expect(result!.topics!.errors).toBe(0);
543
- });
544
-
545
- it('should associate imported topics with sessions', async () => {
546
- const data: ImporterEntryData = {
547
- version: CURRENT_CONFIG_VERSION,
548
- sessions: [
549
- {
550
- id: 'session1',
551
- createdAt: '2022-05-14T18:18:10.494Z',
552
- updatedAt: '2023-01-01',
553
- type: 'agent',
554
- config: {
555
- model: 'abc',
556
- chatConfig: {} as any,
557
- params: {},
558
- systemRole: 'abc',
559
- tts: {} as any,
560
- openingQuestions: [],
561
- },
562
- meta: {
563
- title: 'Session 1',
564
- },
565
- },
566
- ],
567
- topics: [
568
- {
569
- id: 'topic1',
570
- title: 'Topic 1',
571
- createdAt: 1715186011586,
572
- updatedAt: 1715186015053,
573
- sessionId: 'session1',
574
- },
575
- { id: 'topic2', title: 'Topic 2', createdAt: 1715186011586, updatedAt: 1715186015053 },
576
- ],
577
- };
578
-
579
- await service.importData(data);
580
-
581
- // topic1 should be associated with session1
582
- const [topic1] = await clientDB
583
- .select({ sessionClientId: sessions.clientId })
584
- .from(topics)
585
- .where(eq(topics.clientId, 'topic1'))
586
- .leftJoin(sessions, eq(topics.sessionId, sessions.id));
587
-
588
- expect(topic1?.sessionClientId).toBe('session1');
589
-
590
- // topic2 should not have session
591
- const topic2 = await clientDB.query.topics.findFirst({
592
- where: eq(topics.clientId, 'topic2'),
593
- with: { session: true },
594
- });
595
- expect(topic2?.session).toBeNull();
596
- });
597
- });
598
-
599
- describe('import messages', () => {
600
- it('should import messages and return correct result', async () => {
601
- const data: ImporterEntryData = {
602
- version: CURRENT_CONFIG_VERSION,
603
- messages: [
604
- {
605
- id: 'msg1',
606
- content: 'Message 1',
607
- role: 'user',
608
- createdAt: 1715186011586,
609
- updatedAt: 1715186015053,
610
- sessionId: 'session1',
611
- topicId: 'topic1',
612
- },
613
- {
614
- id: 'msg2',
615
- content: 'Message 2',
616
- role: 'assistant',
617
- createdAt: 1715186011586,
618
- updatedAt: 1715186015053,
619
- sessionId: 'session1',
620
- topicId: 'topic1',
621
- parentId: 'msg1',
622
- },
623
- ],
624
- sessions: [
625
- {
626
- id: 'session1',
627
- createdAt: '2022-05-14T18:18:10.494Z',
628
- updatedAt: '2023-01-01',
629
- type: 'agent',
630
- config: {
631
- model: 'abc',
632
- chatConfig: {} as any,
633
- params: {},
634
- systemRole: 'abc',
635
- tts: {} as any,
636
- openingQuestions: [],
637
- },
638
- meta: {
639
- title: 'Session 1',
640
- },
641
- },
642
- ],
643
- topics: [
644
- {
645
- id: 'topic1',
646
- title: 'Topic 1',
647
- createdAt: 1715186011586,
648
- updatedAt: 1715186015053,
649
- sessionId: 'session1',
650
- },
651
- ],
652
- };
653
-
654
- let result: ImportResults;
655
- await service.importData(data, {
656
- onSuccess: (res) => {
657
- result = res;
658
- },
659
- });
660
-
661
- expect(result!.messages!.added).toBe(2);
662
- expect(result!.messages!.skips).toBe(0);
663
- expect(result!.messages!.errors).toBe(0);
664
-
665
- const importedMessages = await clientDB.query.messages.findMany({
666
- where: eq(messages.userId, userId),
667
- });
668
- expect(importedMessages).toHaveLength(2);
669
- });
670
-
671
- it('should skip existing messages and return correct result', async () => {
672
- await clientDB
673
- .insert(messages)
674
- .values({
675
- clientId: 'msg1',
676
- content: 'Existing Message',
677
- role: 'user',
678
- userId,
679
- })
680
- .execute();
681
-
682
- const data: ImporterEntryData = {
683
- version: CURRENT_CONFIG_VERSION,
684
- messages: [
685
- {
686
- id: 'msg1',
687
- content: 'Message 1',
688
- role: 'user',
689
- createdAt: 1715186011586,
690
- updatedAt: 1715186015053,
691
- },
692
- {
693
- id: 'msg2',
694
- content: 'Message 2',
695
- role: 'assistant',
696
- createdAt: 1715186011586,
697
- updatedAt: 1715186015053,
698
- },
699
- ],
700
- };
701
-
702
- let result: ImportResults;
703
- await service.importData(data, {
704
- onSuccess: (res) => {
705
- result = res;
706
- },
707
- });
708
-
709
- expect(result!.messages!.added).toBe(1);
710
- expect(result!.messages!.skips).toBe(1);
711
- expect(result!.messages!.errors).toBe(0);
712
- });
713
-
714
- it('should associate imported messages with sessions and topics', async () => {
715
- const data: ImporterEntryData = {
716
- version: CURRENT_CONFIG_VERSION,
717
- sessions: [
718
- {
719
- id: 'session1',
720
- createdAt: '2022-05-14T18:18:10.494Z',
721
- updatedAt: '2023-01-01',
722
- type: 'agent',
723
- config: {
724
- model: 'abc',
725
- chatConfig: {} as any,
726
- params: {},
727
- systemRole: 'abc',
728
- tts: {} as any,
729
- openingQuestions: [],
730
- },
731
- meta: {
732
- title: 'Session 1',
733
- },
734
- },
735
- ],
736
- topics: [
737
- {
738
- id: 'topic1',
739
- title: 'Topic 1',
740
- createdAt: 1715186011586,
741
- updatedAt: 1715186015053,
742
- sessionId: 'session1',
743
- },
744
- ],
745
- messages: [
746
- {
747
- id: 'msg1',
748
- content: 'Message 1',
749
- role: 'user',
750
- createdAt: 1715186011586,
751
- updatedAt: 1715186015053,
752
- sessionId: 'session1',
753
- topicId: 'topic1',
754
- },
755
- {
756
- id: 'msg2',
757
- content: 'Message 2',
758
- role: 'assistant',
759
- createdAt: 1715186011586,
760
- updatedAt: 1715186015053,
761
- sessionId: 'session1',
762
- topicId: 'topic1',
763
- parentId: 'msg1',
764
- },
765
- {
766
- id: 'msg3',
767
- content: 'Message 3',
768
- role: 'user',
769
- createdAt: 1715186011586,
770
- updatedAt: 1715186015053,
771
- },
772
- ],
773
- };
774
-
775
- await service.importData(data);
776
-
777
- // msg1 and msg2 should be associated with session1 and topic1
778
- const [msg1, msg2] = await clientDB.query.messages.findMany({
779
- where: inArray(messages.clientId, ['msg1', 'msg2']),
780
- with: {
781
- session: true,
782
- topic: true,
783
- },
784
- });
785
-
786
- expect(msg1.session?.clientId).toBe('session1');
787
- expect(msg1.topic?.clientId).toBe('topic1');
788
- expect(msg2.session?.clientId).toBe('session1');
789
- expect(msg2.topic?.clientId).toBe('topic1');
790
-
791
- // msg3 should not have session and topic
792
- const msg3 = await clientDB.query.messages.findFirst({
793
- where: eq(messages.clientId, 'msg3'),
794
- with: {
795
- session: true,
796
- topic: true,
797
- },
798
- });
799
- expect(msg3?.session).toBeNull();
800
- expect(msg3?.topic).toBeNull();
801
- });
802
-
803
- it('should set parentId for messages', async () => {
804
- const data: ImporterEntryData = {
805
- version: CURRENT_CONFIG_VERSION,
806
- messages: [
807
- {
808
- id: 'msg1',
809
- content: 'Message 1',
810
- role: 'user',
811
- createdAt: 1715186011586,
812
- updatedAt: 1715186015053,
813
- },
814
- {
815
- id: 'msg2',
816
- content: 'Message 2',
817
- role: 'assistant',
818
- createdAt: 1715186011586,
819
- updatedAt: 1715186015053,
820
- parentId: 'msg1',
821
- },
822
- ],
823
- };
824
-
825
- await service.importData(data);
826
-
827
- const msg2 = await clientDB.query.messages.findFirst({
828
- where: eq(messages.clientId, 'msg2'),
829
- with: { parent: true },
830
- });
831
-
832
- expect(msg2?.parent?.clientId).toBe('msg1');
833
- });
834
-
835
- it('should import parentId Success', () => {});
836
- });
837
-
838
- describe('real world examples', () => {
839
- it('should import successfully', async () => {
840
- let result: ImportResults;
841
-
842
- await service.importData(
843
- {
844
- messages: [
845
- {
846
- role: 'user',
847
- content: 'hello',
848
- files: [],
849
- sessionId: 'inbox',
850
- topicId: '2wcF8yaS',
851
- createdAt: 1714236590340,
852
- id: 'DCG1G1EH',
853
- updatedAt: 1714236590340,
854
- extra: {},
855
- },
856
- {
857
- role: 'assistant',
858
- content: '...',
859
- parentId: 'DCG1G1EH',
860
- sessionId: 'inbox',
861
- topicId: '2wcF8yaS',
862
- createdAt: 1714236590441,
863
- id: 'gY41w5vQ',
864
- updatedAt: 1714236590518,
865
- error: {
866
- body: {
867
- error: {
868
- message: "model 'mixtral' not found, try pulling it first",
869
- name: 'ResponseError',
870
- status_code: 404,
871
- },
872
- provider: 'ollama',
873
- },
874
- message:
875
- 'Error requesting Ollama service, please troubleshoot or retry based on the following information',
876
- type: 'OllamaBizError',
877
- },
878
- extra: { fromModel: 'mixtral', fromProvider: 'ollama' },
879
- },
880
- {
881
- role: 'user',
882
- content: 'hello',
883
- files: [],
884
- sessionId: 'a5fefc88-f6c1-44fb-9e98-3d366b1ed589',
885
- topicId: 'v38snJ0A',
886
- createdAt: 1717080410895,
887
- id: 'qOIxEGEB',
888
- updatedAt: 1717080410895,
889
- extra: {},
890
- },
891
- {
892
- role: 'assistant',
893
- content: '...',
894
- parentId: 'qOIxEGEB',
895
- sessionId: 'a5fefc88-f6c1-44fb-9e98-3d366b1ed589',
896
- topicId: 'v38snJ0A',
897
- createdAt: 1717080410970,
898
- id: 'w28FcqY5',
899
- updatedAt: 1717080411485,
900
- error: {
901
- body: { error: { errorType: 'NoOpenAIAPIKey' }, provider: 'openai' },
902
- message: 'OpenAI API Key is empty, please add a custom OpenAI API Key',
903
- type: 'NoOpenAIAPIKey',
904
- },
905
- extra: { fromModel: 'gpt-3.5-turbo', fromProvider: 'openai' },
906
- },
907
- ],
908
- sessionGroups: [
909
- {
910
- name: 'Writter',
911
- sort: 0,
912
- createdAt: 1706114744425,
913
- id: 'XlUbvOvL',
914
- updatedAt: 1706114747468,
915
- },
916
- ],
917
- sessions: [
918
- {
919
- config: {
920
- model: 'gpt-3.5-turbo',
921
- params: {
922
- frequency_penalty: 0,
923
- presence_penalty: 0,
924
- temperature: 0.6,
925
- top_p: 1,
926
- },
927
- plugins: [],
928
- systemRole:
929
- "You are a LobeChat technical operator 🍐🐊. You now need to write a developer's guide for LobeChat as a guide for them to develop LobeChat. This guide will include several sections, and you need to output the corresponding document content based on the user's input.\n\nHere is the technical introduction of LobeChat\n\n LobeChat is an AI conversation application built with the Next.js framework. It uses a series of technology stacks to implement various functions and features.\n\n\n ## Basic Technology Stack\n\n The core technology stack of LobeChat is as follows:\n\n - **Framework**: We chose [Next.js](https://nextjs.org/), a powerful React framework that provides key features such as server-side rendering, routing framework, and Router Handler for our project.\n - **Component Library**: We use [Ant Design (antd)](https://ant.design/) as the basic component library, and introduce [lobe-ui](https://github.com/lobehub/lobe-ui) as our business component library.\n - **State Management**: We use [zustand](https://github.com/pmndrs/zustand), a lightweight and easy-to-use state management library.\n - **Network Request**: We adopt [swr](https://swr.vercel.app/), a React Hooks library for data fetching.\n - **Routing**: We directly use the routing solution provided by [Next.js](https://nextjs.org/) itself.\n - **Internationalization**: We use [i18next](https://www.i18next.com/) to implement multi-language support for the application.\n - **Styling**: We use [antd-style](https://github.com/ant-design/antd-style), a CSS-in-JS library that is compatible with Ant Design.\n - **Unit Testing**: We use [vitest](https://github.com/vitejs/vitest) for unit testing.\n\n ## Folder Directory Structure\n\n The folder directory structure of LobeChat is as follows:\n\n \\`\\`\\`bash\n src\n ├── app # Main logic and state management related code of the application\n ├── components # Reusable UI components\n ├── config # Application configuration files, including client environment variables and server environment variables\n ├── const # Used to define constants, such as action types, route names, etc.\n ├── features # Function modules related to business functions, such as Agent settings, plugin development pop-ups, etc.\n ├── hooks # Custom utility Hooks reused throughout the application\n ├── layout # Layout components of the application, such as navigation bar, sidebar, etc.\n ├── locales # Language files for internationalization\n ├── services # Encapsulated backend service interfaces, such as HTTP requests\n ├── store # Zustand store for state management\n ├── types # TypeScript type definition files\n └── utils # Common utility functions\n \\`\\`\\`\n",
930
- tts: {
931
- showAllLocaleVoice: false,
932
- sttLocale: 'auto',
933
- ttsService: 'openai',
934
- voice: { openai: 'alloy' },
935
- },
936
- chatConfig: {
937
- autoCreateTopicThreshold: 2,
938
- displayMode: 'chat',
939
- enableAutoCreateTopic: true,
940
- historyCount: 1,
941
- },
942
- openingQuestions: ['Question 1', 'Question 2'],
943
- openingMessage: 'Hello, I am [LobeChat](https://github.com/lobehub/lobe-chat).',
944
- },
945
- group: 'XlUbvOvL',
946
- meta: {
947
- avatar: '📝',
948
- description:
949
- 'LobeChat is an AI conversation application built with the Next.js framework. I will help you write the development documentation for LobeChat.',
950
- tags: [
951
- 'Development Documentation',
952
- 'Technical Introduction',
953
- 'next-js',
954
- 'react',
955
- 'lobe-chat',
956
- ],
957
- title: 'LobeChat Technical Documentation Expert',
958
- },
959
- type: 'agent',
960
- createdAt: '2024-01-24T16:43:12.164Z',
961
- id: 'a5fefc88-f6c1-44fb-9e98-3d366b1ed589',
962
- updatedAt: '2024-01-24T16:46:15.226Z',
963
- pinned: false,
964
- },
965
- ],
966
- topics: [
967
- {
968
- title: 'Default Topic',
969
- sessionId: 'inbox',
970
- createdAt: 1714236590531,
971
- id: '2wcF8yaS',
972
- updatedAt: 1714236590531,
973
- },
974
- {
975
- title: 'Default Topic',
976
- sessionId: 'a5fefc88-f6c1-44fb-9e98-3d366b1ed589',
977
- createdAt: 1717080410825,
978
- id: 'v38snJ0A',
979
- updatedAt: 1717080410825,
980
- },
981
- ],
982
- version: mockImportData.version,
983
- },
984
- { onSuccess: (res) => (result = res) },
985
- );
986
-
987
- expect(result!).toEqual({
988
- sessionGroups: { added: 1, errors: 0, skips: 0 },
989
- sessions: { added: 1, errors: 0, skips: 0 },
990
- topics: { added: 2, errors: 0, skips: 0 },
991
- messages: { added: 4, errors: 0, skips: 0 },
992
- });
993
- });
994
-
995
- it('should import real world data', async () => {
996
- let result: ImportResults;
997
-
998
- await service.importData(
999
- { ...(mockImportData.state as any), version: mockImportData.version },
1000
- {
1001
- onSuccess: (res) => {
1002
- result = res;
1003
- },
1004
- },
1005
- );
1006
-
1007
- expect(result!).toEqual({
1008
- sessionGroups: { added: 2, errors: 0, skips: 0 },
1009
- sessions: { added: 15, errors: 0, skips: 0 },
1010
- topics: { added: 4, errors: 0, skips: 0 },
1011
- messages: { added: 32, errors: 0, skips: 0 },
1012
- });
1013
- });
1014
- });
1015
- });