@talkpilot/core-db 1.1.19 → 1.2.0
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.
- package/.cursor/rules/development.mdc +65 -65
- package/DEVELOPMENT.md +98 -98
- package/README.md +160 -160
- package/dist/talkpilot/calls/calls.getters.d.ts +2 -1
- package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.getters.js +176 -0
- package/dist/talkpilot/calls/calls.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.types.d.ts +48 -0
- package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +1 -0
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +13 -0
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
- package/jest.config.js +19 -19
- package/package.json +45 -45
- package/src/__tests__/setup.ts +20 -20
- package/src/connection.ts +42 -42
- package/src/index.ts +16 -16
- package/src/municipal/__tests__/validation.spec.ts +62 -62
- package/src/municipal/cities/cities.getters.ts +50 -50
- package/src/municipal/cities/cities.types.ts +11 -11
- package/src/municipal/cities/index.ts +2 -2
- package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
- package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
- package/src/municipal/departmentsSubjects/index.ts +9 -9
- package/src/municipal/index.ts +21 -21
- package/src/municipal/mongodb-client.ts +61 -61
- package/src/municipal/streets/index.ts +2 -2
- package/src/municipal/streets/streets.getters.ts +125 -125
- package/src/municipal/streets/streets.types.ts +18 -18
- package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
- package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
- package/src/municipal/systemInstructions/index.ts +7 -7
- package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
- package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
- package/src/municipal/systemInstructions/instructions.types.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +66 -66
- package/src/municipal/tickets/index.ts +2 -2
- package/src/municipal/tickets/tickets.getters.ts +261 -261
- package/src/municipal/tickets/tickets.types.ts +43 -43
- package/src/municipal/utils/types.ts +11 -11
- package/src/talkpilot/__tests__/db.spec.ts +38 -38
- package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
- package/src/talkpilot/__tests__/validation.spec.ts +68 -68
- package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
- package/src/talkpilot/agents/agents.getters.ts +34 -34
- package/src/talkpilot/agents/agents.types.ts +14 -14
- package/src/talkpilot/agents/index.ts +2 -2
- package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
- package/src/talkpilot/backgroundToolResults/index.ts +2 -2
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
- package/src/talkpilot/calls/__tests__/calls.spec.ts +252 -252
- package/src/talkpilot/calls/calls.getters.ts +446 -248
- package/src/talkpilot/calls/calls.types.ts +171 -115
- package/src/talkpilot/calls/index.ts +2 -2
- package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
- package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
- package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
- package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
- package/src/talkpilot/clients/clients.getters.ts +16 -16
- package/src/talkpilot/clients/clients.types.ts +14 -14
- package/src/talkpilot/clients/index.ts +2 -2
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +106 -106
- package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +44 -22
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +94 -94
- package/src/talkpilot/clientsConfig/index.ts +2 -2
- package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +67 -67
- package/src/talkpilot/flows/flows.getter.ts +14 -14
- package/src/talkpilot/flows/flows.schema.ts +153 -153
- package/src/talkpilot/flows/flows.types.ts +184 -184
- package/src/talkpilot/flows/index.ts +2 -2
- package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
- package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
- package/src/talkpilot/groups/groups.getters.ts +30 -30
- package/src/talkpilot/groups/groups.types.ts +29 -29
- package/src/talkpilot/groups/index.ts +3 -3
- package/src/talkpilot/groups/phone.utils.ts +46 -46
- package/src/talkpilot/index.ts +29 -29
- package/src/talkpilot/leads/index.ts +2 -2
- package/src/talkpilot/leads/leads.getter.ts +6 -6
- package/src/talkpilot/leads/leads.schema.ts +33 -33
- package/src/talkpilot/leads/leads.types.ts +20 -20
- package/src/talkpilot/mongodb-client.ts +78 -78
- package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +247 -247
- package/src/talkpilot/phone_numbers/index.ts +2 -2
- package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +154 -154
- package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
- package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
- package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
- package/src/talkpilot/plans/index.ts +2 -2
- package/src/talkpilot/plans/plans.getters.ts +132 -132
- package/src/talkpilot/plans/plans.types.ts +89 -89
- package/src/talkpilot/results/index.ts +7 -7
- package/src/talkpilot/results/results.getter.ts +35 -35
- package/src/talkpilot/results/results.schema.ts +25 -25
- package/src/talkpilot/results/results.types.ts +34 -34
- package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
- package/src/talkpilot/retry_analyze/index.ts +2 -2
- package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +75 -75
- package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
- package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
- package/src/talkpilot/sessions/index.ts +2 -2
- package/src/talkpilot/sessions/sessions.getter.ts +92 -92
- package/src/talkpilot/sessions/sessions.schema.ts +34 -34
- package/src/talkpilot/sessions/sessions.types.ts +30 -30
- package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
- package/src/talkpilot/subscriptions/index.ts +3 -3
- package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
- package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
- package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
- package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
- package/src/talkpilot/utils/query.utils.ts +21 -21
- package/src/test-utils/db-utils.ts +24 -24
- package/src/test-utils/factories/index.ts +12 -12
- package/src/test-utils/factories/municipal/cities.ts +16 -16
- package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
- package/src/test-utils/factories/municipal/streets.ts +22 -22
- package/src/test-utils/factories/municipal/tickets.ts +39 -39
- package/src/test-utils/factories/talkpilot/agents.ts +19 -19
- package/src/test-utils/factories/talkpilot/calls.ts +37 -37
- package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
- package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
- package/src/test-utils/factories/talkpilot/flows.ts +33 -33
- package/src/test-utils/factories/talkpilot/groups.ts +33 -33
- package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
- package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
- package/src/utils/validation.ts +23 -23
- package/tsconfig.json +23 -23
|
@@ -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";
|