@talkpilot/core-db 1.3.48 → 1.3.49

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 (227) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/AGENTS.md +49 -49
  3. package/DEVELOPMENT.md +141 -141
  4. package/README.md +778 -777
  5. package/dist/talkpilot/clients/clients.quota.constants.d.ts +2 -0
  6. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +1 -0
  7. package/dist/talkpilot/clients/clients.quota.constants.js +5 -0
  8. package/dist/talkpilot/clients/clients.quota.constants.js.map +1 -0
  9. package/dist/talkpilot/clients/clients.quota.utils.d.ts +8 -0
  10. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +1 -0
  11. package/dist/talkpilot/clients/clients.quota.utils.js +45 -0
  12. package/dist/talkpilot/clients/clients.quota.utils.js.map +1 -0
  13. package/dist/talkpilot/flows/flows.getter.d.ts +4 -1
  14. package/dist/talkpilot/flows/flows.getter.d.ts.map +1 -1
  15. package/dist/talkpilot/flows/flows.getter.js +12 -1
  16. package/dist/talkpilot/flows/flows.getter.js.map +1 -1
  17. package/dist/talkpilot/flows/flows.schema.d.ts +31 -0
  18. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  19. package/dist/talkpilot/flows/flows.schema.js +25 -0
  20. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  21. package/dist/talkpilot/flows/flows.types.d.ts +14 -0
  22. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  23. package/dist/talkpilot/flows/index.d.ts +1 -1
  24. package/dist/talkpilot/flows/index.d.ts.map +1 -1
  25. package/dist/talkpilot/flows/index.js +3 -1
  26. package/dist/talkpilot/flows/index.js.map +1 -1
  27. package/jest.config.js +20 -20
  28. package/package.json +46 -46
  29. package/src/__tests__/setup.ts +20 -20
  30. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  31. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  32. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  33. package/src/bulkWrite/index.ts +2 -2
  34. package/src/config.ts +9 -9
  35. package/src/configuration/index.ts +17 -17
  36. package/src/configuration/internalModels/index.ts +3 -3
  37. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  38. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  39. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  40. package/src/configuration/models/index.ts +25 -25
  41. package/src/configuration/models/models.constants.ts +13 -13
  42. package/src/configuration/models/models.getters.ts +53 -53
  43. package/src/configuration/models/models.types.ts +79 -79
  44. package/src/configuration/mongodb-client.ts +62 -62
  45. package/src/configuration/prompts/index.ts +2 -2
  46. package/src/configuration/prompts/prompts.getters.ts +49 -49
  47. package/src/configuration/prompts/prompts.types.ts +11 -11
  48. package/src/connection.ts +81 -81
  49. package/src/index.ts +46 -46
  50. package/src/municipal/__tests__/validation.spec.ts +62 -62
  51. package/src/municipal/cities/cities.getters.ts +50 -50
  52. package/src/municipal/cities/cities.types.ts +11 -11
  53. package/src/municipal/cities/index.ts +2 -2
  54. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  55. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  56. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  57. package/src/municipal/departmentsSubjects/index.ts +9 -9
  58. package/src/municipal/index.ts +22 -22
  59. package/src/municipal/mongodb-client.ts +61 -61
  60. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  61. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  62. package/src/municipal/muniIssues/index.ts +17 -17
  63. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  64. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  65. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  66. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  67. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  68. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  69. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  70. package/src/municipal/streets/index.ts +2 -2
  71. package/src/municipal/streets/streets.getters.ts +140 -140
  72. package/src/municipal/streets/streets.types.ts +19 -19
  73. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  74. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  75. package/src/municipal/systemInstructions/index.ts +7 -7
  76. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  77. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  78. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  79. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  80. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  81. package/src/municipal/tickets/index.ts +9 -9
  82. package/src/municipal/tickets/tickets.constants.ts +8 -8
  83. package/src/municipal/tickets/tickets.getters.ts +121 -121
  84. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  85. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  86. package/src/municipal/tickets/tickets.types.ts +54 -54
  87. package/src/municipal/utils/types.ts +11 -11
  88. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  89. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  90. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  91. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  92. package/src/talkpilot/agents/agents.getters.ts +34 -34
  93. package/src/talkpilot/agents/agents.types.ts +14 -14
  94. package/src/talkpilot/agents/index.ts +2 -2
  95. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  96. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  97. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  98. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  99. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  100. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  101. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  102. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  103. package/src/talkpilot/calls/calls.constants.ts +49 -49
  104. package/src/talkpilot/calls/calls.getters.ts +277 -277
  105. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  106. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  107. package/src/talkpilot/calls/calls.types.ts +149 -149
  108. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  109. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  110. package/src/talkpilot/calls/index.ts +6 -6
  111. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  112. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  113. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  114. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  115. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  116. package/src/talkpilot/clients/clients.getters.ts +16 -16
  117. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  118. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  119. package/src/talkpilot/clients/clients.types.ts +18 -18
  120. package/src/talkpilot/clients/index.ts +4 -4
  121. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  122. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  123. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  124. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  125. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -136
  126. package/src/talkpilot/clientsConfig/index.ts +3 -3
  127. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  128. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  129. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  130. package/src/talkpilot/contextNotes/index.ts +2 -2
  131. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +124 -99
  132. package/src/talkpilot/flows/flows.getter.ts +34 -14
  133. package/src/talkpilot/flows/flows.schema.ts +180 -155
  134. package/src/talkpilot/flows/flows.types.ts +211 -189
  135. package/src/talkpilot/flows/index.ts +7 -2
  136. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  137. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  138. package/src/talkpilot/groups/groups.getters.ts +30 -30
  139. package/src/talkpilot/groups/groups.types.ts +29 -29
  140. package/src/talkpilot/groups/index.ts +3 -3
  141. package/src/talkpilot/groups/phone.utils.ts +46 -46
  142. package/src/talkpilot/index.ts +31 -31
  143. package/src/talkpilot/leads/index.ts +2 -2
  144. package/src/talkpilot/leads/leads.getter.ts +6 -6
  145. package/src/talkpilot/leads/leads.schema.ts +33 -33
  146. package/src/talkpilot/leads/leads.types.ts +20 -20
  147. package/src/talkpilot/mongodb-client.ts +78 -78
  148. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  149. package/src/talkpilot/phone_numbers/index.ts +2 -2
  150. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  151. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  152. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  153. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  154. package/src/talkpilot/plans/index.ts +2 -2
  155. package/src/talkpilot/plans/plans.getters.ts +132 -132
  156. package/src/talkpilot/plans/plans.types.ts +89 -89
  157. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  158. package/src/talkpilot/products/index.ts +2 -2
  159. package/src/talkpilot/products/products.getters.ts +12 -12
  160. package/src/talkpilot/products/products.types.ts +9 -9
  161. package/src/talkpilot/results/index.ts +7 -7
  162. package/src/talkpilot/results/results.getter.ts +39 -39
  163. package/src/talkpilot/results/results.schema.ts +25 -25
  164. package/src/talkpilot/results/results.types.ts +34 -34
  165. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  166. package/src/talkpilot/retry_analyze/index.ts +2 -2
  167. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  168. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  169. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  170. package/src/talkpilot/sessions/index.ts +2 -2
  171. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  172. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  173. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  174. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  175. package/src/talkpilot/subscriptions/index.ts +3 -3
  176. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  177. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  178. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  179. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  180. package/src/talkpilot/utils/query.utils.ts +21 -21
  181. package/src/test-utils/db-utils.ts +33 -33
  182. package/src/test-utils/factories/index.ts +18 -18
  183. package/src/test-utils/factories/municipal/cities.ts +16 -16
  184. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  185. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  186. package/src/test-utils/factories/municipal/streets.ts +22 -22
  187. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  188. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  189. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  190. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  191. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  192. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  193. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  194. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  195. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  196. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  197. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  198. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  199. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  200. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  201. package/src/utils/date.utils.ts +126 -126
  202. package/src/utils/shared.types.ts +4 -4
  203. package/src/utils/validation.ts +23 -23
  204. package/src/websitalk/index.ts +18 -18
  205. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
  206. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  207. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
  208. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
  209. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
  210. package/src/websitalk/mongodb-client.ts +61 -61
  211. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +193 -193
  212. package/src/websitalk/scanResources/index.ts +4 -4
  213. package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
  214. package/src/websitalk/scanResources/scanResources.getters.ts +102 -102
  215. package/src/websitalk/scanResources/scanResources.types.ts +90 -90
  216. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  217. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  218. package/src/websitalk/scans/index.ts +4 -4
  219. package/src/websitalk/scans/scans.constants.ts +15 -15
  220. package/src/websitalk/scans/scans.getters.ts +166 -166
  221. package/src/websitalk/scans/scans.types.ts +54 -54
  222. package/src/websitalk/scans/scans.utils.ts +5 -5
  223. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  224. package/src/websitalk/websiteUrls/index.ts +2 -2
  225. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  226. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  227. package/tsconfig.json +23 -23
