@talkpilot/core-db 1.3.39 → 1.3.41

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 (273) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -141
  3. package/README.md +706 -721
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/talkpilot/calls/calls.types.d.ts +0 -1
  9. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  10. package/dist/talkpilot/clients/clients.quota.constants.d.ts +2 -0
  11. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +1 -0
  12. package/dist/talkpilot/clients/clients.quota.constants.js +5 -0
  13. package/dist/talkpilot/clients/clients.quota.constants.js.map +1 -0
  14. package/dist/talkpilot/clients/clients.quota.utils.d.ts +8 -0
  15. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +1 -0
  16. package/dist/talkpilot/clients/clients.quota.utils.js +45 -0
  17. package/dist/talkpilot/clients/clients.quota.utils.js.map +1 -0
  18. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +0 -39
  19. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  20. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +1 -92
  21. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  22. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +0 -4
  23. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  24. package/dist/talkpilot/clientsConfig/index.d.ts +0 -1
  25. package/dist/talkpilot/clientsConfig/index.d.ts.map +1 -1
  26. package/dist/talkpilot/clientsConfig/index.js +0 -1
  27. package/dist/talkpilot/clientsConfig/index.js.map +1 -1
  28. package/dist/test-utils/factories/index.d.ts +1 -0
  29. package/dist/test-utils/factories/index.d.ts.map +1 -1
  30. package/dist/test-utils/factories/index.js +1 -0
  31. package/dist/test-utils/factories/index.js.map +1 -1
  32. package/dist/test-utils/factories/websitalk/knowledgeDocuments.d.ts +5 -0
  33. package/dist/test-utils/factories/websitalk/knowledgeDocuments.d.ts.map +1 -0
  34. package/dist/test-utils/factories/websitalk/knowledgeDocuments.js +23 -0
  35. package/dist/test-utils/factories/websitalk/knowledgeDocuments.js.map +1 -0
  36. package/dist/test-utils/factories/websitalk/scanResources.d.ts +5 -0
  37. package/dist/test-utils/factories/websitalk/scanResources.d.ts.map +1 -0
  38. package/dist/test-utils/factories/websitalk/scanResources.js +24 -0
  39. package/dist/test-utils/factories/websitalk/scanResources.js.map +1 -0
  40. package/dist/websitalk/index.d.ts +1 -0
  41. package/dist/websitalk/index.d.ts.map +1 -1
  42. package/dist/websitalk/index.js +1 -0
  43. package/dist/websitalk/index.js.map +1 -1
  44. package/dist/websitalk/knowledgeDocuments/index.d.ts +4 -0
  45. package/dist/websitalk/knowledgeDocuments/index.d.ts.map +1 -0
  46. package/dist/websitalk/knowledgeDocuments/index.js +20 -0
  47. package/dist/websitalk/knowledgeDocuments/index.js.map +1 -0
  48. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.d.ts +14 -0
  49. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.d.ts.map +1 -0
  50. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.js +15 -0
  51. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.js.map +1 -0
  52. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.d.ts +10 -0
  53. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.d.ts.map +1 -0
  54. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.js +61 -0
  55. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.js.map +1 -0
  56. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.d.ts +28 -0
  57. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.d.ts.map +1 -0
  58. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.js +3 -0
  59. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.js.map +1 -0
  60. package/dist/websitalk/scanResources/index.d.ts +5 -0
  61. package/dist/websitalk/scanResources/index.d.ts.map +1 -0
  62. package/dist/websitalk/scanResources/index.js +21 -0
  63. package/dist/websitalk/scanResources/index.js.map +1 -0
  64. package/dist/websitalk/scanResources/scanResources.constants.d.ts +38 -0
  65. package/dist/websitalk/scanResources/scanResources.constants.d.ts.map +1 -0
  66. package/dist/websitalk/scanResources/scanResources.constants.js +47 -0
  67. package/dist/websitalk/scanResources/scanResources.constants.js.map +1 -0
  68. package/dist/websitalk/scanResources/scanResources.getters.d.ts +8 -0
  69. package/dist/websitalk/scanResources/scanResources.getters.d.ts.map +1 -0
  70. package/dist/websitalk/scanResources/scanResources.getters.js +68 -0
  71. package/dist/websitalk/scanResources/scanResources.getters.js.map +1 -0
  72. package/dist/websitalk/scanResources/scanResources.types.d.ts +60 -0
  73. package/dist/websitalk/scanResources/scanResources.types.d.ts.map +1 -0
  74. package/dist/websitalk/scanResources/scanResources.types.js +3 -0
  75. package/dist/websitalk/scanResources/scanResources.types.js.map +1 -0
  76. package/dist/websitalk/scanResources/scanResources.utils.d.ts +7 -0
  77. package/dist/websitalk/scanResources/scanResources.utils.d.ts.map +1 -0
  78. package/dist/websitalk/scanResources/scanResources.utils.js +20 -0
  79. package/dist/websitalk/scanResources/scanResources.utils.js.map +1 -0
  80. package/jest.config.js +20 -20
  81. package/package.json +46 -46
  82. package/src/__tests__/setup.ts +20 -20
  83. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  84. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  85. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  86. package/src/bulkWrite/index.ts +2 -2
  87. package/src/config.ts +9 -9
  88. package/src/configuration/index.ts +17 -17
  89. package/src/configuration/internalModels/index.ts +3 -3
  90. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  91. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  92. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  93. package/src/configuration/models/index.ts +25 -25
  94. package/src/configuration/models/models.constants.ts +13 -13
  95. package/src/configuration/models/models.getters.ts +53 -53
  96. package/src/configuration/models/models.types.ts +79 -79
  97. package/src/configuration/mongodb-client.ts +62 -62
  98. package/src/configuration/prompts/index.ts +2 -2
  99. package/src/configuration/prompts/prompts.getters.ts +49 -49
  100. package/src/configuration/prompts/prompts.types.ts +11 -11
  101. package/src/connection.ts +81 -81
  102. package/src/index.ts +43 -42
  103. package/src/municipal/__tests__/validation.spec.ts +62 -62
  104. package/src/municipal/cities/cities.getters.ts +50 -50
  105. package/src/municipal/cities/cities.types.ts +11 -11
  106. package/src/municipal/cities/index.ts +2 -2
  107. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  108. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  109. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  110. package/src/municipal/departmentsSubjects/index.ts +9 -9
  111. package/src/municipal/index.ts +22 -22
  112. package/src/municipal/mongodb-client.ts +61 -61
  113. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  114. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  115. package/src/municipal/muniIssues/index.ts +17 -17
  116. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  117. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  118. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  119. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  120. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  121. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  122. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  123. package/src/municipal/streets/index.ts +2 -2
  124. package/src/municipal/streets/streets.getters.ts +140 -140
  125. package/src/municipal/streets/streets.types.ts +19 -19
  126. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  127. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  128. package/src/municipal/systemInstructions/index.ts +7 -7
  129. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  130. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  131. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  132. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  133. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  134. package/src/municipal/tickets/index.ts +9 -9
  135. package/src/municipal/tickets/tickets.constants.ts +8 -8
  136. package/src/municipal/tickets/tickets.getters.ts +121 -121
  137. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  138. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  139. package/src/municipal/tickets/tickets.types.ts +54 -54
  140. package/src/municipal/utils/types.ts +11 -11
  141. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  142. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  143. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  144. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  145. package/src/talkpilot/agents/agents.getters.ts +34 -34
  146. package/src/talkpilot/agents/agents.types.ts +14 -14
  147. package/src/talkpilot/agents/index.ts +2 -2
  148. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  149. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  150. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  151. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  152. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  153. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  154. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  155. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  156. package/src/talkpilot/calls/calls.constants.ts +49 -49
  157. package/src/talkpilot/calls/calls.getters.ts +277 -277
  158. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  159. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  160. package/src/talkpilot/calls/calls.types.ts +133 -134
  161. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  162. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  163. package/src/talkpilot/calls/index.ts +6 -6
  164. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  165. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  166. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  167. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  168. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  169. package/src/talkpilot/clients/clients.getters.ts +16 -16
  170. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  171. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  172. package/src/talkpilot/clients/clients.types.ts +18 -18
  173. package/src/talkpilot/clients/index.ts +4 -4
  174. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +0 -318
  175. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  176. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +2 -116
  177. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +0 -4
  178. package/src/talkpilot/clientsConfig/index.ts +2 -3
  179. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  180. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  181. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  182. package/src/talkpilot/contextNotes/index.ts +2 -2
  183. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  184. package/src/talkpilot/flows/flows.getter.ts +14 -14
  185. package/src/talkpilot/flows/flows.schema.ts +155 -155
  186. package/src/talkpilot/flows/flows.types.ts +189 -189
  187. package/src/talkpilot/flows/index.ts +2 -2
  188. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  189. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  190. package/src/talkpilot/groups/groups.getters.ts +30 -30
  191. package/src/talkpilot/groups/groups.types.ts +29 -29
  192. package/src/talkpilot/groups/index.ts +3 -3
  193. package/src/talkpilot/groups/phone.utils.ts +46 -46
  194. package/src/talkpilot/index.ts +31 -31
  195. package/src/talkpilot/leads/index.ts +2 -2
  196. package/src/talkpilot/leads/leads.getter.ts +6 -6
  197. package/src/talkpilot/leads/leads.schema.ts +33 -33
  198. package/src/talkpilot/leads/leads.types.ts +20 -20
  199. package/src/talkpilot/mongodb-client.ts +78 -78
  200. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  201. package/src/talkpilot/phone_numbers/index.ts +2 -2
  202. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  203. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  204. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  205. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  206. package/src/talkpilot/plans/index.ts +2 -2
  207. package/src/talkpilot/plans/plans.getters.ts +132 -132
  208. package/src/talkpilot/plans/plans.types.ts +89 -89
  209. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  210. package/src/talkpilot/products/index.ts +2 -2
  211. package/src/talkpilot/products/products.getters.ts +12 -12
  212. package/src/talkpilot/products/products.types.ts +9 -9
  213. package/src/talkpilot/results/index.ts +7 -7
  214. package/src/talkpilot/results/results.getter.ts +39 -39
  215. package/src/talkpilot/results/results.schema.ts +25 -25
  216. package/src/talkpilot/results/results.types.ts +34 -34
  217. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  218. package/src/talkpilot/retry_analyze/index.ts +2 -2
  219. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  220. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  221. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  222. package/src/talkpilot/sessions/index.ts +2 -2
  223. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  224. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  225. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  226. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  227. package/src/talkpilot/subscriptions/index.ts +3 -3
  228. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  229. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  230. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  231. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  232. package/src/talkpilot/utils/query.utils.ts +21 -21
  233. package/src/test-utils/db-utils.ts +33 -33
  234. package/src/test-utils/factories/index.ts +17 -16
  235. package/src/test-utils/factories/municipal/cities.ts +16 -16
  236. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  237. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  238. package/src/test-utils/factories/municipal/streets.ts +22 -22
  239. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  240. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  241. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  242. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  243. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  244. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  245. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  246. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  247. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  248. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  249. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +28 -0
  250. package/src/test-utils/factories/websitalk/scans.ts +24 -24
  251. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  252. package/src/utils/date.utils.ts +126 -126
  253. package/src/utils/shared.types.ts +4 -4
  254. package/src/utils/validation.ts +23 -23
  255. package/src/websitalk/index.ts +17 -16
  256. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +123 -0
  257. package/src/websitalk/knowledgeDocuments/index.ts +3 -0
  258. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +19 -0
  259. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +85 -0
  260. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +37 -0
  261. package/src/websitalk/mongodb-client.ts +61 -61
  262. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  263. package/src/websitalk/scans/index.ts +4 -4
  264. package/src/websitalk/scans/scans.constants.ts +15 -15
  265. package/src/websitalk/scans/scans.getters.ts +160 -160
  266. package/src/websitalk/scans/scans.types.ts +45 -45
  267. package/src/websitalk/scans/scans.utils.ts +5 -5
  268. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  269. package/src/websitalk/websiteUrls/index.ts +2 -2
  270. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  271. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  272. package/tsconfig.json +23 -23
  273. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +0 -2
