@tellescope/sdk 1.237.0 → 1.237.2

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 (43) hide show
  1. package/lib/cjs/sdk.d.ts +1 -0
  2. package/lib/cjs/sdk.d.ts.map +1 -1
  3. package/lib/cjs/sdk.js +1 -0
  4. package/lib/cjs/sdk.js.map +1 -1
  5. package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.d.ts.map +1 -1
  6. package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.js +227 -64
  7. package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.js.map +1 -1
  8. package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts +6 -0
  9. package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts.map +1 -0
  10. package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.js +717 -0
  11. package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.js.map +1 -0
  12. package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.d.ts +6 -0
  13. package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.d.ts.map +1 -0
  14. package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.js +372 -0
  15. package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.js.map +1 -0
  16. package/lib/cjs/tests/tests.d.ts.map +1 -1
  17. package/lib/cjs/tests/tests.js +575 -105
  18. package/lib/cjs/tests/tests.js.map +1 -1
  19. package/lib/esm/sdk.d.ts +1 -0
  20. package/lib/esm/sdk.d.ts.map +1 -1
  21. package/lib/esm/sdk.js +1 -0
  22. package/lib/esm/sdk.js.map +1 -1
  23. package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.d.ts.map +1 -1
  24. package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.js +227 -64
  25. package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.js.map +1 -1
  26. package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts +6 -0
  27. package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts.map +1 -0
  28. package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.js +713 -0
  29. package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.js.map +1 -0
  30. package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.d.ts +6 -0
  31. package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.d.ts.map +1 -0
  32. package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.js +368 -0
  33. package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.js.map +1 -0
  34. package/lib/esm/tests/tests.d.ts.map +1 -1
  35. package/lib/esm/tests/tests.js +575 -105
  36. package/lib/esm/tests/tests.js.map +1 -1
  37. package/lib/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +10 -10
  39. package/src/sdk.ts +4 -0
  40. package/src/tests/api_tests/inbox_thread_assignment_updates.test.ts +149 -0
  41. package/src/tests/api_tests/inbox_thread_draft_scheduled.test.ts +625 -0
  42. package/src/tests/tests.ts +401 -1
  43. package/test_generated.pdf +0 -0