@@ -1,38 +1,38 @@
1
- import {
2
- getFlowsCollection,
3
- getSessionsCollection,
4
- getResultsCollection,
5
- getLeadsCollection,
6
- getPhoneNumbersCollection,
7
- getClientsCollection,
8
- ObjectId,
9
- getPlansCollection,
10
- getSubscriptionsCollection,
11
- } from "../index";
12
-
13
- import { ObjectId as MongoObjectId } from "mongodb";
14
-
15
- describe("talkpilot core/db", () => {
16
- it.each([
17
- ["flows", getFlowsCollection],
18
- ["sessions", getSessionsCollection],
19
- ["results", getResultsCollection],
20
- ["leads", getLeadsCollection],
21
- ["phone_numbers", getPhoneNumbersCollection],
22
- ["clients", getClientsCollection],
23
- ["plans", getPlansCollection],
24
- ["subscriptions", getSubscriptionsCollection],
25
- ])('%s collection helper returns a "%s" collection', (name, getter) => {
26
- expect(getter().collectionName).toBe(name);
27
- });
28
-
29
- it("ObjectId re-export behaves like mongodb.ObjectId", () => {
30
- expect(ObjectId).toBe(MongoObjectId);
31
-
32
- const id = new ObjectId();
33
-
34
- expect(id).toBeInstanceOf(MongoObjectId);
35
- expect(ObjectId.isValid(id)).toBe(true);
36
- expect(id.toHexString()).toHaveLength(24);
37
- });
38
- });
1
+ import {
2
+ getFlowsCollection,
3
+ getSessionsCollection,
4
+ getResultsCollection,
5
+ getLeadsCollection,
6
+ getPhoneNumbersCollection,
7
+ getClientsCollection,
8
+ ObjectId,
9
+ getPlansCollection,
10
+ getSubscriptionsCollection,
11
+ } from "../index";
12
+
13
+ import { ObjectId as MongoObjectId } from "mongodb";
14
+
15
+ describe("talkpilot core/db", () => {
16
+ it.each([
17
+ ["flows", getFlowsCollection],
18
+ ["sessions", getSessionsCollection],
19
+ ["results", getResultsCollection],
20
+ ["leads", getLeadsCollection],
21
+ ["phone_numbers", getPhoneNumbersCollection],
22
+ ["clients", getClientsCollection],
23
+ ["plans", getPlansCollection],
24
+ ["subscriptions", getSubscriptionsCollection],
25
+ ])('%s collection helper returns a "%s" collection', (name, getter) => {
26
+ expect(getter().collectionName).toBe(name);
27
+ });
28
+
29
+ it("ObjectId re-export behaves like mongodb.ObjectId", () => {
30
+ expect(ObjectId).toBe(MongoObjectId);
31
+
32
+ const id = new ObjectId();
33
+
34
+ expect(id).toBeInstanceOf(MongoObjectId);
35
+ expect(ObjectId.isValid(id)).toBe(true);
36
+ expect(id.toHexString()).toHaveLength(24);
37
+ });
38
+ });
@@ -1,18 +1,18 @@
1
- import { getDb } from "../index";
2
-
3
- describe("MongoDBClient", () => {
4
- it("should have a connected database instance from global setup", () => {
5
- const db = getDb();
6
- expect(db).toBeDefined();
7
- expect(db.databaseName).toBe("test"); // Based on our setup.ts
8
- });
9
-
10
- it("should report as connected", async () => {
11
- // Note: mongodbClient.connect() was called in global setup
12
- // but through setDb, not necessarily through the client singleton instance
13
- // since initTestDb calls setDb directly.
14
-
15
- // In a real scenario, you'd use the client.
16
- expect(true).toBe(true);
17
- });
18
- });
1
+ import { getDb } from "../index";
2
+
3
+ describe("MongoDBClient", () => {
4
+ it("should have a connected database instance from global setup", () => {
5
+ const db = getDb();
6
+ expect(db).toBeDefined();
7
+ expect(db.databaseName).toBe("test"); // Based on our setup.ts
8
+ });
9
+
10
+ it("should report as connected", async () => {
11
+ // Note: mongodbClient.connect() was called in global setup
12
+ // but through setDb, not necessarily through the client singleton instance
13
+ // since initTestDb calls setDb directly.
14
+
15
+ // In a real scenario, you'd use the client.
16
+ expect(true).toBe(true);
17
+ });
18
+ });
@@ -1,68 +1,68 @@
1
- import { mongodbClient } from "../mongodb-client";
2
- import { MongoClient } from "mongodb";
3
-
4
- describe("MongoDBClient Validation", () => {
5
- const originalEnv = process.env;
6
-
7
- beforeEach(() => {
8
- process.env = { ...originalEnv };
9
- delete process.env.MONGO_URI;
10
- delete process.env.MONGODB_URI;
11
- delete process.env.MONGODB_DB_NAME;
12
-
13
- // Force reset singleton state
14
- (mongodbClient as any).client = null;
15
- (mongodbClient as any).db = null;
16
- });
17
-
18
- afterAll(async () => {
19
- process.env = originalEnv;
20
- // Ensure we are disconnected
21
- await mongodbClient.disconnect();
22
- });
23
-
24
- it("should throw error if no URI is provided", async () => {
25
- await expect(mongodbClient.connect()).rejects.toThrow(
26
- "[core-db] Configuration Error: 'MONGO_URI' is missing",
27
- );
28
- });
29
-
30
- it("should throw error if an invalid URI format is provided", async () => {
31
- await expect(mongodbClient.connect("not-a-mongo-uri")).rejects.toThrow(
32
- "[core-db] Connection Error: The provided MongoDB URI is invalid",
33
- );
34
- });
35
-
36
- it("should throw error if URI is valid but database name is missing", async () => {
37
- // We mock the actual MongoClient connection so it doesn't try to hit a real network
38
- const connectSpy = jest
39
- .spyOn(MongoClient.prototype, "connect")
40
- .mockResolvedValue({} as any);
41
-
42
- const uriWithoutDb = "mongodb://127.0.0.1:27017";
43
- await expect(mongodbClient.connect(uriWithoutDb)).rejects.toThrow(
44
- "[core-db] Database name not specified",
45
- );
46
-
47
- connectSpy.mockRestore();
48
- });
49
-
50
- it("should succeed when valid URI and DB name are provided", async () => {
51
- const mockDb = { databaseName: "my-db" };
52
- const connectSpy = jest
53
- .spyOn(MongoClient.prototype, "connect")
54
- .mockResolvedValue({} as any);
55
- const dbSpy = jest
56
- .spyOn(MongoClient.prototype, "db")
57
- .mockReturnValue(mockDb as any);
58
-
59
- const validUri = "mongodb://127.0.0.1:27017/my-db";
60
- await mongodbClient.connect(validUri);
61
-
62
- expect(mongodbClient.getDb()).toBeDefined();
63
- expect(mongodbClient.getDb().databaseName).toBe("my-db");
64
-
65
- connectSpy.mockRestore();
66
- dbSpy.mockRestore();
67
- });
68
- });
1
+ import { mongodbClient } from "../mongodb-client";
2
+ import { MongoClient } from "mongodb";
3
+
4
+ describe("MongoDBClient Validation", () => {
5
+ const originalEnv = process.env;
6
+
7
+ beforeEach(() => {
8
+ process.env = { ...originalEnv };
9
+ delete process.env.MONGO_URI;
10
+ delete process.env.MONGODB_URI;
11
+ delete process.env.MONGODB_DB_NAME;
12
+
13
+ // Force reset singleton state
14
+ (mongodbClient as any).client = null;
15
+ (mongodbClient as any).db = null;
16
+ });
17
+
18
+ afterAll(async () => {
19
+ process.env = originalEnv;
20
+ // Ensure we are disconnected
21
+ await mongodbClient.disconnect();
22
+ });
23
+
24
+ it("should throw error if no URI is provided", async () => {
25
+ await expect(mongodbClient.connect()).rejects.toThrow(
26
+ "[core-db] Configuration Error: 'MONGO_URI' is missing",
27
+ );
28
+ });
29
+
30
+ it("should throw error if an invalid URI format is provided", async () => {
31
+ await expect(mongodbClient.connect("not-a-mongo-uri")).rejects.toThrow(
32
+ "[core-db] Connection Error: The provided MongoDB URI is invalid",
33
+ );
34
+ });
35
+
36
+ it("should throw error if URI is valid but database name is missing", async () => {
37
+ // We mock the actual MongoClient connection so it doesn't try to hit a real network
38
+ const connectSpy = jest
39
+ .spyOn(MongoClient.prototype, "connect")
40
+ .mockResolvedValue({} as any);
41
+
42
+ const uriWithoutDb = "mongodb://127.0.0.1:27017";
43
+ await expect(mongodbClient.connect(uriWithoutDb)).rejects.toThrow(
44
+ "[core-db] Database name not specified",
45
+ );
46
+
47
+ connectSpy.mockRestore();
48
+ });
49
+
50
+ it("should succeed when valid URI and DB name are provided", async () => {
51
+ const mockDb = { databaseName: "my-db" };
52
+ const connectSpy = jest
53
+ .spyOn(MongoClient.prototype, "connect")
54
+ .mockResolvedValue({} as any);
55
+ const dbSpy = jest
56
+ .spyOn(MongoClient.prototype, "db")
57
+ .mockReturnValue(mockDb as any);
58
+
59
+ const validUri = "mongodb://127.0.0.1:27017/my-db";
60
+ await mongodbClient.connect(validUri);
61
+
62
+ expect(mongodbClient.getDb()).toBeDefined();
63
+ expect(mongodbClient.getDb().databaseName).toBe("my-db");
64
+
65
+ connectSpy.mockRestore();
66
+ dbSpy.mockRestore();
67
+ });
68
+ });
@@ -1,29 +1,29 @@
1
- import { findAgents } from "../agents.getters";
2
- import { setDb } from "../../index";
3
- import { Db, Collection } from "mongodb";
4
- import { createAgent } from "../../../test-utils/factories";
5
-
6
- describe("agents getters", () => {
7
- let mockDb: Partial<Db>;
8
- let mockCollection: Partial<Collection>;
9
-
10
- beforeEach(() => {
11
- const mockAgent = createAgent({ name: "Agent Smith" });
12
- mockCollection = {
13
- find: jest.fn().mockReturnValue({
14
- toArray: jest.fn().mockResolvedValue([mockAgent]),
15
- }),
16
- };
17
- mockDb = {
18
- collection: jest.fn().mockReturnValue(mockCollection),
19
- };
20
- setDb(mockDb as Db);
21
- });
22
-
23
- it("findAgents should return agents", async () => {
24
- const result = await findAgents();
25
-
26
- expect(mockDb.collection).toHaveBeenCalledWith("agents");
27
- expect(result[0].name).toBe("Agent Smith");
28
- });
29
- });
1
+ import { findAgents } from "../agents.getters";
2
+ import { setDb } from "../../index";
3
+ import { Db, Collection } from "mongodb";
4
+ import { createAgent } from "../../../test-utils/factories";
5
+
6
+ describe("agents getters", () => {
7
+ let mockDb: Partial<Db>;
8
+ let mockCollection: Partial<Collection>;
9
+
10
+ beforeEach(() => {
11
+ const mockAgent = createAgent({ name: "Agent Smith" });
12
+ mockCollection = {
13
+ find: jest.fn().mockReturnValue({
14
+ toArray: jest.fn().mockResolvedValue([mockAgent]),
15
+ }),
16
+ };
17
+ mockDb = {
18
+ collection: jest.fn().mockReturnValue(mockCollection),
19
+ };
20
+ setDb(mockDb as Db);
21
+ });
22
+
23
+ it("findAgents should return agents", async () => {
24
+ const result = await findAgents();
25
+
26
+ expect(mockDb.collection).toHaveBeenCalledWith("agents");
27
+ expect(result[0].name).toBe("Agent Smith");
28
+ });
29
+ });
@@ -1,34 +1,34 @@
1
- import { getDb, Agent, ObjectId } from "../index";
2
-
3
- export const getAgentsCollection = () => {
4
- return getDb().collection<Agent>("agents");
5
- };
6
-
7
- export const findAgents = async (filter: any = {}) => {
8
- return getAgentsCollection().find(filter).toArray();
9
- };
10
-
11
- export const findAgentById = (agentId: string) => {
12
- return getAgentsCollection().findOne({ _id: new ObjectId(agentId) });
13
- };
14
-
15
- export const findAgentsByClientId = (clientId: string) => {
16
- return getAgentsCollection().find({ clientId }).toArray();
17
- };
18
-
19
- export const createAgent = async (agent: Agent) => {
20
- const { insertedId } = await getAgentsCollection().insertOne(agent);
21
- return findAgentById(String(insertedId));
22
- };
23
-
24
- export const updateAgent = (agentId: string, data: Partial<Agent>) => {
25
- return getAgentsCollection().findOneAndUpdate(
26
- { _id: new ObjectId(agentId) },
27
- { $set: data },
28
- { returnDocument: "after" },
29
- );
30
- };
31
-
32
- export const removeAgent = (agentId: string) => {
33
- return getAgentsCollection().deleteOne({ _id: new ObjectId(agentId) });
34
- };
1
+ import { getDb, Agent, ObjectId } from "../index";
2
+
3
+ export const getAgentsCollection = () => {
4
+ return getDb().collection<Agent>("agents");
5
+ };
6
+
7
+ export const findAgents = async (filter: any = {}) => {
8
+ return getAgentsCollection().find(filter).toArray();
9
+ };
10
+
11
+ export const findAgentById = (agentId: string) => {
12
+ return getAgentsCollection().findOne({ _id: new ObjectId(agentId) });
13
+ };
14
+
15
+ export const findAgentsByClientId = (clientId: string) => {
16
+ return getAgentsCollection().find({ clientId }).toArray();
17
+ };
18
+
19
+ export const createAgent = async (agent: Agent) => {
20
+ const { insertedId } = await getAgentsCollection().insertOne(agent);
21
+ return findAgentById(String(insertedId));
22
+ };
23
+
24
+ export const updateAgent = (agentId: string, data: Partial<Agent>) => {
25
+ return getAgentsCollection().findOneAndUpdate(
26
+ { _id: new ObjectId(agentId) },
27
+ { $set: data },
28
+ { returnDocument: "after" },
29
+ );
30
+ };
31
+
32
+ export const removeAgent = (agentId: string) => {
33
+ return getAgentsCollection().deleteOne({ _id: new ObjectId(agentId) });
34
+ };
@@ -1,14 +1,14 @@
1
- import { WithId } from "mongodb";
2
-
3
- export type Agent = {
4
- name: string;
5
- language: string;
6
- voice: string;
7
- instructions: string;
8
- labels: string[];
9
- clientId: string;
10
- role: string;
11
- gender: "male" | "female";
12
- };
13
-
14
- export type AgentDoc = WithId<Agent>;
1
+ import { WithId } from "mongodb";
2
+
3
+ export type Agent = {
4
+ name: string;
5
+ language: string;
6
+ voice: string;
7
+ instructions: string;
8
+ labels: string[];
9
+ clientId: string;
10
+ role: string;
11
+ gender: "male" | "female";
12
+ };
13
+
14
+ export type AgentDoc = WithId<Agent>;
@@ -1,2 +1,2 @@
1
- export * from "./agents.getters";
2
- export * from "./agents.types";
1
+ export * from "./agents.getters";
2
+ export * from "./agents.types";