@@ -1,274 +1,274 @@
1
- import {
2
- createSystemInstruction,
3
- updateSystemInstruction,
4
- deleteSystemInstruction,
5
- deactivateSystemInstruction,
6
- activateSystemInstruction,
7
- } from "../instructions.setters";
8
- import { getSystemInstructionById } from "../instructions.getters";
9
- import {
10
- MIS_SystemInstruction,
11
- MIS_TOOLS,
12
- QUERY_TYPES,
13
- } from "../instructions.types";
14
- import { ObjectId } from "mongodb";
15
-
16
- describe("System Instructions Setter Tests", () => {
17
- const testCity = "Ashdod";
18
-
19
- describe("createSystemInstruction", () => {
20
- it("given valid data when created then save document with timestamps", async () => {
21
- // Given
22
- const instructionData: Omit<
23
- MIS_SystemInstruction,
24
- "_id" | "createdAt" | "updatedAt"
25
- > = {
26
- cityName: testCity,
27
- instruction: "Test Instruction",
28
- isActive: true,
29
- tool: MIS_TOOLS.findSubject,
30
- queryType: QUERY_TYPES.any,
31
- tags: ["test", "unit"],
32
- };
33
-
34
- // When
35
- const id = await createSystemInstruction(instructionData);
36
-
37
- // Then
38
- const saved = await getSystemInstructionById(id.toString());
39
- expect(saved).toBeDefined();
40
- expect(saved?._id).toBeDefined();
41
- expect(saved).toMatchObject(instructionData);
42
- expect(saved?.createdAt).toBeInstanceOf(Date);
43
- expect(saved?.updatedAt).toBeInstanceOf(Date);
44
- });
45
-
46
- it("given data without tags when created then save document with default isActive true and no tags", async () => {
47
- // Given
48
- const instructionData: Omit<
49
- MIS_SystemInstruction,
50
- "_id" | "createdAt" | "updatedAt"
51
- > = {
52
- cityName: testCity,
53
- instruction: "No Tags Instruction",
54
- isActive: true,
55
- tool: MIS_TOOLS.findStreet,
56
- queryType: QUERY_TYPES.exactlyOne,
57
- };
58
-
59
- // When
60
- const id = await createSystemInstruction(instructionData);
61
-
62
- // Then
63
- const saved = await getSystemInstructionById(id.toString());
64
- expect(saved).toBeDefined();
65
- expect(saved?.tags).toBeUndefined();
66
- expect(saved?.isActive).toBe(true);
67
- });
68
-
69
- it("should throw error when creating with invalid tool", async () => {
70
- const invalidData = {
71
- cityName: testCity,
72
- instruction: "Invalid Tool Test",
73
- isActive: true,
74
- tool: "invalidTool" as any,
75
- queryType: QUERY_TYPES.any,
76
- };
77
-
78
- await expect(createSystemInstruction(invalidData)).rejects.toThrow(
79
- `Invalid tool value: invalidTool. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
80
- );
81
- });
82
-
83
- it("should throw error when creating with invalid queryType", async () => {
84
- const invalidData = {
85
- cityName: testCity,
86
- instruction: "Invalid QueryType Test",
87
- isActive: true,
88
- tool: MIS_TOOLS.findSubject,
89
- queryType: "invalidType" as any,
90
- };
91
-
92
- await expect(createSystemInstruction(invalidData)).rejects.toThrow(
93
- `Invalid queryType value: invalidType. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
94
- );
95
- });
96
- });
97
-
98
- describe("updateSystemInstruction", () => {
99
- let instructionId: string;
100
- //Given before each test
101
- beforeEach(async () => {
102
- const id = await createSystemInstruction({
103
- cityName: testCity,
104
- instruction: "Find Me",
105
- isActive: true,
106
- tool: MIS_TOOLS.findSubject,
107
- queryType: QUERY_TYPES.any,
108
- });
109
- instructionId = id.toString();
110
-
111
- await createSystemInstruction({
112
- cityName: testCity,
113
- instruction: "Inactive One",
114
- isActive: false,
115
- tool: MIS_TOOLS.findSubject,
116
- queryType: QUERY_TYPES.any,
117
- });
118
- });
119
- it("given existing doc when updated then change values and refresh updatedAt", async () => {
120
- const originalDoc = await getSystemInstructionById(
121
- instructionId.toString(),
122
- );
123
-
124
- // Wait a bit to ensure timestamp difference
125
- await new Promise((resolve) => setTimeout(resolve, 10));
126
-
127
- // When
128
- await updateSystemInstruction(instructionId.toString(), {
129
- instruction: "New Text",
130
- });
131
-
132
- // Then
133
- const updatedDoc = await getSystemInstructionById(
134
- instructionId.toString(),
135
- );
136
- expect(updatedDoc?.instruction).toBe("New Text");
137
- expect(updatedDoc?.updatedAt.getTime()).toBeGreaterThan(
138
- originalDoc!.updatedAt.getTime(),
139
- );
140
- });
141
-
142
- it("given multiple fields when updated then change all provided values", async () => {
143
- // When
144
- await updateSystemInstruction(instructionId, {
145
- isActive: false,
146
- tool: MIS_TOOLS.findStreet,
147
- tags: ["new-tag"],
148
- });
149
-
150
- // Then
151
- const updatedDoc = await getSystemInstructionById(instructionId);
152
- expect(updatedDoc?.isActive).toBe(false);
153
- expect(updatedDoc?.tool).toBe(MIS_TOOLS.findStreet);
154
- expect(updatedDoc?.tags).toEqual(["new-tag"]);
155
- });
156
-
157
- it("should throw error when updating with invalid tool", async () => {
158
- const invalidUpdate = { tool: "invalidTool" as any };
159
-
160
- await expect(
161
- updateSystemInstruction(instructionId, invalidUpdate),
162
- ).rejects.toThrow(
163
- `Invalid tool value: invalidTool. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
164
- );
165
- });
166
-
167
- it("should throw error when updating with invalid queryType", async () => {
168
- const invalidUpdate = { queryType: "invalidType" as any };
169
-
170
- await expect(
171
- updateSystemInstruction(instructionId, invalidUpdate),
172
- ).rejects.toThrow(
173
- `Invalid queryType value: invalidType. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
174
- );
175
- });
176
-
177
- it("given system instructions, when deactivating it then its status updated to active", async () => {
178
- //When
179
- const success = await deactivateSystemInstruction(
180
- instructionId.toString(),
181
- );
182
- const updatedDoc = await getSystemInstructionById(
183
- instructionId.toString(),
184
- );
185
- //Then
186
- expect(success).toBe(true);
187
- expect(updatedDoc?.isActive).toBe(false);
188
- });
189
- it("given invalidId when deactivating it then return false", async () => {
190
- //When
191
- const success = await deactivateSystemInstruction(
192
- new ObjectId().toHexString(),
193
- );
194
-
195
- //Then
196
- expect(success).toBe(false);
197
- });
198
-
199
- it("given already inactive instruction when deactivating then still return true and remain inactive", async () => {
200
- // Given
201
- await deactivateSystemInstruction(instructionId);
202
-
203
- // When
204
- const success = await deactivateSystemInstruction(instructionId);
205
-
206
- // Then
207
- expect(success).toBe(true);
208
- const doc = await getSystemInstructionById(instructionId);
209
- expect(doc?.isActive).toBe(false);
210
- });
211
- });
212
-
213
- describe("activateSystemInstruction", () => {
214
- let instructionId: string;
215
- beforeEach(async () => {
216
- const id = await createSystemInstruction({
217
- cityName: testCity,
218
- instruction: "Inactive Instruction",
219
- isActive: false,
220
- tool: MIS_TOOLS.findSubject,
221
- queryType: QUERY_TYPES.any,
222
- });
223
- instructionId = id.toString();
224
- });
225
-
226
- it("given inactive doc when activating then set isActive to true", async () => {
227
- // When
228
- const success = await activateSystemInstruction(instructionId);
229
-
230
- // Then
231
- expect(success).toBe(true);
232
- const updatedDoc = await getSystemInstructionById(instructionId);
233
- expect(updatedDoc?.isActive).toBe(true);
234
- });
235
-
236
- it("given invalidId when activating then return false", async () => {
237
- // When
238
- const success = await activateSystemInstruction(
239
- new ObjectId().toHexString(),
240
- );
241
-
242
- // Then
243
- expect(success).toBe(false);
244
- });
245
- });
246
-
247
- describe("deleteSystemInstruction", () => {
248
- it("given existing id when deleted then remove document from DB", async () => {
249
- const id = await createSystemInstruction({
250
- cityName: testCity,
251
- instruction: "To be deleted",
252
- isActive: true,
253
- tool: MIS_TOOLS.findSubject,
254
- queryType: QUERY_TYPES.any,
255
- });
256
-
257
- const deleteResult = await deleteSystemInstruction(id.toString());
258
- expect(deleteResult).toBe(true);
259
-
260
- const findResult = await getSystemInstructionById(id.toString());
261
- expect(findResult).toBeNull();
262
- });
263
-
264
- it("given non-existent id when deleting then return false", async () => {
265
- // When
266
- const result = await deleteSystemInstruction(
267
- new ObjectId().toHexString(),
268
- );
269
-
270
- // Then
271
- expect(result).toBe(false);
272
- });
273
- });
274
- });
1
+ import {
2
+ createSystemInstruction,
3
+ updateSystemInstruction,
4
+ deleteSystemInstruction,
5
+ deactivateSystemInstruction,
6
+ activateSystemInstruction,
7
+ } from "../instructions.setters";
8
+ import { getSystemInstructionById } from "../instructions.getters";
9
+ import {
10
+ MIS_SystemInstruction,
11
+ MIS_TOOLS,
12
+ QUERY_TYPES,
13
+ } from "../instructions.types";
14
+ import { ObjectId } from "mongodb";
15
+
16
+ describe("System Instructions Setter Tests", () => {
17
+ const testCity = "Ashdod";
18
+
19
+ describe("createSystemInstruction", () => {
20
+ it("given valid data when created then save document with timestamps", async () => {
21
+ // Given
22
+ const instructionData: Omit<
23
+ MIS_SystemInstruction,
24
+ "_id" | "createdAt" | "updatedAt"
25
+ > = {
26
+ cityName: testCity,
27
+ instruction: "Test Instruction",
28
+ isActive: true,
29
+ tool: MIS_TOOLS.findSubject,
30
+ queryType: QUERY_TYPES.any,
31
+ tags: ["test", "unit"],
32
+ };
33
+
34
+ // When
35
+ const id = await createSystemInstruction(instructionData);
36
+
37
+ // Then
38
+ const saved = await getSystemInstructionById(id.toString());
39
+ expect(saved).toBeDefined();
40
+ expect(saved?._id).toBeDefined();
41
+ expect(saved).toMatchObject(instructionData);
42
+ expect(saved?.createdAt).toBeInstanceOf(Date);
43
+ expect(saved?.updatedAt).toBeInstanceOf(Date);
44
+ });
45
+
46
+ it("given data without tags when created then save document with default isActive true and no tags", async () => {
47
+ // Given
48
+ const instructionData: Omit<
49
+ MIS_SystemInstruction,
50
+ "_id" | "createdAt" | "updatedAt"
51
+ > = {
52
+ cityName: testCity,
53
+ instruction: "No Tags Instruction",
54
+ isActive: true,
55
+ tool: MIS_TOOLS.findStreet,
56
+ queryType: QUERY_TYPES.exactlyOne,
57
+ };
58
+
59
+ // When
60
+ const id = await createSystemInstruction(instructionData);
61
+
62
+ // Then
63
+ const saved = await getSystemInstructionById(id.toString());
64
+ expect(saved).toBeDefined();
65
+ expect(saved?.tags).toBeUndefined();
66
+ expect(saved?.isActive).toBe(true);
67
+ });
68
+
69
+ it("should throw error when creating with invalid tool", async () => {
70
+ const invalidData = {
71
+ cityName: testCity,
72
+ instruction: "Invalid Tool Test",
73
+ isActive: true,
74
+ tool: "invalidTool" as any,
75
+ queryType: QUERY_TYPES.any,
76
+ };
77
+
78
+ await expect(createSystemInstruction(invalidData)).rejects.toThrow(
79
+ `Invalid tool value: invalidTool. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
80
+ );
81
+ });
82
+
83
+ it("should throw error when creating with invalid queryType", async () => {
84
+ const invalidData = {
85
+ cityName: testCity,
86
+ instruction: "Invalid QueryType Test",
87
+ isActive: true,
88
+ tool: MIS_TOOLS.findSubject,
89
+ queryType: "invalidType" as any,
90
+ };
91
+
92
+ await expect(createSystemInstruction(invalidData)).rejects.toThrow(
93
+ `Invalid queryType value: invalidType. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
94
+ );
95
+ });
96
+ });
97
+
98
+ describe("updateSystemInstruction", () => {
99
+ let instructionId: string;
100
+ //Given before each test
101
+ beforeEach(async () => {
102
+ const id = await createSystemInstruction({
103
+ cityName: testCity,
104
+ instruction: "Find Me",
105
+ isActive: true,
106
+ tool: MIS_TOOLS.findSubject,
107
+ queryType: QUERY_TYPES.any,
108
+ });
109
+ instructionId = id.toString();
110
+
111
+ await createSystemInstruction({
112
+ cityName: testCity,
113
+ instruction: "Inactive One",
114
+ isActive: false,
115
+ tool: MIS_TOOLS.findSubject,
116
+ queryType: QUERY_TYPES.any,
117
+ });
118
+ });
119
+ it("given existing doc when updated then change values and refresh updatedAt", async () => {
120
+ const originalDoc = await getSystemInstructionById(
121
+ instructionId.toString(),
122
+ );
123
+
124
+ // Wait a bit to ensure timestamp difference
125
+ await new Promise((resolve) => setTimeout(resolve, 10));
126
+
127
+ // When
128
+ await updateSystemInstruction(instructionId.toString(), {
129
+ instruction: "New Text",
130
+ });
131
+
132
+ // Then
133
+ const updatedDoc = await getSystemInstructionById(
134
+ instructionId.toString(),
135
+ );
136
+ expect(updatedDoc?.instruction).toBe("New Text");
137
+ expect(updatedDoc?.updatedAt.getTime()).toBeGreaterThan(
138
+ originalDoc!.updatedAt.getTime(),
139
+ );
140
+ });
141
+
142
+ it("given multiple fields when updated then change all provided values", async () => {
143
+ // When
144
+ await updateSystemInstruction(instructionId, {
145
+ isActive: false,
146
+ tool: MIS_TOOLS.findStreet,
147
+ tags: ["new-tag"],
148
+ });
149
+
150
+ // Then
151
+ const updatedDoc = await getSystemInstructionById(instructionId);
152
+ expect(updatedDoc?.isActive).toBe(false);
153
+ expect(updatedDoc?.tool).toBe(MIS_TOOLS.findStreet);
154
+ expect(updatedDoc?.tags).toEqual(["new-tag"]);
155
+ });
156
+
157
+ it("should throw error when updating with invalid tool", async () => {
158
+ const invalidUpdate = { tool: "invalidTool" as any };
159
+
160
+ await expect(
161
+ updateSystemInstruction(instructionId, invalidUpdate),
162
+ ).rejects.toThrow(
163
+ `Invalid tool value: invalidTool. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
164
+ );
165
+ });
166
+
167
+ it("should throw error when updating with invalid queryType", async () => {
168
+ const invalidUpdate = { queryType: "invalidType" as any };
169
+
170
+ await expect(
171
+ updateSystemInstruction(instructionId, invalidUpdate),
172
+ ).rejects.toThrow(
173
+ `Invalid queryType value: invalidType. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
174
+ );
175
+ });
176
+
177
+ it("given system instructions, when deactivating it then its status updated to active", async () => {
178
+ //When
179
+ const success = await deactivateSystemInstruction(
180
+ instructionId.toString(),
181
+ );
182
+ const updatedDoc = await getSystemInstructionById(
183
+ instructionId.toString(),
184
+ );
185
+ //Then
186
+ expect(success).toBe(true);
187
+ expect(updatedDoc?.isActive).toBe(false);
188
+ });
189
+ it("given invalidId when deactivating it then return false", async () => {
190
+ //When
191
+ const success = await deactivateSystemInstruction(
192
+ new ObjectId().toHexString(),
193
+ );
194
+
195
+ //Then
196
+ expect(success).toBe(false);
197
+ });
198
+
199
+ it("given already inactive instruction when deactivating then still return true and remain inactive", async () => {
200
+ // Given
201
+ await deactivateSystemInstruction(instructionId);
202
+
203
+ // When
204
+ const success = await deactivateSystemInstruction(instructionId);
205
+
206
+ // Then
207
+ expect(success).toBe(true);
208
+ const doc = await getSystemInstructionById(instructionId);
209
+ expect(doc?.isActive).toBe(false);
210
+ });
211
+ });
212
+
213
+ describe("activateSystemInstruction", () => {
214
+ let instructionId: string;
215
+ beforeEach(async () => {
216
+ const id = await createSystemInstruction({
217
+ cityName: testCity,
218
+ instruction: "Inactive Instruction",
219
+ isActive: false,
220
+ tool: MIS_TOOLS.findSubject,
221
+ queryType: QUERY_TYPES.any,
222
+ });
223
+ instructionId = id.toString();
224
+ });
225
+
226
+ it("given inactive doc when activating then set isActive to true", async () => {
227
+ // When
228
+ const success = await activateSystemInstruction(instructionId);
229
+
230
+ // Then
231
+ expect(success).toBe(true);
232
+ const updatedDoc = await getSystemInstructionById(instructionId);
233
+ expect(updatedDoc?.isActive).toBe(true);
234
+ });
235
+
236
+ it("given invalidId when activating then return false", async () => {
237
+ // When
238
+ const success = await activateSystemInstruction(
239
+ new ObjectId().toHexString(),
240
+ );
241
+
242
+ // Then
243
+ expect(success).toBe(false);
244
+ });
245
+ });
246
+
247
+ describe("deleteSystemInstruction", () => {
248
+ it("given existing id when deleted then remove document from DB", async () => {
249
+ const id = await createSystemInstruction({
250
+ cityName: testCity,
251
+ instruction: "To be deleted",
252
+ isActive: true,
253
+ tool: MIS_TOOLS.findSubject,
254
+ queryType: QUERY_TYPES.any,
255
+ });
256
+
257
+ const deleteResult = await deleteSystemInstruction(id.toString());
258
+ expect(deleteResult).toBe(true);
259
+
260
+ const findResult = await getSystemInstructionById(id.toString());
261
+ expect(findResult).toBeNull();
262
+ });
263
+
264
+ it("given non-existent id when deleting then return false", async () => {
265
+ // When
266
+ const result = await deleteSystemInstruction(
267
+ new ObjectId().toHexString(),
268
+ );
269
+
270
+ // Then
271
+ expect(result).toBe(false);
272
+ });
273
+ });
274
+ });
@@ -1,7 +1,7 @@
1
- export * from "./instructions.getters";
2
- export * from "./instructions.setters";
3
- export type {
4
- MIS_SystemInstruction,
5
- MIS_Tool,
6
- QueryType,
7
- } from "./instructions.types";
1
+ export * from "./instructions.getters";
2
+ export * from "./instructions.setters";
3
+ export type {
4
+ MIS_SystemInstruction,
5
+ MIS_Tool,
6
+ QueryType,
7
+ } from "./instructions.types";