@@ -0,0 +1,717 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.inbox_thread_draft_scheduled_tests = void 0;
40
+ require('source-map-support').install();
41
+ var sdk_1 = require("../../sdk");
42
+ var testing_1 = require("@tellescope/testing");
43
+ var setup_1 = require("../setup");
44
+ var host = process.env.API_URL || 'http://localhost:8080';
45
+ var inbox_thread_draft_scheduled_tests = function (_a) {
46
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
47
+ return __awaiter(void 0, void 0, void 0, function () {
48
+ var timestamp, from, testUser, testEnduser, resetAndBuildThreads, phoneNumber_1, enduserPhoneNumber_1, sentSMS, draftSMS, loadedThreads, smsThread, futureDate, scheduledSMS, loadedThreads2, threadWithScheduled, emailSubject_1, sentEmail, draftEmail, loadedThreads3, emailThread, scheduledEmail, loadedThreads4, emailThreadWithScheduled, draftOnlyEnduserPhoneNumber_1, draftOnlySMS, loadedThreads5, draftOnlyThread, sentOnlyPhoneNumber_1, sentOnlyEnduserPhoneNumber_1, loadedThreads6, sentOnlyThread, chatRoom, farFuture, draftChat, loadedThreads7, chatThreadBefore_1, loadedThreads7b, chatThreadWithDraft, loadedThreads8, chatThreadAfter, deleteTestPhoneNumber_1, deleteTestEnduserPhoneNumber_1, draftSmsToDelete, loadedThreads9a, smsDeleteThread_1, loadedThreads9b, smsDeleteThreadAfter, deleteEmailSubject_1, draftEmailToDelete, loadedThreads10a, emailDeleteThread_1, loadedThreads10b, emailDeleteThreadAfter, chatRoomForDeletion, farFuture2, draftChatToDelete, loadedThreads11a, chatDeleteThread_1, loadedThreads11b, chatDeleteThreadWithDraft, loadedThreads11c, chatDeleteThreadAfter;
49
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
50
+ return __generator(this, function (_v) {
51
+ switch (_v.label) {
52
+ case 0:
53
+ (0, testing_1.log_header)("InboxThread Draft and Scheduled Message Tests");
54
+ timestamp = Date.now();
55
+ from = new Date(Date.now() - 1000 * 60 * 60) // 1 hour ago
56
+ ;
57
+ return [4 /*yield*/, sdk.api.users.createOne({
58
+ fname: "Test",
59
+ lname: "User",
60
+ email: "test-draft-scheduled-".concat(timestamp, "@test.com"),
61
+ notificationEmailsDisabled: true
62
+ })];
63
+ case 1:
64
+ testUser = _v.sent();
65
+ return [4 /*yield*/, sdk.api.endusers.createOne({
66
+ fname: "Test",
67
+ lname: "Patient",
68
+ email: "test-patient-draft-".concat(timestamp, "@test.com"),
69
+ phone: "+15555555555", // Required for SMS tests
70
+ })
71
+ // Helper to reset and rebuild threads
72
+ ];
73
+ case 2:
74
+ testEnduser = _v.sent();
75
+ resetAndBuildThreads = function () { return __awaiter(void 0, void 0, void 0, function () {
76
+ return __generator(this, function (_a) {
77
+ switch (_a.label) {
78
+ case 0: return [4 /*yield*/, sdk.api.inbox_threads.reset_threads()];
79
+ case 1:
80
+ _a.sent();
81
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })];
82
+ case 2:
83
+ _a.sent();
84
+ return [2 /*return*/];
85
+ }
86
+ });
87
+ }); };
88
+ _v.label = 3;
89
+ case 3:
90
+ _v.trys.push([3, , 62, 66]);
91
+ // ===== SMS Draft/Scheduled Tests =====
92
+ (0, testing_1.log_header)("SMS Draft and Scheduled Tests");
93
+ // Test 1: Draft SMS should be tracked in draftMessageIds but excluded from preview
94
+ console.log("Testing draft SMS tracking...");
95
+ phoneNumber_1 = "+15555555550";
96
+ enduserPhoneNumber_1 = "+15555555551";
97
+ // Create an inbound SMS to establish the thread with proper phone numbers
98
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
99
+ message: "Inbound message to establish thread",
100
+ enduserId: testEnduser.id,
101
+ userId: testUser.id,
102
+ inbound: true,
103
+ phoneNumber: phoneNumber_1,
104
+ enduserPhoneNumber: enduserPhoneNumber_1,
105
+ logOnly: true,
106
+ })
107
+ // Create a regular outbound SMS
108
+ ];
109
+ case 4:
110
+ // Create an inbound SMS to establish the thread with proper phone numbers
111
+ _v.sent();
112
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
113
+ message: "This is a sent message",
114
+ enduserId: testEnduser.id,
115
+ userId: testUser.id,
116
+ inbound: false,
117
+ phoneNumber: phoneNumber_1,
118
+ enduserPhoneNumber: enduserPhoneNumber_1,
119
+ logOnly: true,
120
+ })
121
+ // Create a draft SMS
122
+ ];
123
+ case 5:
124
+ sentSMS = _v.sent();
125
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
126
+ message: "This is a draft message",
127
+ enduserId: testEnduser.id,
128
+ userId: testUser.id,
129
+ inbound: false,
130
+ phoneNumber: phoneNumber_1,
131
+ enduserPhoneNumber: enduserPhoneNumber_1,
132
+ isDraft: true,
133
+ logOnly: true,
134
+ })
135
+ // Build threads from messages
136
+ ];
137
+ case 6:
138
+ draftSMS = _v.sent();
139
+ // Build threads from messages
140
+ return [4 /*yield*/, resetAndBuildThreads()
141
+ // Load the thread and verify
142
+ ];
143
+ case 7:
144
+ // Build threads from messages
145
+ _v.sent();
146
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
147
+ case 8:
148
+ loadedThreads = _v.sent();
149
+ smsThread = loadedThreads.threads.find(function (t) {
150
+ return t.type === 'SMS' && t.phoneNumber === phoneNumber_1 && t.enduserPhoneNumber === enduserPhoneNumber_1;
151
+ });
152
+ (0, testing_1.assert)(!!smsThread, "SMS thread should be found");
153
+ (0, testing_1.assert)(((_b = smsThread.draftMessageIds) === null || _b === void 0 ? void 0 : _b.includes(draftSMS.id)) === true, "Draft SMS ID should be in draftMessageIds. Got: ".concat(JSON.stringify(smsThread.draftMessageIds)));
154
+ (0, testing_1.assert)(((_c = smsThread.preview) === null || _c === void 0 ? void 0 : _c.includes("This is a sent message")) === true, "Preview should be from sent message, not draft. Got: ".concat(smsThread.preview));
155
+ console.log("✅ Draft SMS tracking test passed");
156
+ // Test 2: Scheduled SMS (future sendAt) should be tracked in scheduledMessageIds
157
+ console.log("Testing scheduled SMS tracking...");
158
+ futureDate = new Date(Date.now() + 24 * 60 * 60 * 1000) // 24 hours from now
159
+ ;
160
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
161
+ message: "This is a scheduled message",
162
+ enduserId: testEnduser.id,
163
+ userId: testUser.id,
164
+ inbound: false,
165
+ phoneNumber: phoneNumber_1,
166
+ enduserPhoneNumber: enduserPhoneNumber_1,
167
+ sendAt: futureDate,
168
+ logOnly: true,
169
+ })
170
+ // Rebuild threads
171
+ ];
172
+ case 9:
173
+ scheduledSMS = _v.sent();
174
+ // Rebuild threads
175
+ return [4 /*yield*/, resetAndBuildThreads()];
176
+ case 10:
177
+ // Rebuild threads
178
+ _v.sent();
179
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
180
+ case 11:
181
+ loadedThreads2 = _v.sent();
182
+ threadWithScheduled = loadedThreads2.threads.find(function (t) {
183
+ return t.type === 'SMS' && t.phoneNumber === phoneNumber_1 && t.enduserPhoneNumber === enduserPhoneNumber_1;
184
+ });
185
+ (0, testing_1.assert)(!!threadWithScheduled, "SMS thread should be found");
186
+ (0, testing_1.assert)(((_d = threadWithScheduled.scheduledMessageIds) === null || _d === void 0 ? void 0 : _d.includes(scheduledSMS.id)) === true, "Scheduled SMS ID should be in scheduledMessageIds. Got: ".concat(JSON.stringify(threadWithScheduled.scheduledMessageIds)));
187
+ (0, testing_1.assert)(((_e = threadWithScheduled.preview) === null || _e === void 0 ? void 0 : _e.includes("This is a scheduled message")) !== true, "Preview should NOT be from scheduled message. Got: ".concat(threadWithScheduled.preview));
188
+ console.log("✅ Scheduled SMS tracking test passed");
189
+ // ===== Email Draft/Scheduled Tests =====
190
+ (0, testing_1.log_header)("Email Draft and Scheduled Tests");
191
+ // Test 3: Draft email should be tracked in draftMessageIds
192
+ console.log("Testing draft email tracking...");
193
+ emailSubject_1 = "Draft Test Email ".concat(timestamp);
194
+ return [4 /*yield*/, sdk.api.emails.createOne({
195
+ subject: emailSubject_1,
196
+ textContent: "This is a sent email",
197
+ enduserId: testEnduser.id,
198
+ userId: testUser.id,
199
+ messageId: "sent-email-".concat(timestamp),
200
+ logOnly: true,
201
+ })
202
+ // Create a draft email
203
+ ];
204
+ case 12:
205
+ sentEmail = _v.sent();
206
+ return [4 /*yield*/, sdk.api.emails.createOne({
207
+ subject: emailSubject_1,
208
+ textContent: "This is a draft email",
209
+ enduserId: testEnduser.id,
210
+ userId: testUser.id,
211
+ messageId: "draft-email-".concat(timestamp),
212
+ isDraft: true,
213
+ logOnly: true,
214
+ })
215
+ // Rebuild threads
216
+ ];
217
+ case 13:
218
+ draftEmail = _v.sent();
219
+ // Rebuild threads
220
+ return [4 /*yield*/, resetAndBuildThreads()];
221
+ case 14:
222
+ // Rebuild threads
223
+ _v.sent();
224
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
225
+ case 15:
226
+ loadedThreads3 = _v.sent();
227
+ emailThread = loadedThreads3.threads.find(function (t) { return t.type === 'Email' && t.title === emailSubject_1; });
228
+ (0, testing_1.assert)(!!emailThread, "Email thread should be found");
229
+ (0, testing_1.assert)(((_f = emailThread.draftMessageIds) === null || _f === void 0 ? void 0 : _f.includes(draftEmail.id)) === true, "Draft Email ID should be in draftMessageIds. Got: ".concat(JSON.stringify(emailThread.draftMessageIds)));
230
+ (0, testing_1.assert)(((_g = emailThread.preview) === null || _g === void 0 ? void 0 : _g.includes("This is a sent email")) === true, "Preview should be from sent email, not draft. Got: ".concat(emailThread.preview));
231
+ console.log("✅ Draft email tracking test passed");
232
+ // Test 4: Scheduled email (future sendAt) should be tracked in scheduledMessageIds
233
+ console.log("Testing scheduled email tracking...");
234
+ return [4 /*yield*/, sdk.api.emails.createOne({
235
+ subject: emailSubject_1,
236
+ textContent: "This is a scheduled email",
237
+ enduserId: testEnduser.id,
238
+ userId: testUser.id,
239
+ messageId: "scheduled-email-".concat(timestamp),
240
+ sendAt: futureDate,
241
+ logOnly: true,
242
+ })
243
+ // Rebuild threads
244
+ ];
245
+ case 16:
246
+ scheduledEmail = _v.sent();
247
+ // Rebuild threads
248
+ return [4 /*yield*/, resetAndBuildThreads()];
249
+ case 17:
250
+ // Rebuild threads
251
+ _v.sent();
252
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
253
+ case 18:
254
+ loadedThreads4 = _v.sent();
255
+ emailThreadWithScheduled = loadedThreads4.threads.find(function (t) { return t.type === 'Email' && t.title === emailSubject_1; });
256
+ (0, testing_1.assert)(!!emailThreadWithScheduled, "Email thread should be found");
257
+ (0, testing_1.assert)(((_h = emailThreadWithScheduled.scheduledMessageIds) === null || _h === void 0 ? void 0 : _h.includes(scheduledEmail.id)) === true, "Scheduled Email ID should be in scheduledMessageIds. Got: ".concat(JSON.stringify(emailThreadWithScheduled.scheduledMessageIds)));
258
+ (0, testing_1.assert)(((_j = emailThreadWithScheduled.preview) === null || _j === void 0 ? void 0 : _j.includes("This is a scheduled email")) !== true, "Preview should NOT be from scheduled email. Got: ".concat(emailThreadWithScheduled.preview));
259
+ console.log("✅ Scheduled email tracking test passed");
260
+ // Test 5: Thread with ONLY drafts should still have a preview from the drafts
261
+ console.log("Testing thread with only draft messages...");
262
+ draftOnlyEnduserPhoneNumber_1 = "+15555555561";
263
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
264
+ message: "This is the only message and it is a draft",
265
+ enduserId: testEnduser.id,
266
+ userId: testUser.id,
267
+ inbound: false,
268
+ phoneNumber: "+15555555560",
269
+ enduserPhoneNumber: draftOnlyEnduserPhoneNumber_1,
270
+ isDraft: true,
271
+ logOnly: true,
272
+ })
273
+ // Rebuild threads
274
+ ];
275
+ case 19:
276
+ draftOnlySMS = _v.sent();
277
+ // Rebuild threads
278
+ return [4 /*yield*/, resetAndBuildThreads()];
279
+ case 20:
280
+ // Rebuild threads
281
+ _v.sent();
282
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})
283
+ // Match only on enduserPhoneNumber since there's no inbound to set phoneNumber
284
+ ];
285
+ case 21:
286
+ loadedThreads5 = _v.sent();
287
+ draftOnlyThread = loadedThreads5.threads.find(function (t) {
288
+ return t.type === 'SMS' && t.enduserPhoneNumber === draftOnlyEnduserPhoneNumber_1;
289
+ });
290
+ (0, testing_1.assert)(!!draftOnlyThread, "Draft-only thread should be found");
291
+ (0, testing_1.assert)(((_k = draftOnlyThread.draftMessageIds) === null || _k === void 0 ? void 0 : _k.includes(draftOnlySMS.id)) === true, "Draft SMS ID should be in draftMessageIds");
292
+ // When only drafts exist, the draft is used as fallback for preview
293
+ (0, testing_1.assert)(((_l = draftOnlyThread.preview) === null || _l === void 0 ? void 0 : _l.includes("only message")) === true, "Preview should fall back to draft when no sent messages exist. Got: ".concat(draftOnlyThread.preview));
294
+ console.log("✅ Thread with only draft messages test passed");
295
+ // Test 6: Verify fields are correctly typed as arrays
296
+ console.log("Testing field types...");
297
+ (0, testing_1.assert)(Array.isArray(smsThread.draftMessageIds), "draftMessageIds should be an array");
298
+ (0, testing_1.assert)(Array.isArray(threadWithScheduled.scheduledMessageIds), "scheduledMessageIds should be an array");
299
+ console.log("✅ Field types test passed");
300
+ // Test 7: Threads with NO drafts/scheduled should have empty arrays (not undefined)
301
+ console.log("Testing empty array defaults for threads with only sent messages...");
302
+ sentOnlyPhoneNumber_1 = "+15555555570";
303
+ sentOnlyEnduserPhoneNumber_1 = "+15555555571";
304
+ // Create an inbound message to establish the thread with proper phone numbers
305
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
306
+ message: "Inbound message",
307
+ enduserId: testEnduser.id,
308
+ userId: testUser.id,
309
+ inbound: true,
310
+ phoneNumber: sentOnlyPhoneNumber_1,
311
+ enduserPhoneNumber: sentOnlyEnduserPhoneNumber_1,
312
+ logOnly: true,
313
+ })
314
+ // Create an outbound sent message (no draft, no scheduled)
315
+ ];
316
+ case 22:
317
+ // Create an inbound message to establish the thread with proper phone numbers
318
+ _v.sent();
319
+ // Create an outbound sent message (no draft, no scheduled)
320
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
321
+ message: "This is a sent message only",
322
+ enduserId: testEnduser.id,
323
+ userId: testUser.id,
324
+ inbound: false,
325
+ phoneNumber: sentOnlyPhoneNumber_1,
326
+ enduserPhoneNumber: sentOnlyEnduserPhoneNumber_1,
327
+ logOnly: true,
328
+ })
329
+ // Rebuild threads
330
+ ];
331
+ case 23:
332
+ // Create an outbound sent message (no draft, no scheduled)
333
+ _v.sent();
334
+ // Rebuild threads
335
+ return [4 /*yield*/, resetAndBuildThreads()];
336
+ case 24:
337
+ // Rebuild threads
338
+ _v.sent();
339
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
340
+ case 25:
341
+ loadedThreads6 = _v.sent();
342
+ sentOnlyThread = loadedThreads6.threads.find(function (t) {
343
+ return t.type === 'SMS' && t.phoneNumber === sentOnlyPhoneNumber_1 && t.enduserPhoneNumber === sentOnlyEnduserPhoneNumber_1;
344
+ });
345
+ (0, testing_1.assert)(!!sentOnlyThread, "Sent-only thread should be found");
346
+ (0, testing_1.assert)(Array.isArray(sentOnlyThread.draftMessageIds) && sentOnlyThread.draftMessageIds.length === 0, "draftMessageIds should be an empty array when no drafts exist. Got: ".concat(JSON.stringify(sentOnlyThread.draftMessageIds)));
347
+ (0, testing_1.assert)(Array.isArray(sentOnlyThread.scheduledMessageIds) && sentOnlyThread.scheduledMessageIds.length === 0, "scheduledMessageIds should be an empty array when no scheduled messages exist. Got: ".concat(JSON.stringify(sentOnlyThread.scheduledMessageIds)));
348
+ console.log("✅ Empty array defaults test passed");
349
+ // ===== Chat Draft Cleanup on Send Tests =====
350
+ (0, testing_1.log_header)("Chat Draft Cleanup on Send Tests");
351
+ // Test 8: Verify draftMessageIds is cleaned up when a draft chat is sent
352
+ // Note: Chat threads don't auto-populate draftMessageIds during build_threads,
353
+ // so we manually set it up to test the cleanup logic in the event handler
354
+ console.log("Testing draft chat cleanup on send...");
355
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({
356
+ userIds: [testUser.id],
357
+ enduserIds: [testEnduser.id],
358
+ })
359
+ // Create a non-draft message first to establish the room (sets recentMessageSentAt)
360
+ // This is required for the room to be included in build_threads
361
+ ];
362
+ case 26:
363
+ chatRoom = _v.sent();
364
+ // Create a non-draft message first to establish the room (sets recentMessageSentAt)
365
+ // This is required for the room to be included in build_threads
366
+ return [4 /*yield*/, sdk.api.chats.createOne({
367
+ roomId: chatRoom.id,
368
+ message: "Initial message to establish room",
369
+ senderId: testEnduser.id,
370
+ })
371
+ // Create a draft chat message (isDraft: true, sendAt far in future like webapp does)
372
+ ];
373
+ case 27:
374
+ // Create a non-draft message first to establish the room (sets recentMessageSentAt)
375
+ // This is required for the room to be included in build_threads
376
+ _v.sent();
377
+ farFuture = new Date(Date.now() + 100 * 365 * 24 * 60 * 60 * 1000) // 100 years
378
+ ;
379
+ return [4 /*yield*/, sdk.api.chats.createOne({
380
+ roomId: chatRoom.id,
381
+ message: "This is a draft chat message",
382
+ senderId: testUser.id,
383
+ isDraft: true,
384
+ sendAt: farFuture,
385
+ })
386
+ // Build threads to create the Chat thread
387
+ ];
388
+ case 28:
389
+ draftChat = _v.sent();
390
+ // Build threads to create the Chat thread
391
+ return [4 /*yield*/, resetAndBuildThreads()];
392
+ case 29:
393
+ // Build threads to create the Chat thread
394
+ _v.sent();
395
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
396
+ case 30:
397
+ loadedThreads7 = _v.sent();
398
+ chatThreadBefore_1 = loadedThreads7.threads.find(function (t) { var _a; return t.type === 'Chat' && ((_a = t.enduserIds) === null || _a === void 0 ? void 0 : _a.includes(testEnduser.id)); });
399
+ (0, testing_1.assert)(!!chatThreadBefore_1, "Chat thread should be found");
400
+ // Manually add the draft ID to draftMessageIds to simulate the setup
401
+ // (Chat thread building doesn't auto-populate this, but the cleanup should still work)
402
+ return [4 /*yield*/, sdk.api.inbox_threads.updateOne(chatThreadBefore_1.id, {
403
+ draftMessageIds: [draftChat.id],
404
+ })
405
+ // Verify manual setup worked
406
+ ];
407
+ case 31:
408
+ // Manually add the draft ID to draftMessageIds to simulate the setup
409
+ // (Chat thread building doesn't auto-populate this, but the cleanup should still work)
410
+ _v.sent();
411
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
412
+ case 32:
413
+ loadedThreads7b = _v.sent();
414
+ chatThreadWithDraft = loadedThreads7b.threads.find(function (t) { return t.id === chatThreadBefore_1.id; });
415
+ (0, testing_1.assert)(((_m = chatThreadWithDraft.draftMessageIds) === null || _m === void 0 ? void 0 : _m.includes(draftChat.id)) === true, "Draft chat ID should be in draftMessageIds after manual setup. Got: ".concat(JSON.stringify(chatThreadWithDraft.draftMessageIds)));
416
+ console.log("✅ Draft chat manually added to draftMessageIds");
417
+ // "Send" the draft by updating isDraft to false and sendAt to now
418
+ // This mimics what the webapp does when user clicks send
419
+ return [4 /*yield*/, sdk.api.chats.updateOne(draftChat.id, {
420
+ isDraft: false,
421
+ sendAt: new Date(), // Now - triggers the scheduled chat handler
422
+ })
423
+ // Wait for the side effect to process
424
+ ];
425
+ case 33:
426
+ // "Send" the draft by updating isDraft to false and sendAt to now
427
+ // This mimics what the webapp does when user clicks send
428
+ _v.sent();
429
+ // Wait for the side effect to process
430
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 500)
431
+ // Reload the thread and verify cleanup happened
432
+ ];
433
+ case 34:
434
+ // Wait for the side effect to process
435
+ _v.sent();
436
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
437
+ case 35:
438
+ loadedThreads8 = _v.sent();
439
+ chatThreadAfter = loadedThreads8.threads.find(function (t) { return t.id === chatThreadBefore_1.id; });
440
+ (0, testing_1.assert)(!!chatThreadAfter, "Chat thread should be found after send");
441
+ (0, testing_1.assert)(((_o = chatThreadAfter.draftMessageIds) === null || _o === void 0 ? void 0 : _o.includes(draftChat.id)) === false, "Draft chat ID should be REMOVED from draftMessageIds after send. Got: ".concat(JSON.stringify(chatThreadAfter.draftMessageIds)));
442
+ console.log("✅ Draft chat cleanup on send test passed");
443
+ // Cleanup chat room
444
+ return [4 /*yield*/, sdk.api.chat_rooms.deleteOne(chatRoom.id).catch(console.error)
445
+ // ===== Message Deletion Cleanup Tests =====
446
+ ];
447
+ case 36:
448
+ // Cleanup chat room
449
+ _v.sent();
450
+ // ===== Message Deletion Cleanup Tests =====
451
+ (0, testing_1.log_header)("Message Deletion Cleanup Tests");
452
+ // Test 9: SMS draft deletion should remove ID from draftMessageIds
453
+ console.log("Testing SMS draft deletion cleanup...");
454
+ deleteTestPhoneNumber_1 = "+15555555580";
455
+ deleteTestEnduserPhoneNumber_1 = "+15555555581";
456
+ // Create an inbound SMS to establish the thread
457
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
458
+ message: "Inbound message to establish thread for deletion test",
459
+ enduserId: testEnduser.id,
460
+ userId: testUser.id,
461
+ inbound: true,
462
+ phoneNumber: deleteTestPhoneNumber_1,
463
+ enduserPhoneNumber: deleteTestEnduserPhoneNumber_1,
464
+ logOnly: true,
465
+ })
466
+ // Create a draft SMS
467
+ ];
468
+ case 37:
469
+ // Create an inbound SMS to establish the thread
470
+ _v.sent();
471
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
472
+ message: "This draft will be deleted",
473
+ enduserId: testEnduser.id,
474
+ userId: testUser.id,
475
+ inbound: false,
476
+ phoneNumber: deleteTestPhoneNumber_1,
477
+ enduserPhoneNumber: deleteTestEnduserPhoneNumber_1,
478
+ isDraft: true,
479
+ logOnly: true,
480
+ })
481
+ // Build threads to populate draftMessageIds
482
+ ];
483
+ case 38:
484
+ draftSmsToDelete = _v.sent();
485
+ // Build threads to populate draftMessageIds
486
+ return [4 /*yield*/, resetAndBuildThreads()
487
+ // Verify the draft ID is in the thread
488
+ ];
489
+ case 39:
490
+ // Build threads to populate draftMessageIds
491
+ _v.sent();
492
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
493
+ case 40:
494
+ loadedThreads9a = _v.sent();
495
+ smsDeleteThread_1 = loadedThreads9a.threads.find(function (t) {
496
+ return t.type === 'SMS' && t.phoneNumber === deleteTestPhoneNumber_1 && t.enduserPhoneNumber === deleteTestEnduserPhoneNumber_1;
497
+ });
498
+ (0, testing_1.assert)(!!smsDeleteThread_1, "SMS thread for deletion test should be found");
499
+ (0, testing_1.assert)(((_p = smsDeleteThread_1.draftMessageIds) === null || _p === void 0 ? void 0 : _p.includes(draftSmsToDelete.id)) === true, "Draft SMS ID should be in draftMessageIds before deletion. Got: ".concat(JSON.stringify(smsDeleteThread_1.draftMessageIds)));
500
+ // Delete the draft SMS
501
+ return [4 /*yield*/, sdk.api.sms_messages.deleteOne(draftSmsToDelete.id)
502
+ // Wait for the delete side effect to process
503
+ ];
504
+ case 41:
505
+ // Delete the draft SMS
506
+ _v.sent();
507
+ // Wait for the delete side effect to process
508
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 500)
509
+ // Verify the draft ID has been removed
510
+ ];
511
+ case 42:
512
+ // Wait for the delete side effect to process
513
+ _v.sent();
514
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
515
+ case 43:
516
+ loadedThreads9b = _v.sent();
517
+ smsDeleteThreadAfter = loadedThreads9b.threads.find(function (t) { return t.id === smsDeleteThread_1.id; });
518
+ (0, testing_1.assert)(!!smsDeleteThreadAfter, "SMS thread should still exist after draft deletion");
519
+ (0, testing_1.assert)(((_q = smsDeleteThreadAfter.draftMessageIds) === null || _q === void 0 ? void 0 : _q.includes(draftSmsToDelete.id)) === false, "Draft SMS ID should be REMOVED from draftMessageIds after deletion. Got: ".concat(JSON.stringify(smsDeleteThreadAfter.draftMessageIds)));
520
+ console.log("✅ SMS draft deletion cleanup test passed");
521
+ // Test 10: Email draft deletion should remove ID from draftMessageIds
522
+ console.log("Testing email draft deletion cleanup...");
523
+ deleteEmailSubject_1 = "Delete Test Email ".concat(timestamp);
524
+ // Create a sent email first to establish the thread
525
+ return [4 /*yield*/, sdk.api.emails.createOne({
526
+ subject: deleteEmailSubject_1,
527
+ textContent: "Sent email to establish thread for deletion test",
528
+ enduserId: testEnduser.id,
529
+ userId: testUser.id,
530
+ messageId: "sent-email-delete-test-".concat(timestamp),
531
+ logOnly: true,
532
+ })
533
+ // Create a draft email
534
+ ];
535
+ case 44:
536
+ // Create a sent email first to establish the thread
537
+ _v.sent();
538
+ return [4 /*yield*/, sdk.api.emails.createOne({
539
+ subject: deleteEmailSubject_1,
540
+ textContent: "This draft email will be deleted",
541
+ enduserId: testEnduser.id,
542
+ userId: testUser.id,
543
+ messageId: "draft-email-delete-test-".concat(timestamp),
544
+ isDraft: true,
545
+ logOnly: true,
546
+ })
547
+ // Build threads to populate draftMessageIds
548
+ ];
549
+ case 45:
550
+ draftEmailToDelete = _v.sent();
551
+ // Build threads to populate draftMessageIds
552
+ return [4 /*yield*/, resetAndBuildThreads()
553
+ // Verify the draft ID is in the thread
554
+ ];
555
+ case 46:
556
+ // Build threads to populate draftMessageIds
557
+ _v.sent();
558
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
559
+ case 47:
560
+ loadedThreads10a = _v.sent();
561
+ emailDeleteThread_1 = loadedThreads10a.threads.find(function (t) { return t.type === 'Email' && t.title === deleteEmailSubject_1; });
562
+ (0, testing_1.assert)(!!emailDeleteThread_1, "Email thread for deletion test should be found");
563
+ (0, testing_1.assert)(((_r = emailDeleteThread_1.draftMessageIds) === null || _r === void 0 ? void 0 : _r.includes(draftEmailToDelete.id)) === true, "Draft Email ID should be in draftMessageIds before deletion. Got: ".concat(JSON.stringify(emailDeleteThread_1.draftMessageIds)));
564
+ // Delete the draft email
565
+ return [4 /*yield*/, sdk.api.emails.deleteOne(draftEmailToDelete.id)
566
+ // Wait for the delete side effect to process
567
+ ];
568
+ case 48:
569
+ // Delete the draft email
570
+ _v.sent();
571
+ // Wait for the delete side effect to process
572
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 500)
573
+ // Verify the draft ID has been removed
574
+ ];
575
+ case 49:
576
+ // Wait for the delete side effect to process
577
+ _v.sent();
578
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
579
+ case 50:
580
+ loadedThreads10b = _v.sent();
581
+ emailDeleteThreadAfter = loadedThreads10b.threads.find(function (t) { return t.id === emailDeleteThread_1.id; });
582
+ (0, testing_1.assert)(!!emailDeleteThreadAfter, "Email thread should still exist after draft deletion");
583
+ (0, testing_1.assert)(((_s = emailDeleteThreadAfter.draftMessageIds) === null || _s === void 0 ? void 0 : _s.includes(draftEmailToDelete.id)) === false, "Draft Email ID should be REMOVED from draftMessageIds after deletion. Got: ".concat(JSON.stringify(emailDeleteThreadAfter.draftMessageIds)));
584
+ console.log("✅ Email draft deletion cleanup test passed");
585
+ // Test 11: Chat draft deletion should remove ID from draftMessageIds
586
+ console.log("Testing chat draft deletion cleanup...");
587
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({
588
+ userIds: [testUser.id],
589
+ enduserIds: [testEnduser.id],
590
+ })
591
+ // Create a non-draft message first to establish the room
592
+ ];
593
+ case 51:
594
+ chatRoomForDeletion = _v.sent();
595
+ // Create a non-draft message first to establish the room
596
+ return [4 /*yield*/, sdk.api.chats.createOne({
597
+ roomId: chatRoomForDeletion.id,
598
+ message: "Initial message to establish room for deletion test",
599
+ senderId: testEnduser.id,
600
+ })
601
+ // Create a draft chat message
602
+ ];
603
+ case 52:
604
+ // Create a non-draft message first to establish the room
605
+ _v.sent();
606
+ farFuture2 = new Date(Date.now() + 100 * 365 * 24 * 60 * 60 * 1000);
607
+ return [4 /*yield*/, sdk.api.chats.createOne({
608
+ roomId: chatRoomForDeletion.id,
609
+ message: "This draft chat will be deleted",
610
+ senderId: testUser.id,
611
+ isDraft: true,
612
+ sendAt: farFuture2,
613
+ })
614
+ // Build threads to create the Chat thread
615
+ ];
616
+ case 53:
617
+ draftChatToDelete = _v.sent();
618
+ // Build threads to create the Chat thread
619
+ return [4 /*yield*/, resetAndBuildThreads()];
620
+ case 54:
621
+ // Build threads to create the Chat thread
622
+ _v.sent();
623
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
624
+ case 55:
625
+ loadedThreads11a = _v.sent();
626
+ chatDeleteThread_1 = loadedThreads11a.threads.find(function (t) { var _a; return t.type === 'Chat' && ((_a = t.enduserIds) === null || _a === void 0 ? void 0 : _a.includes(testEnduser.id)); });
627
+ (0, testing_1.assert)(!!chatDeleteThread_1, "Chat thread for deletion test should be found");
628
+ // Manually add the draft ID to draftMessageIds (since chat threads don't auto-populate this)
629
+ return [4 /*yield*/, sdk.api.inbox_threads.updateOne(chatDeleteThread_1.id, {
630
+ draftMessageIds: [draftChatToDelete.id],
631
+ })
632
+ // Verify manual setup worked
633
+ ];
634
+ case 56:
635
+ // Manually add the draft ID to draftMessageIds (since chat threads don't auto-populate this)
636
+ _v.sent();
637
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
638
+ case 57:
639
+ loadedThreads11b = _v.sent();
640
+ chatDeleteThreadWithDraft = loadedThreads11b.threads.find(function (t) { return t.id === chatDeleteThread_1.id; });
641
+ (0, testing_1.assert)(((_t = chatDeleteThreadWithDraft.draftMessageIds) === null || _t === void 0 ? void 0 : _t.includes(draftChatToDelete.id)) === true, "Draft chat ID should be in draftMessageIds after manual setup. Got: ".concat(JSON.stringify(chatDeleteThreadWithDraft.draftMessageIds)));
642
+ // Delete the draft chat
643
+ return [4 /*yield*/, sdk.api.chats.deleteOne(draftChatToDelete.id)
644
+ // Wait for the delete side effect to process
645
+ ];
646
+ case 58:
647
+ // Delete the draft chat
648
+ _v.sent();
649
+ // Wait for the delete side effect to process
650
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 500)
651
+ // Verify the draft ID has been removed
652
+ ];
653
+ case 59:
654
+ // Wait for the delete side effect to process
655
+ _v.sent();
656
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
657
+ case 60:
658
+ loadedThreads11c = _v.sent();
659
+ chatDeleteThreadAfter = loadedThreads11c.threads.find(function (t) { return t.id === chatDeleteThread_1.id; });
660
+ (0, testing_1.assert)(!!chatDeleteThreadAfter, "Chat thread should still exist after draft deletion");
661
+ (0, testing_1.assert)(((_u = chatDeleteThreadAfter.draftMessageIds) === null || _u === void 0 ? void 0 : _u.includes(draftChatToDelete.id)) === false, "Draft Chat ID should be REMOVED from draftMessageIds after deletion. Got: ".concat(JSON.stringify(chatDeleteThreadAfter.draftMessageIds)));
662
+ console.log("✅ Chat draft deletion cleanup test passed");
663
+ // Cleanup deletion test chat room
664
+ return [4 /*yield*/, sdk.api.chat_rooms.deleteOne(chatRoomForDeletion.id).catch(console.error)];
665
+ case 61:
666
+ // Cleanup deletion test chat room
667
+ _v.sent();
668
+ console.log("🎉 All InboxThread draft/scheduled tests passed!");
669
+ return [3 /*break*/, 66];
670
+ case 62:
671
+ // Cleanup
672
+ return [4 /*yield*/, sdk.api.inbox_threads.reset_threads().catch(console.error)];
673
+ case 63:
674
+ // Cleanup
675
+ _v.sent();
676
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(testEnduser.id).catch(console.error)];
677
+ case 64:
678
+ _v.sent();
679
+ return [4 /*yield*/, sdk.api.users.deleteOne(testUser.id).catch(console.error)];
680
+ case 65:
681
+ _v.sent();
682
+ return [7 /*endfinally*/];
683
+ case 66: return [2 /*return*/];
684
+ }
685
+ });
686
+ });
687
+ };
688
+ exports.inbox_thread_draft_scheduled_tests = inbox_thread_draft_scheduled_tests;
689
+ // Allow running this test file independently
690
+ if (require.main === module) {
691
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
692
+ var sdk_2 = new sdk_1.Session({ host: host });
693
+ var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
694
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
695
+ return __generator(this, function (_a) {
696
+ switch (_a.label) {
697
+ case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
698
+ case 1:
699
+ _a.sent();
700
+ return [4 /*yield*/, (0, exports.inbox_thread_draft_scheduled_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
701
+ case 2:
702
+ _a.sent();
703
+ return [2 /*return*/];
704
+ }
705
+ });
706
+ }); };
707
+ runTests()
708
+ .then(function () {
709
+ console.log("✅ InboxThread draft/scheduled test suite completed successfully");
710
+ process.exit(0);
711
+ })
712
+ .catch(function (error) {
713
+ console.error("❌ InboxThread draft/scheduled test suite failed:", error);
714
+ process.exit(1);
715
+ });
716
+ }
717
+ //# sourceMappingURL=inbox_thread_draft_scheduled.test.js.map