@tellescope/sdk 1.237.3 → 1.237.4

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.
@@ -0,0 +1,435 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import { Session } from "../../sdk";
39
+ import { assert, log_header, } from "@tellescope/testing";
40
+ import { setup_tests } from "../setup";
41
+ var host = process.env.API_URL || 'http://localhost:8080';
42
+ export var inbox_thread_status_preservation_tests = function (_a) {
43
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
44
+ return __awaiter(void 0, void 0, void 0, function () {
45
+ var timestamp, from, testEnduser, resetAndBuildThreads, inboundSMS1, threadsAfterInbound, smsThread, threadAfterStatusUpdate, outboundSMS1, threadAfterOutbound, emailSubject, inboundEmail, threadsAfterEmail, emailThread, outboundEmail, emailThreadAfterOutbound, inboundSMS3a, threadsForTest3, smsThread3, threadBeforeNewInbound, inboundSMS3b, threadAfterNewInbound, outboundOnlyEnduser_1, outboundOnly1, threadsForTest4, outboundOnlyThread, outboundOnly2, outboundThreadAfterSecond, err_1;
46
+ return __generator(this, function (_b) {
47
+ switch (_b.label) {
48
+ case 0:
49
+ log_header("InboxThread Status Preservation Tests");
50
+ timestamp = Date.now();
51
+ from = new Date(Date.now() - 60000) // 1 minute ago
52
+ ;
53
+ return [4 /*yield*/, sdk.api.endusers.createOne({
54
+ fname: "Test",
55
+ lname: "Patient",
56
+ email: "test-inbox-status-".concat(timestamp, "@test.com"),
57
+ phone: "+1555".concat(timestamp.toString().slice(-7)),
58
+ })
59
+ // Helper to reset and rebuild threads (same pattern as inbox_thread_draft_scheduled.test.ts)
60
+ ];
61
+ case 1:
62
+ testEnduser = _b.sent();
63
+ resetAndBuildThreads = function () { return __awaiter(void 0, void 0, void 0, function () {
64
+ return __generator(this, function (_a) {
65
+ switch (_a.label) {
66
+ case 0: return [4 /*yield*/, sdk.api.inbox_threads.reset_threads()];
67
+ case 1:
68
+ _a.sent();
69
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })];
70
+ case 2:
71
+ _a.sent();
72
+ return [2 /*return*/];
73
+ }
74
+ });
75
+ }); };
76
+ _b.label = 2;
77
+ case 2:
78
+ _b.trys.push([2, , 39, 43]);
79
+ // Test 1: Outbound SMS should NOT reset inboxStatus
80
+ console.log("Test 1: Outbound SMS should NOT reset inboxStatus...");
81
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
82
+ message: "Inbound test message",
83
+ enduserId: testEnduser.id,
84
+ inbound: true,
85
+ phoneNumber: "+15550001111",
86
+ enduserPhoneNumber: testEnduser.phone,
87
+ logOnly: true,
88
+ })
89
+ // Build initial threads
90
+ ];
91
+ case 3:
92
+ inboundSMS1 = _b.sent();
93
+ // Build initial threads
94
+ return [4 /*yield*/, resetAndBuildThreads()
95
+ // Find the created thread
96
+ ];
97
+ case 4:
98
+ // Build initial threads
99
+ _b.sent();
100
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
101
+ case 5:
102
+ threadsAfterInbound = _b.sent();
103
+ smsThread = threadsAfterInbound.threads.find(function (t) {
104
+ return t.type === 'SMS' && t.enduserIds.includes(testEnduser.id) && t.phoneNumber === "+15550001111";
105
+ });
106
+ assert(!!smsThread, "SMS thread should be created from inbound message");
107
+ assert(smsThread.inboxStatus === 'New', "Initial status should be 'New', got '".concat(smsThread.inboxStatus, "'"));
108
+ // Update thread status to "Resolved"
109
+ return [4 /*yield*/, sdk.api.inbox_threads.updateOne(smsThread.id, { inboxStatus: "Resolved" })
110
+ // Verify status was updated
111
+ ];
112
+ case 6:
113
+ // Update thread status to "Resolved"
114
+ _b.sent();
115
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [smsThread.id] })];
116
+ case 7:
117
+ threadAfterStatusUpdate = (_b.sent()).threads[0];
118
+ assert(threadAfterStatusUpdate.inboxStatus === 'Resolved', "Status should be 'Resolved' after update, got '".concat(threadAfterStatusUpdate.inboxStatus, "'"));
119
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
120
+ message: "Outbound reply message",
121
+ enduserId: testEnduser.id,
122
+ inbound: false,
123
+ phoneNumber: "+15550001111",
124
+ enduserPhoneNumber: testEnduser.phone,
125
+ logOnly: true,
126
+ })
127
+ // Rebuild threads - status should remain "Resolved"
128
+ ];
129
+ case 8:
130
+ outboundSMS1 = _b.sent();
131
+ // Rebuild threads - status should remain "Resolved"
132
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })
133
+ // Verify status was NOT reset
134
+ ];
135
+ case 9:
136
+ // Rebuild threads - status should remain "Resolved"
137
+ _b.sent();
138
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [smsThread.id] })];
139
+ case 10:
140
+ threadAfterOutbound = (_b.sent()).threads[0];
141
+ assert(threadAfterOutbound.inboxStatus === 'Resolved', "Status should remain 'Resolved' after outbound message, got '".concat(threadAfterOutbound.inboxStatus, "'"));
142
+ assert(!!threadAfterOutbound.outboundTimestamp, "outboundTimestamp should be set after outbound message");
143
+ assert(threadAfterOutbound.outboundPreview === "Outbound reply message", "outboundPreview should be updated, got '".concat(threadAfterOutbound.outboundPreview, "'"));
144
+ console.log("Test 1 passed: Outbound SMS does NOT reset inboxStatus");
145
+ // Clean up test 1 resources
146
+ return [4 /*yield*/, Promise.all([
147
+ sdk.api.sms_messages.deleteOne(inboundSMS1.id),
148
+ sdk.api.sms_messages.deleteOne(outboundSMS1.id),
149
+ sdk.api.inbox_threads.deleteOne(smsThread.id),
150
+ ])
151
+ // Test 2: Outbound Email should NOT reset inboxStatus
152
+ ];
153
+ case 11:
154
+ // Clean up test 1 resources
155
+ _b.sent();
156
+ // Test 2: Outbound Email should NOT reset inboxStatus
157
+ console.log("Test 2: Outbound Email should NOT reset inboxStatus...");
158
+ emailSubject = "Test Email Status ".concat(timestamp);
159
+ return [4 /*yield*/, sdk.api.emails.createOne({
160
+ subject: emailSubject,
161
+ textContent: "Inbound test email content",
162
+ enduserId: testEnduser.id,
163
+ messageId: "inbound-email-".concat(timestamp),
164
+ inbound: true,
165
+ logOnly: true,
166
+ })
167
+ // Build threads
168
+ ];
169
+ case 12:
170
+ inboundEmail = _b.sent();
171
+ // Build threads
172
+ return [4 /*yield*/, resetAndBuildThreads()
173
+ // Find the created email thread
174
+ ];
175
+ case 13:
176
+ // Build threads
177
+ _b.sent();
178
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
179
+ case 14:
180
+ threadsAfterEmail = _b.sent();
181
+ emailThread = threadsAfterEmail.threads.find(function (t) {
182
+ return t.type === 'Email' && t.enduserIds.includes(testEnduser.id);
183
+ });
184
+ assert(!!emailThread, "Email thread should be created from inbound email");
185
+ // Update thread status to "In Progress"
186
+ return [4 /*yield*/, sdk.api.inbox_threads.updateOne(emailThread.id, { inboxStatus: "In Progress" })
187
+ // Create outbound email reply (should NOT reset status)
188
+ ];
189
+ case 15:
190
+ // Update thread status to "In Progress"
191
+ _b.sent();
192
+ return [4 /*yield*/, sdk.api.emails.createOne({
193
+ subject: "Re: ".concat(emailSubject),
194
+ textContent: "Outbound reply email content",
195
+ enduserId: testEnduser.id,
196
+ messageId: "outbound-email-".concat(timestamp),
197
+ inbound: false,
198
+ logOnly: true,
199
+ })
200
+ // Rebuild threads - status should remain "In Progress"
201
+ ];
202
+ case 16:
203
+ outboundEmail = _b.sent();
204
+ // Rebuild threads - status should remain "In Progress"
205
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })
206
+ // Verify status was NOT reset
207
+ ];
208
+ case 17:
209
+ // Rebuild threads - status should remain "In Progress"
210
+ _b.sent();
211
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [emailThread.id] })];
212
+ case 18:
213
+ emailThreadAfterOutbound = (_b.sent()).threads[0];
214
+ assert(emailThreadAfterOutbound.inboxStatus === 'In Progress', "Email status should remain 'In Progress' after outbound, got '".concat(emailThreadAfterOutbound.inboxStatus, "'"));
215
+ console.log("Test 2 passed: Outbound Email does NOT reset inboxStatus");
216
+ // Clean up test 2 resources
217
+ return [4 /*yield*/, Promise.all([
218
+ sdk.api.emails.deleteOne(inboundEmail.id),
219
+ sdk.api.emails.deleteOne(outboundEmail.id),
220
+ sdk.api.inbox_threads.deleteOne(emailThread.id),
221
+ ])
222
+ // Test 3: Inbound SMS SHOULD update inboxStatus
223
+ ];
224
+ case 19:
225
+ // Clean up test 2 resources
226
+ _b.sent();
227
+ // Test 3: Inbound SMS SHOULD update inboxStatus
228
+ console.log("Test 3: New inbound SMS SHOULD update inboxStatus...");
229
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
230
+ message: "First inbound message",
231
+ enduserId: testEnduser.id,
232
+ inbound: true,
233
+ phoneNumber: "+15550003333",
234
+ enduserPhoneNumber: testEnduser.phone,
235
+ logOnly: true,
236
+ })
237
+ // Build threads
238
+ ];
239
+ case 20:
240
+ inboundSMS3a = _b.sent();
241
+ // Build threads
242
+ return [4 /*yield*/, resetAndBuildThreads()
243
+ // Find the thread
244
+ ];
245
+ case 21:
246
+ // Build threads
247
+ _b.sent();
248
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
249
+ case 22:
250
+ threadsForTest3 = _b.sent();
251
+ smsThread3 = threadsForTest3.threads.find(function (t) {
252
+ return t.type === 'SMS' && t.enduserIds.includes(testEnduser.id) && t.phoneNumber === "+15550003333";
253
+ });
254
+ assert(!!smsThread3, "SMS thread should be created");
255
+ // Update thread status to "Resolved"
256
+ return [4 /*yield*/, sdk.api.inbox_threads.updateOne(smsThread3.id, { inboxStatus: "Resolved" })
257
+ // Verify status was updated
258
+ ];
259
+ case 23:
260
+ // Update thread status to "Resolved"
261
+ _b.sent();
262
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [smsThread3.id] })];
263
+ case 24:
264
+ threadBeforeNewInbound = (_b.sent()).threads[0];
265
+ assert(threadBeforeNewInbound.inboxStatus === 'Resolved', "Status should be 'Resolved' before new inbound");
266
+ // Create NEW inbound SMS with default "New" status
267
+ // Wait to ensure ObjectId timestamps are in different seconds (MongoDB ObjectIds have second-level precision)
268
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1100); })];
269
+ case 25:
270
+ // Create NEW inbound SMS with default "New" status
271
+ // Wait to ensure ObjectId timestamps are in different seconds (MongoDB ObjectIds have second-level precision)
272
+ _b.sent();
273
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
274
+ message: "Second inbound message - should reset status",
275
+ enduserId: testEnduser.id,
276
+ inbound: true,
277
+ phoneNumber: "+15550003333",
278
+ enduserPhoneNumber: testEnduser.phone,
279
+ inboxStatus: "New",
280
+ logOnly: true,
281
+ })
282
+ // Rebuild threads - status SHOULD be updated from new inbound
283
+ ];
284
+ case 26:
285
+ inboundSMS3b = _b.sent();
286
+ // Rebuild threads - status SHOULD be updated from new inbound
287
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })
288
+ // Verify status WAS updated from new inbound
289
+ ];
290
+ case 27:
291
+ // Rebuild threads - status SHOULD be updated from new inbound
292
+ _b.sent();
293
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [smsThread3.id] })];
294
+ case 28:
295
+ threadAfterNewInbound = (_b.sent()).threads[0];
296
+ assert(threadAfterNewInbound.inboxStatus === 'New', "Status SHOULD be 'New' after new inbound message, got '".concat(threadAfterNewInbound.inboxStatus, "'"));
297
+ console.log("Test 3 passed: New inbound SMS DOES update inboxStatus");
298
+ // Clean up test 3 resources
299
+ return [4 /*yield*/, Promise.all([
300
+ sdk.api.sms_messages.deleteOne(inboundSMS3a.id),
301
+ sdk.api.sms_messages.deleteOne(inboundSMS3b.id),
302
+ sdk.api.inbox_threads.deleteOne(smsThread3.id),
303
+ ])
304
+ // Test 4: Outbound-only thread should keep default status
305
+ ];
306
+ case 29:
307
+ // Clean up test 3 resources
308
+ _b.sent();
309
+ // Test 4: Outbound-only thread should keep default status
310
+ console.log("Test 4: Outbound-only thread should keep default status...");
311
+ return [4 /*yield*/, sdk.api.endusers.createOne({
312
+ fname: "Outbound",
313
+ lname: "Only",
314
+ email: "outbound-only-".concat(timestamp, "@test.com"),
315
+ phone: "+1555".concat((timestamp + 1).toString().slice(-7)),
316
+ })
317
+ // Create outbound-only SMS (no prior inbound)
318
+ ];
319
+ case 30:
320
+ outboundOnlyEnduser_1 = _b.sent();
321
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
322
+ message: "First outbound message",
323
+ enduserId: outboundOnlyEnduser_1.id,
324
+ inbound: false,
325
+ phoneNumber: "+15550004444",
326
+ enduserPhoneNumber: outboundOnlyEnduser_1.phone,
327
+ logOnly: true,
328
+ })
329
+ // Build threads - should create thread with default "New" status
330
+ ];
331
+ case 31:
332
+ outboundOnly1 = _b.sent();
333
+ // Build threads - should create thread with default "New" status
334
+ return [4 /*yield*/, resetAndBuildThreads()
335
+ // Find the thread
336
+ ];
337
+ case 32:
338
+ // Build threads - should create thread with default "New" status
339
+ _b.sent();
340
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({})];
341
+ case 33:
342
+ threadsForTest4 = _b.sent();
343
+ outboundOnlyThread = threadsForTest4.threads.find(function (t) {
344
+ return t.type === 'SMS' && t.enduserIds.includes(outboundOnlyEnduser_1.id) && t.phoneNumber === "+15550004444";
345
+ });
346
+ assert(!!outboundOnlyThread, "Outbound-only thread should be created");
347
+ assert(outboundOnlyThread.inboxStatus === 'New', "Outbound-only thread should have 'New' status, got '".concat(outboundOnlyThread.inboxStatus, "'"));
348
+ // Create another outbound SMS
349
+ // Wait to ensure ObjectId timestamps are in different seconds (MongoDB ObjectIds have second-level precision)
350
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1100); })];
351
+ case 34:
352
+ // Create another outbound SMS
353
+ // Wait to ensure ObjectId timestamps are in different seconds (MongoDB ObjectIds have second-level precision)
354
+ _b.sent();
355
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
356
+ message: "Second outbound message",
357
+ enduserId: outboundOnlyEnduser_1.id,
358
+ inbound: false,
359
+ phoneNumber: "+15550004444",
360
+ enduserPhoneNumber: outboundOnlyEnduser_1.phone,
361
+ logOnly: true,
362
+ })
363
+ // Rebuild threads - status should remain "New" (not reset, just unchanged)
364
+ ];
365
+ case 35:
366
+ outboundOnly2 = _b.sent();
367
+ // Rebuild threads - status should remain "New" (not reset, just unchanged)
368
+ return [4 /*yield*/, sdk.api.inbox_threads.build_threads({ from: from, to: new Date() })
369
+ // Verify status remains "New"
370
+ ];
371
+ case 36:
372
+ // Rebuild threads - status should remain "New" (not reset, just unchanged)
373
+ _b.sent();
374
+ return [4 /*yield*/, sdk.api.inbox_threads.load_threads({ ids: [outboundOnlyThread.id] })];
375
+ case 37:
376
+ outboundThreadAfterSecond = (_b.sent()).threads[0];
377
+ assert(outboundThreadAfterSecond.inboxStatus === 'New', "Outbound-only thread status should remain 'New', got '".concat(outboundThreadAfterSecond.inboxStatus, "'"));
378
+ console.log("Test 4 passed: Outbound-only thread keeps default status");
379
+ // Clean up test 4 resources
380
+ return [4 /*yield*/, Promise.all([
381
+ sdk.api.sms_messages.deleteOne(outboundOnly1.id),
382
+ sdk.api.sms_messages.deleteOne(outboundOnly2.id),
383
+ sdk.api.inbox_threads.deleteOne(outboundOnlyThread.id),
384
+ sdk.api.endusers.deleteOne(outboundOnlyEnduser_1.id),
385
+ ])];
386
+ case 38:
387
+ // Clean up test 4 resources
388
+ _b.sent();
389
+ console.log("All InboxThread status preservation tests passed!");
390
+ return [3 /*break*/, 43];
391
+ case 39:
392
+ _b.trys.push([39, 41, , 42]);
393
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(testEnduser.id)];
394
+ case 40:
395
+ _b.sent();
396
+ return [3 /*break*/, 42];
397
+ case 41:
398
+ err_1 = _b.sent();
399
+ console.error("Cleanup error:", err_1);
400
+ return [3 /*break*/, 42];
401
+ case 42: return [7 /*endfinally*/];
402
+ case 43: return [2 /*return*/];
403
+ }
404
+ });
405
+ });
406
+ };
407
+ // Allow running this test file independently
408
+ if (require.main === module) {
409
+ console.log("Using API URL: ".concat(host));
410
+ var sdk_1 = new Session({ host: host });
411
+ var sdkNonAdmin_1 = new Session({ host: host });
412
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
413
+ return __generator(this, function (_a) {
414
+ switch (_a.label) {
415
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
416
+ case 1:
417
+ _a.sent();
418
+ return [4 /*yield*/, inbox_thread_status_preservation_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
419
+ case 2:
420
+ _a.sent();
421
+ return [2 /*return*/];
422
+ }
423
+ });
424
+ }); };
425
+ runTests()
426
+ .then(function () {
427
+ console.log("InboxThread status preservation test suite completed successfully");
428
+ process.exit(0);
429
+ })
430
+ .catch(function (error) {
431
+ console.error("InboxThread status preservation test suite failed:", error);
432
+ process.exit(1);
433
+ });
434
+ }
435
+ //# sourceMappingURL=inbox_thread_status_preservation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox_thread_status_preservation.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/inbox_thread_status_preservation.test.ts"],"names":[],"mappings":"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"}
@@ -14120,7 +14120,7 @@ var updatedAt_tests = function () { return __awaiter(void 0, void 0, void 0, fun
14120
14120
  });
