@talkpilot/core-db 1.3.50 → 1.3.51

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