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