@talkpilot/core-db 1.3.37 → 1.3.39

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 (235) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -141
  3. package/README.md +721 -672
  4. package/dist/talkpilot/calls/calls.types.d.ts +1 -0
  5. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  6. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts +3 -0
  7. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts.map +1 -0
  8. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js +6 -0
  9. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js.map +1 -0
  10. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +39 -0
  11. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  12. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +92 -1
  13. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  14. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +4 -0
  15. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  16. package/dist/talkpilot/clientsConfig/index.d.ts +1 -0
  17. package/dist/talkpilot/clientsConfig/index.d.ts.map +1 -1
  18. package/dist/talkpilot/clientsConfig/index.js +1 -0
  19. package/dist/talkpilot/clientsConfig/index.js.map +1 -1
  20. package/jest.config.js +20 -20
  21. package/package.json +46 -46
  22. package/src/__tests__/setup.ts +20 -20
  23. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  24. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  25. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  26. package/src/bulkWrite/index.ts +2 -2
  27. package/src/config.ts +9 -9
  28. package/src/configuration/index.ts +17 -17
  29. package/src/configuration/internalModels/index.ts +3 -3
  30. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  31. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  32. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  33. package/src/configuration/models/index.ts +25 -25
  34. package/src/configuration/models/models.constants.ts +13 -13
  35. package/src/configuration/models/models.getters.ts +53 -53
  36. package/src/configuration/models/models.types.ts +79 -79
  37. package/src/configuration/mongodb-client.ts +62 -62
  38. package/src/configuration/prompts/index.ts +2 -2
  39. package/src/configuration/prompts/prompts.getters.ts +49 -49
  40. package/src/configuration/prompts/prompts.types.ts +11 -11
  41. package/src/connection.ts +81 -81
  42. package/src/index.ts +42 -42
  43. package/src/municipal/__tests__/validation.spec.ts +62 -62
  44. package/src/municipal/cities/cities.getters.ts +50 -50
  45. package/src/municipal/cities/cities.types.ts +11 -11
  46. package/src/municipal/cities/index.ts +2 -2
  47. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  48. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  49. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  50. package/src/municipal/departmentsSubjects/index.ts +9 -9
  51. package/src/municipal/index.ts +22 -22
  52. package/src/municipal/mongodb-client.ts +61 -61
  53. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  54. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  55. package/src/municipal/muniIssues/index.ts +17 -17
  56. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  57. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  58. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  59. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  60. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  61. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  62. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  63. package/src/municipal/streets/index.ts +2 -2
  64. package/src/municipal/streets/streets.getters.ts +140 -140
  65. package/src/municipal/streets/streets.types.ts +19 -19
  66. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  67. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  68. package/src/municipal/systemInstructions/index.ts +7 -7
  69. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  70. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  71. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  72. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  73. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  74. package/src/municipal/tickets/index.ts +9 -9
  75. package/src/municipal/tickets/tickets.constants.ts +8 -8
  76. package/src/municipal/tickets/tickets.getters.ts +121 -121
  77. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  78. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  79. package/src/municipal/tickets/tickets.types.ts +54 -54
  80. package/src/municipal/utils/types.ts +11 -11
  81. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  82. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  83. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  84. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  85. package/src/talkpilot/agents/agents.getters.ts +34 -34
  86. package/src/talkpilot/agents/agents.types.ts +14 -14
  87. package/src/talkpilot/agents/index.ts +2 -2
  88. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  89. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  90. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  91. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  92. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  93. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  94. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  95. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  96. package/src/talkpilot/calls/calls.constants.ts +49 -49
  97. package/src/talkpilot/calls/calls.getters.ts +277 -277
  98. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  99. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  100. package/src/talkpilot/calls/calls.types.ts +134 -133
  101. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  102. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  103. package/src/talkpilot/calls/index.ts +6 -6
  104. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  105. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  106. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  107. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  108. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  109. package/src/talkpilot/clients/clients.getters.ts +16 -16
  110. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  111. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  112. package/src/talkpilot/clients/clients.types.ts +18 -18
  113. package/src/talkpilot/clients/index.ts +4 -4
  114. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +318 -0
  115. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  116. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -0
  117. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +116 -2
  118. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +4 -0
  119. package/src/talkpilot/clientsConfig/index.ts +3 -2
  120. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  121. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  122. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  123. package/src/talkpilot/contextNotes/index.ts +2 -2
  124. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  125. package/src/talkpilot/flows/flows.getter.ts +14 -14
  126. package/src/talkpilot/flows/flows.schema.ts +155 -155
  127. package/src/talkpilot/flows/flows.types.ts +189 -189
  128. package/src/talkpilot/flows/index.ts +2 -2
  129. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  130. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  131. package/src/talkpilot/groups/groups.getters.ts +30 -30
  132. package/src/talkpilot/groups/groups.types.ts +29 -29
  133. package/src/talkpilot/groups/index.ts +3 -3
  134. package/src/talkpilot/groups/phone.utils.ts +46 -46
  135. package/src/talkpilot/index.ts +31 -31
  136. package/src/talkpilot/leads/index.ts +2 -2
  137. package/src/talkpilot/leads/leads.getter.ts +6 -6
  138. package/src/talkpilot/leads/leads.schema.ts +33 -33
  139. package/src/talkpilot/leads/leads.types.ts +20 -20
  140. package/src/talkpilot/mongodb-client.ts +78 -78
  141. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  142. package/src/talkpilot/phone_numbers/index.ts +2 -2
  143. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  144. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  145. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  146. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  147. package/src/talkpilot/plans/index.ts +2 -2
  148. package/src/talkpilot/plans/plans.getters.ts +132 -132
  149. package/src/talkpilot/plans/plans.types.ts +89 -89
  150. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  151. package/src/talkpilot/products/index.ts +2 -2
  152. package/src/talkpilot/products/products.getters.ts +12 -12
  153. package/src/talkpilot/products/products.types.ts +9 -9
  154. package/src/talkpilot/results/index.ts +7 -7
  155. package/src/talkpilot/results/results.getter.ts +39 -39
  156. package/src/talkpilot/results/results.schema.ts +25 -25
  157. package/src/talkpilot/results/results.types.ts +34 -34
  158. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  159. package/src/talkpilot/retry_analyze/index.ts +2 -2
  160. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  161. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  162. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  163. package/src/talkpilot/sessions/index.ts +2 -2
  164. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  165. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  166. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  167. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  168. package/src/talkpilot/subscriptions/index.ts +3 -3
  169. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  170. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  171. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  172. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  173. package/src/talkpilot/utils/query.utils.ts +21 -21
  174. package/src/test-utils/db-utils.ts +33 -33
  175. package/src/test-utils/factories/index.ts +16 -16
  176. package/src/test-utils/factories/municipal/cities.ts +16 -16
  177. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  178. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  179. package/src/test-utils/factories/municipal/streets.ts +22 -22
  180. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  181. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  182. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  183. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  184. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  185. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  186. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  187. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  188. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  189. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  190. package/src/test-utils/factories/websitalk/scans.ts +24 -24
  191. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  192. package/src/utils/date.utils.ts +126 -126
  193. package/src/utils/shared.types.ts +4 -4
  194. package/src/utils/validation.ts +23 -23
  195. package/src/websitalk/index.ts +16 -16
  196. package/src/websitalk/mongodb-client.ts +61 -61
  197. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  198. package/src/websitalk/scans/index.ts +4 -4
  199. package/src/websitalk/scans/scans.constants.ts +15 -15
  200. package/src/websitalk/scans/scans.getters.ts +160 -160
  201. package/src/websitalk/scans/scans.types.ts +45 -45
  202. package/src/websitalk/scans/scans.utils.ts +5 -5
  203. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  204. package/src/websitalk/websiteUrls/index.ts +2 -2
  205. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  206. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  207. package/tsconfig.json +23 -23
  208. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  209. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  210. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  211. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  212. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  213. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  214. package/dist/municipal/streets/streets.setters.js +0 -15
  215. package/dist/municipal/streets/streets.setters.js.map +0 -1
  216. package/dist/reconcile/index.d.ts +0 -5
  217. package/dist/reconcile/index.d.ts.map +0 -1
  218. package/dist/reconcile/index.js +0 -21
  219. package/dist/reconcile/index.js.map +0 -1
  220. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  221. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  222. package/dist/reconcile/reconcile.diff.js +0 -36
  223. package/dist/reconcile/reconcile.diff.js.map +0 -1
  224. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  225. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  226. package/dist/reconcile/reconcile.execute.js +0 -20
  227. package/dist/reconcile/reconcile.execute.js.map +0 -1
  228. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  229. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  230. package/dist/reconcile/reconcile.ops.js +0 -24
  231. package/dist/reconcile/reconcile.ops.js.map +0 -1
  232. package/dist/reconcile/reconcile.types.d.ts +0 -32
  233. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  234. package/dist/reconcile/reconcile.types.js +0 -3
  235. package/dist/reconcile/reconcile.types.js.map +0 -1
@@ -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";