14121
14121
  }); };
14122
14122
  var replace_enduser_template_values_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
14123
- var enduser, d;
14123
+ var enduser, d, enduserWithVitals;
14124
14124
  return __generator(this, function (_a) {
14125
14125
  switch (_a.label) {
14126
14126
  case 0:
@@ -14136,8 +14136,27 @@ var replace_enduser_template_values_tests = function () { return __awaiter(void
14136
14136
  assert(replace_enduser_template_values('{{enduser.UnknownCustomField}}', enduser) === '{{enduser.UnknownCustomField}}', 'fail UnknownCustomField', 'UnknownCustomField');
14137
14137
  d = Date.now();
14138
14138
  assert(replace_enduser_template_values(d, enduser) === d, 'fail non-string', 'non-string');
14139
- return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
14139
+ return [4 /*yield*/, sdk.api.endusers.createOne({
14140
+ fname: "Vitals",
14141
+ height: { value: 72, unit: 'inches' },
14142
+ weight: { value: 180, unit: 'lbs' }
14143
+ })];
14140
14144
  case 2:
14145
+ enduserWithVitals = _a.sent();
14146
+ assert(replace_enduser_template_values('{{enduser.height.value}}', enduserWithVitals) === '72', 'fail height.value', 'height.value');
14147
+ assert(replace_enduser_template_values('{{enduser.height.unit}}', enduserWithVitals) === 'inches', 'fail height.unit', 'height.unit');
14148
+ assert(replace_enduser_template_values('{{enduser.weight.value}}', enduserWithVitals) === '180', 'fail weight.value', 'weight.value');
14149
+ assert(replace_enduser_template_values('{{enduser.weight.unit}}', enduserWithVitals) === 'lbs', 'fail weight.unit', 'weight.unit');
14150
+ // Test undefined safeguards - enduser without height/weight should return empty string
14151
+ assert(replace_enduser_template_values('{{enduser.height.value}}', enduser) === '', 'fail undefined height.value', 'undefined height.value');
14152
+ assert(replace_enduser_template_values('{{enduser.height.unit}}', enduser) === '', 'fail undefined height.unit', 'undefined height.unit');
14153
+ assert(replace_enduser_template_values('{{enduser.weight.value}}', enduser) === '', 'fail undefined weight.value', 'undefined weight.value');
14154
+ assert(replace_enduser_template_values('{{enduser.weight.unit}}', enduser) === '', 'fail undefined weight.unit', 'undefined weight.unit');
14155
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserWithVitals.id)];
14156
+ case 3:
14157
+ _a.sent();
14158
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
14159
+ case 4:
14141
14160
  _a.sent();
14142
14161
  return [2 /*return*/];
14143
14162
  }