@tellescope/sdk 1.250.1 → 1.250.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 (42) hide show
  1. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.d.ts.map +1 -1
  2. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js +28 -15
  3. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  4. package/lib/cjs/tests/api_tests/medication_added_trigger.test.d.ts.map +1 -1
  5. package/lib/cjs/tests/api_tests/medication_added_trigger.test.js +556 -105
  6. package/lib/cjs/tests/api_tests/medication_added_trigger.test.js.map +1 -1
  7. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.d.ts +7 -0
  8. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.d.ts.map +1 -0
  9. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.js +436 -0
  10. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.js.map +1 -0
  11. package/lib/cjs/tests/tests.d.ts.map +1 -1
  12. package/lib/cjs/tests/tests.js +149 -141
  13. package/lib/cjs/tests/tests.js.map +1 -1
  14. package/lib/cjs/tests/unit_tests/conditional_logic_medication.test.d.ts +3 -0
  15. package/lib/cjs/tests/unit_tests/conditional_logic_medication.test.d.ts.map +1 -0
  16. package/lib/cjs/tests/unit_tests/conditional_logic_medication.test.js +114 -0
  17. package/lib/cjs/tests/unit_tests/conditional_logic_medication.test.js.map +1 -0
  18. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.d.ts.map +1 -1
  19. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js +28 -15
  20. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  21. package/lib/esm/tests/api_tests/medication_added_trigger.test.d.ts.map +1 -1
  22. package/lib/esm/tests/api_tests/medication_added_trigger.test.js +556 -105
  23. package/lib/esm/tests/api_tests/medication_added_trigger.test.js.map +1 -1
  24. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.d.ts +7 -0
  25. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.d.ts.map +1 -0
  26. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.js +432 -0
  27. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.js.map +1 -0
  28. package/lib/esm/tests/tests.d.ts.map +1 -1
  29. package/lib/esm/tests/tests.js +149 -141
  30. package/lib/esm/tests/tests.js.map +1 -1
  31. package/lib/esm/tests/unit_tests/conditional_logic_medication.test.d.ts +3 -0
  32. package/lib/esm/tests/unit_tests/conditional_logic_medication.test.d.ts.map +1 -0
  33. package/lib/esm/tests/unit_tests/conditional_logic_medication.test.js +111 -0
  34. package/lib/esm/tests/unit_tests/conditional_logic_medication.test.js.map +1 -0
  35. package/lib/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +10 -10
  37. package/src/tests/api_tests/enduser_cross_access_isolation.test.ts +26 -0
  38. package/src/tests/api_tests/medication_added_trigger.test.ts +345 -4
  39. package/src/tests/api_tests/outbound_chat_sent_trigger.test.ts +339 -0
  40. package/src/tests/tests.ts +5 -1
  41. package/src/tests/unit_tests/conditional_logic_medication.test.ts +133 -0
  42. package/test_generated.pdf +0 -0
@@ -42,9 +42,9 @@ var host = process.env.API_URL || "http://localhost:8080";
42
42
  export var medication_added_trigger_tests = function (_a) {
43
43
  var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
44
44
  return __awaiter(void 0, void 0, void 0, function () {
45
- var t1, t2, t3, t4, t5, enduser1, enduser2, enduser3, enduser4, enduser5, enduser6, med1, med2, med3, med4, med5, med6, belugaForm, belugaEnduser, belugaFormResponse, belugaTrigger, webhookResponse, _b, _c, _d, belugaMeds, belugaMed, setFieldsTrigger, setFieldsEnduser, setFieldsMed, setFieldsTriggerFiltered, setFieldsEnduser2, setFieldsMed2;
46
- return __generator(this, function (_e) {
47
- switch (_e.label) {
45
+ var t1, t2, t3, t4, t5, enduser1, enduser2, enduser3, enduser4, enduser5, enduser6, med1, med2, med3, med4, med5, med6, belugaForm, belugaEnduser, belugaFormResponse, belugaTrigger, webhookResponse, _b, _c, _d, belugaMeds, belugaMedSemaglutide, belugaMedMetformin, belugaFormNoCategory, belugaEnduserNoCategory, belugaFormResponseNoCategory, webhookResponseNoCategory, _e, _f, _g, belugaMedsNoCategory, belugaMedNoCategory, setFieldsTrigger, setFieldsEnduser, setFieldsMed, setFieldsTriggerFiltered, setFieldsEnduser2, setFieldsMed2, setFieldsCategoryTrigger, setFieldsCategoryEnduser, setFieldsCategoryMed, setFieldsCategoryEnduserEmpty, setFieldsCategoryMedEmpty, c1Trigger, c1MatchEnduser, c1MissEnduser, c2Trigger, c2MatchEnduser, c2MissEnduser, c3Trigger, c3MatchEnduser, c3MissEnduser, c4Trigger, c4MatchA, c4MatchB, c4Miss, c5Trigger, c5Match, c5Miss, c6Trigger, c6Match;
46
+ return __generator(this, function (_h) {
47
+ switch (_h.label) {
48
48
  case 0:
49
49
  log_header("Automation Trigger Tests (Medication Added)");
50
50
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
@@ -56,7 +56,7 @@ export var medication_added_trigger_tests = function (_a) {
56
56
  // T2: Title filter only
57
57
  ];
58
58
  case 1:
59
- t1 = _e.sent();
59
+ t1 = _h.sent();
60
60
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
61
61
  event: { type: 'Medication Added', info: { titles: ['Lisinopril'], protocols: [] } },
62
62
  action: { type: 'Add Tags', info: { tags: ['Med-Title-Match'] } },
@@ -66,7 +66,7 @@ export var medication_added_trigger_tests = function (_a) {
66
66
  // T3: Protocol filter only
67
67
  ];
68
68
  case 2:
69
- t2 = _e.sent();
69
+ t2 = _h.sent();
70
70
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
71
71
  event: { type: 'Medication Added', info: { titles: [], protocols: ['Weight Loss'] } },
72
72
  action: { type: 'Add Tags', info: { tags: ['Med-Protocol-Match'] } },
@@ -76,7 +76,7 @@ export var medication_added_trigger_tests = function (_a) {
76
76
  // T4: Title + protocol filter
77
77
  ];
78
78
  case 3:
79
- t3 = _e.sent();
79
+ t3 = _h.sent();
80
80
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
81
81
  event: { type: 'Medication Added', info: { titles: ['Metformin'], protocols: ['Diabetes'] } },
82
82
  action: { type: 'Add Tags', info: { tags: ['Med-Title-And-Protocol'] } },
@@ -86,7 +86,7 @@ export var medication_added_trigger_tests = function (_a) {
86
86
  // T5: Protocol filter that won't match
87
87
  ];
88
88
  case 4:
89
- t4 = _e.sent();
89
+ t4 = _h.sent();
90
90
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
91
91
  event: { type: 'Medication Added', info: { titles: [], protocols: ['Dermatology'] } },
92
92
  action: { type: 'Add Tags', info: { tags: ['Med-Derm-Protocol'] } },
@@ -96,154 +96,154 @@ export var medication_added_trigger_tests = function (_a) {
96
96
  // Create separate endusers to avoid trigger throttling (1 minute per trigger per enduser)
97
97
  ];
98
98
  case 5:
99
- t5 = _e.sent();
99
+ t5 = _h.sent();
100
100
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
101
101
  case 6:
102
- enduser1 = _e.sent();
102
+ enduser1 = _h.sent();
103
103
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
104
104
  case 7:
105
- enduser2 = _e.sent();
105
+ enduser2 = _h.sent();
106
106
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
107
107
  case 8:
108
- enduser3 = _e.sent();
108
+ enduser3 = _h.sent();
109
109
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
110
110
  case 9:
111
- enduser4 = _e.sent();
111
+ enduser4 = _h.sent();
112
112
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
113
113
  case 10:
114
- enduser5 = _e.sent();
114
+ enduser5 = _h.sent();
115
115
  return [4 /*yield*/, sdk.api.endusers.createOne({})
116
116
  // Test 1: Any medication — empty titles + empty protocols → fires for any medication
117
117
  ];
118
118
  case 11:
119
- enduser6 = _e.sent();
119
+ enduser6 = _h.sent();
120
120
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
121
121
  enduserId: enduser1.id,
122
122
  title: 'Aspirin',
123
123
  })];
124
124
  case 12:
125
- med1 = _e.sent();
125
+ med1 = _h.sent();
126
126
  return [4 /*yield*/, wait(undefined, 500)];
127
127
  case 13:
128
- _e.sent();
128
+ _h.sent();
129
129
  return [4 /*yield*/, async_test("Medication Added - Any medication (no filters)", function () { return sdk.api.endusers.getOne(enduser1.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Any')); } })
130
130
  // Test 2: Title filter only — matching title, no protocol filter → fires
131
131
  ];
132
132
  case 14:
133
- _e.sent();
133
+ _h.sent();
134
134
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
135
135
  enduserId: enduser2.id,
136
136
  title: 'Lisinopril',
137
137
  })];
138
138
  case 15:
139
- med2 = _e.sent();
139
+ med2 = _h.sent();
140
140
  return [4 /*yield*/, wait(undefined, 500)];
141
141
  case 16:
142
- _e.sent();
142
+ _h.sent();
143
143
  return [4 /*yield*/, async_test("Medication Added - Title filter match", function () { return sdk.api.endusers.getOne(enduser2.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Title-Match')); } })
144
144
  // Test 3: Protocol filter only — matching protocol, no title filter → fires
145
145
  ];
146
146
  case 17:
147
- _e.sent();
147
+ _h.sent();
148
148
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
149
149
  enduserId: enduser3.id,
150
150
  title: 'Semaglutide',
151
151
  protocol: 'Weight Loss',
152
152
  })];
153
153
  case 18:
154
- med3 = _e.sent();
154
+ med3 = _h.sent();
155
155
  return [4 /*yield*/, wait(undefined, 500)];
156
156
  case 19:
157
- _e.sent();
157
+ _h.sent();
158
158
  return [4 /*yield*/, async_test("Medication Added - Protocol filter match", function () { return sdk.api.endusers.getOne(enduser3.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Protocol-Match')); } })
159
159
  // Test 4: Title + protocol filter — both match → fires
160
160
  ];
161
161
  case 20:
162
- _e.sent();
162
+ _h.sent();
163
163
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
164
164
  enduserId: enduser4.id,
165
165
  title: 'Metformin',
166
166
  protocol: 'Diabetes',
167
167
  })];
168
168
  case 21:
169
- med4 = _e.sent();
169
+ med4 = _h.sent();
170
170
  return [4 /*yield*/, wait(undefined, 500)];
171
171
  case 22:
172
- _e.sent();
172
+ _h.sent();
173
173
  return [4 /*yield*/, async_test("Medication Added - Title and protocol filter match", function () { return sdk.api.endusers.getOne(enduser4.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Title-And-Protocol')); } })
174
174
  // Test 5: Non-matching protocol — protocol filter doesn't match → does NOT fire
175
175
  ];
176
176
  case 23:
177
- _e.sent();
177
+ _h.sent();
178
178
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
179
179
  enduserId: enduser5.id,
180
180
  title: 'Ibuprofen',
181
181
  protocol: 'Pain Management',
182
182
  })];
183
183
  case 24:
184
- med5 = _e.sent();
184
+ med5 = _h.sent();
185
185
  return [4 /*yield*/, wait(undefined, 500)];
186
186
  case 25:
187
- _e.sent();
187
+ _h.sent();
188
188
  return [4 /*yield*/, async_test("Medication Added - Non-matching protocol does NOT fire", function () { return sdk.api.endusers.getOne(enduser5.id); }, { onResult: function (e) { var _a, _b; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Any')) && !((_b = e.tags) === null || _b === void 0 ? void 0 : _b.includes('Med-Derm-Protocol')); } })
189
189
  // Test 6: No protocol on medication — trigger has protocol filter, medication has no protocol → does NOT fire
190
190
  ];
191
191
  case 26:
192
- _e.sent();
192
+ _h.sent();
193
193
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
194
194
  enduserId: enduser6.id,
195
195
  title: 'Amoxicillin',
196
196
  })];
197
197
  case 27:
198
- med6 = _e.sent();
198
+ med6 = _h.sent();
199
199
  return [4 /*yield*/, wait(undefined, 500)];
200
200
  case 28:
201
- _e.sent();
201
+ _h.sent();
202
202
  return [4 /*yield*/, async_test("Medication Added - No protocol on med, protocol filter does NOT fire", function () { return sdk.api.endusers.getOne(enduser6.id); }, { onResult: function (e) { var _a, _b, _c; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Any')) && !((_b = e.tags) === null || _b === void 0 ? void 0 : _b.includes('Med-Protocol-Match')) && !((_c = e.tags) === null || _c === void 0 ? void 0 : _c.includes('Med-Derm-Protocol')); } })];
203
203
  case 29:
204
- _e.sent();
205
- _e.label = 30;
204
+ _h.sent();
205
+ _h.label = 30;
206
206
  case 30:
207
- _e.trys.push([30, , 42, 43]);
207
+ _h.trys.push([30, , 42, 43]);
208
208
  // Clean up test data - triggers first
209
209
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(t1.id)];
210
210
  case 31:
211
211
  // Clean up test data - triggers first
212
- _e.sent();
212
+ _h.sent();
213
213
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(t2.id)];
214
214
  case 32:
215
- _e.sent();
215
+ _h.sent();
216
216
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(t3.id)];
217
217
  case 33:
218
- _e.sent();
218
+ _h.sent();
219
219
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(t4.id)];
220
220
  case 34:
221
- _e.sent();
221
+ _h.sent();
222
222
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(t5.id)
223
223
  // Clean up endusers (also cleans up medications)
224
224
  ];
225
225
  case 35:
226
- _e.sent();
226
+ _h.sent();
227
227
  // Clean up endusers (also cleans up medications)
228
228
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser1.id)];
229
229
  case 36:
230
230
  // Clean up endusers (also cleans up medications)
231
- _e.sent();
231
+ _h.sent();
232
232
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser2.id)];
233
233
  case 37:
234
- _e.sent();
234
+ _h.sent();
235
235
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser3.id)];
236
236
  case 38:
237
- _e.sent();
237
+ _h.sent();
238
238
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser4.id)];
239
239
  case 39:
240
- _e.sent();
240
+ _h.sent();
241
241
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser5.id)];
242
242
  case 40:
243
- _e.sent();
243
+ _h.sent();
244
244
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser6.id)];
245
245
  case 41:
246
- _e.sent();
246
+ _h.sent();
247
247
  return [3 /*break*/, 43];
248
248
  case 42: return [7 /*endfinally*/];
249
249
  case 43:
@@ -254,12 +254,12 @@ export var medication_added_trigger_tests = function (_a) {
254
254
  belugaVisitType: 'Weight Loss',
255
255
  })];
256
256
  case 44:
257
- belugaForm = _e.sent();
257
+ belugaForm = _h.sent();
258
258
  return [4 /*yield*/, sdk.api.endusers.createOne({})
259
259
  // Create a form response that the webhook can look up by masterId
260
260
  ];
261
261
  case 45:
262
- belugaEnduser = _e.sent();
262
+ belugaEnduser = _h.sent();
263
263
  return [4 /*yield*/, sdk.api.form_responses.createOne({
264
264
  formId: belugaForm.id,
265
265
  enduserId: belugaEnduser.id,
@@ -273,17 +273,17 @@ export var medication_added_trigger_tests = function (_a) {
273
273
  // Create a trigger that filters on protocol 'Weight Loss'
274
274
  ];
275
275
  case 46:
276
- belugaFormResponse = _e.sent();
276
+ belugaFormResponse = _h.sent();
277
277
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
278
278
  event: { type: 'Medication Added', info: { titles: [], protocols: ['Weight Loss'] } },
279
279
  action: { type: 'Add Tags', info: { tags: ['Med-Beluga-Protocol'] } },
280
280
  status: 'Active',
281
281
  title: "Medication - Beluga Protocol Test"
282
282
  })
283
- // Simulate the Beluga RX_WRITTEN webhook
283
+ // Simulate the Beluga RX_WRITTEN webhook with two meds covering category present (typical) and "N/A"
284
284
  ];
285
285
  case 47:
286
- belugaTrigger = _e.sent();
286
+ belugaTrigger = _h.sent();
287
287
  return [4 /*yield*/, fetch("".concat(host, "/v1/webhooks/beluga"), {
288
288
  method: 'POST',
289
289
  headers: { 'Content-Type': 'application/json' },
@@ -298,54 +298,142 @@ export var medication_added_trigger_tests = function (_a) {
298
298
  quantity: '1',
299
299
  medId: 'test-ndc-123',
300
300
  rxId: 'test-rx-456',
301
+ category: 'weightloss1',
302
+ }, {
303
+ name: 'Metformin',
304
+ strength: '500mg',
305
+ refills: '2',
306
+ quantity: '1',
307
+ medId: 'test-ndc-789',
308
+ rxId: 'test-rx-789',
309
+ category: 'N/A',
301
310
  }],
302
311
  }),
303
312
  })];
304
313
  case 48:
305
- webhookResponse = _e.sent();
314
+ webhookResponse = _h.sent();
306
315
  if (!!webhookResponse.ok) return [3 /*break*/, 50];
307
316
  _b = Error.bind;
308
317
  _d = (_c = "Beluga webhook failed with status ".concat(webhookResponse.status, ": ")).concat;
309
318
  return [4 /*yield*/, webhookResponse.text()];
310
- case 49: throw new (_b.apply(Error, [void 0, _d.apply(_c, [_e.sent()])]))();
319
+ case 49: throw new (_b.apply(Error, [void 0, _d.apply(_c, [_h.sent()])]))();
311
320
  case 50: return [4 /*yield*/, wait(undefined, 500)
312
321
  // Verify the trigger fired (enduser got the tag)
313
322
  ];
314
323
  case 51:
315
- _e.sent();
324
+ _h.sent();
316
325
  // Verify the trigger fired (enduser got the tag)
317
326
  return [4 /*yield*/, async_test("Beluga RX_WRITTEN - Protocol trigger fires", function () { return sdk.api.endusers.getOne(belugaEnduser.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Beluga-Protocol')); } })
318
327
  // Verify the medication was created with correct protocol and source
319
328
  ];
320
329
  case 52:
321
330
  // Verify the trigger fired (enduser got the tag)
322
- _e.sent();
331
+ _h.sent();
323
332
  return [4 /*yield*/, sdk.api.enduser_medications.getSome({ filter: { enduserId: belugaEnduser.id } })];
324
333
  case 53:
325
- belugaMeds = _e.sent();
326
- belugaMed = belugaMeds[0];
334
+ belugaMeds = _h.sent();
335
+ belugaMedSemaglutide = belugaMeds.find(function (m) { return m.title === 'Semaglutide'; });
336
+ belugaMedMetformin = belugaMeds.find(function (m) { return m.title === 'Metformin'; });
337
+ if (!belugaMedSemaglutide || !belugaMedMetformin) {
338
+ throw new Error("Beluga RX_WRITTEN - expected medications missing. Got: ".concat(belugaMeds.map(function (m) { return m.title; }).join(', ')));
339
+ }
327
340
  return [4 /*yield*/, async_test("Beluga RX_WRITTEN - Medication has protocol from form belugaVisitType", function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
328
- return [2 /*return*/, belugaMed];
329
- }); }); }, { onResult: function (m) { return m.protocol === 'Weight Loss' && m.source === 'Beluga' && m.title === 'Semaglutide'; } })];
341
+ return [2 /*return*/, belugaMedSemaglutide];
342
+ }); }); }, { onResult: function (m) { return (m === null || m === void 0 ? void 0 : m.protocol) === 'Weight Loss' && (m === null || m === void 0 ? void 0 : m.source) === 'Beluga' && (m === null || m === void 0 ? void 0 : m.title) === 'Semaglutide'; } })];
330
343
  case 54:
331
- _e.sent();
332
- _e.label = 55;
344
+ _h.sent();
345
+ return [4 /*yield*/, async_test("Beluga RX_WRITTEN - Medication has category from webhook", function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
346
+ return [2 /*return*/, belugaMedSemaglutide];
347
+ }); }); }, { onResult: function (m) { return (m === null || m === void 0 ? void 0 : m.category) === 'weightloss1'; } })];
333
348
  case 55:
334
- _e.trys.push([55, , 59, 60]);
349
+ _h.sent();
350
+ return [4 /*yield*/, async_test("Beluga RX_WRITTEN - Medication preserves N/A category verbatim", function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
351
+ return [2 /*return*/, belugaMedMetformin];
352
+ }); }); }, { onResult: function (m) { return (m === null || m === void 0 ? void 0 : m.category) === 'N/A'; } })
353
+ // Backwards-compatibility: a webhook with no category on any med should result in undefined category
354
+ ];
355
+ case 56:
356
+ _h.sent();
357
+ return [4 /*yield*/, sdk.api.forms.createOne({
358
+ title: 'Beluga Protocol Test Form (no category)',
359
+ belugaVisitType: 'Weight Loss',
360
+ })];
361
+ case 57:
362
+ belugaFormNoCategory = _h.sent();
363
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
364
+ case 58:
365
+ belugaEnduserNoCategory = _h.sent();
366
+ return [4 /*yield*/, sdk.api.form_responses.createOne({
367
+ formId: belugaFormNoCategory.id,
368
+ enduserId: belugaEnduserNoCategory.id,
369
+ formTitle: belugaFormNoCategory.title,
370
+ responses: [{
371
+ fieldId: PLACEHOLDER_ID,
372
+ fieldTitle: 'placeholder',
373
+ answer: { type: 'string', value: 'test' },
374
+ }],
375
+ })];
376
+ case 59:
377
+ belugaFormResponseNoCategory = _h.sent();
378
+ return [4 /*yield*/, fetch("".concat(host, "/v1/webhooks/beluga"), {
379
+ method: 'POST',
380
+ headers: { 'Content-Type': 'application/json' },
381
+ body: JSON.stringify({
382
+ masterId: "tellescope_".concat(belugaFormResponseNoCategory.id),
383
+ event: 'RX_WRITTEN',
384
+ docName: 'Dr. Test',
385
+ medsPrescribed: [{
386
+ name: 'Ibuprofen',
387
+ strength: '200mg',
388
+ refills: '1',
389
+ quantity: '1',
390
+ medId: 'test-ndc-nocat',
391
+ rxId: 'test-rx-nocat',
392
+ }],
393
+ }),
394
+ })];
395
+ case 60:
396
+ webhookResponseNoCategory = _h.sent();
397
+ if (!!webhookResponseNoCategory.ok) return [3 /*break*/, 62];
398
+ _e = Error.bind;
399
+ _g = (_f = "Beluga webhook (no category) failed with status ".concat(webhookResponseNoCategory.status, ": ")).concat;
400
+ return [4 /*yield*/, webhookResponseNoCategory.text()];
401
+ case 61: throw new (_e.apply(Error, [void 0, _g.apply(_f, [_h.sent()])]))();
402
+ case 62: return [4 /*yield*/, wait(undefined, 500)];
403
+ case 63:
404
+ _h.sent();
405
+ return [4 /*yield*/, sdk.api.enduser_medications.getSome({ filter: { enduserId: belugaEnduserNoCategory.id } })];
406
+ case 64:
407
+ belugaMedsNoCategory = _h.sent();
408
+ belugaMedNoCategory = belugaMedsNoCategory[0];
409
+ return [4 /*yield*/, async_test("Beluga RX_WRITTEN - Medication omits category when not provided", function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
410
+ return [2 /*return*/, belugaMedNoCategory];
411
+ }); }); }, { onResult: function (m) { return (m === null || m === void 0 ? void 0 : m.category) === undefined || (m === null || m === void 0 ? void 0 : m.category) === null; } })];
412
+ case 65:
413
+ _h.sent();
414
+ _h.label = 66;
415
+ case 66:
416
+ _h.trys.push([66, , 72, 73]);
335
417
  // Clean up Beluga test data
336
418
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(belugaTrigger.id)];
337
- case 56:
419
+ case 67:
338
420
  // Clean up Beluga test data
339
- _e.sent();
421
+ _h.sent();
340
422
  return [4 /*yield*/, sdk.api.forms.deleteOne(belugaForm.id)];
341
- case 57:
342
- _e.sent();
423
+ case 68:
424
+ _h.sent();
425
+ return [4 /*yield*/, sdk.api.forms.deleteOne(belugaFormNoCategory.id)];
426
+ case 69:
427
+ _h.sent();
343
428
  return [4 /*yield*/, sdk.api.endusers.deleteOne(belugaEnduser.id)]; // also cleans up form response and medications
344
- case 58:
345
- _e.sent(); // also cleans up form response and medications
346
- return [3 /*break*/, 60];
347
- case 59: return [7 /*endfinally*/];
348
- case 60:
429
+ case 70:
430
+ _h.sent(); // also cleans up form response and medications
431
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(belugaEnduserNoCategory.id)]; // also cleans up form response and medications
432
+ case 71:
433
+ _h.sent(); // also cleans up form response and medications
434
+ return [3 /*break*/, 73];
435
+ case 72: return [7 /*endfinally*/];
436
+ case 73:
349
437
  // ---- Set Fields with {{medication.name}} Test ----
350
438
  log_header("Medication Added - Set Fields with {{medication.name}}");
351
439
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
@@ -354,66 +442,429 @@ export var medication_added_trigger_tests = function (_a) {
354
442
  status: 'Active',
355
443
  title: "Medication - Set Fields medication.name"
356
444
  })];
357
- case 61:
358
- setFieldsTrigger = _e.sent();
445
+ case 74:
446
+ setFieldsTrigger = _h.sent();
359
447
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
360
- case 62:
361
- setFieldsEnduser = _e.sent();
448
+ case 75:
449
+ setFieldsEnduser = _h.sent();
362
450
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
363
451
  enduserId: setFieldsEnduser.id,
364
452
  title: 'Lisinopril 10mg',
365
453
  })];
366
- case 63:
367
- setFieldsMed = _e.sent();
454
+ case 76:
455
+ setFieldsMed = _h.sent();
368
456
  return [4 /*yield*/, wait(undefined, 500)];
369
- case 64:
370
- _e.sent();
457
+ case 77:
458
+ _h.sent();
371
459
  return [4 /*yield*/, async_test("Medication Added - Set Fields copies medication.name to enduser field", function () { return sdk.api.endusers.getOne(setFieldsEnduser.id); }, { onResult: function (e) { var _a; return ((_a = e.fields) === null || _a === void 0 ? void 0 : _a['Medication Name']) === 'Lisinopril 10mg'; } })
372
460
  // Test with title-filtered trigger to verify medication context is passed correctly
373
461
  ];
374
- case 65:
375
- _e.sent();
462
+ case 78:
463
+ _h.sent();
376
464
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
377
465
  event: { type: 'Medication Added', info: { titles: ['Metformin 500mg'], protocols: [] } },
378
466
  action: { type: 'Set Fields', info: { fields: [{ name: 'Specific Med', type: 'Custom Value', value: '{{medication.name}}' }] } },
379
467
  status: 'Active',
380
468
  title: "Medication - Set Fields filtered"
381
469
  })];
382
- case 66:
383
- setFieldsTriggerFiltered = _e.sent();
470
+ case 79:
471
+ setFieldsTriggerFiltered = _h.sent();
384
472
  return [4 /*yield*/, sdk.api.endusers.createOne({})];
385
- case 67:
386
- setFieldsEnduser2 = _e.sent();
473
+ case 80:
474
+ setFieldsEnduser2 = _h.sent();
387
475
  return [4 /*yield*/, sdk.api.enduser_medications.createOne({
388
476
  enduserId: setFieldsEnduser2.id,
389
477
  title: 'Metformin 500mg',
390
478
  })];
391
- case 68:
392
- setFieldsMed2 = _e.sent();
479
+ case 81:
480
+ setFieldsMed2 = _h.sent();
393
481
  return [4 /*yield*/, wait(undefined, 500)];
394
- case 69:
395
- _e.sent();
396
- return [4 /*yield*/, async_test("Medication Added - Set Fields with title filter copies medication.name", function () { return sdk.api.endusers.getOne(setFieldsEnduser2.id); }, { onResult: function (e) { var _a; return ((_a = e.fields) === null || _a === void 0 ? void 0 : _a['Specific Med']) === 'Metformin 500mg'; } })];
397
- case 70:
398
- _e.sent();
399
- _e.label = 71;
400
- case 71:
401
- _e.trys.push([71, , 76, 77]);
482
+ case 82:
483
+ _h.sent();
484
+ return [4 /*yield*/, async_test("Medication Added - Set Fields with title filter copies medication.name", function () { return sdk.api.endusers.getOne(setFieldsEnduser2.id); }, { onResult: function (e) { var _a; return ((_a = e.fields) === null || _a === void 0 ? void 0 : _a['Specific Med']) === 'Metformin 500mg'; } })
485
+ // ---- Set Fields with {{medication.category}} Test ----
486
+ ];
487
+ case 83:
488
+ _h.sent();
489
+ // ---- Set Fields with {{medication.category}} Test ----
490
+ log_header("Medication Added - Set Fields with {{medication.category}}");
491
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
492
+ event: { type: 'Medication Added', info: { titles: [], protocols: [] } },
493
+ action: { type: 'Set Fields', info: { fields: [{ name: 'Medication Category', type: 'Custom Value', value: '{{medication.category}}' }] } },
494
+ status: 'Active',
495
+ title: "Medication - Set Fields medication.category"
496
+ })];
497
+ case 84:
498
+ setFieldsCategoryTrigger = _h.sent();
499
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
500
+ case 85:
501
+ setFieldsCategoryEnduser = _h.sent();
502
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({
503
+ enduserId: setFieldsCategoryEnduser.id,
504
+ title: 'Ozempic 0.5mg',
505
+ category: 'weightloss1',
506
+ })];
507
+ case 86:
508
+ setFieldsCategoryMed = _h.sent();
509
+ return [4 /*yield*/, wait(undefined, 500)];
510
+ case 87:
511
+ _h.sent();
512
+ return [4 /*yield*/, async_test("Medication Added - Set Fields copies medication.category to enduser field", function () { return sdk.api.endusers.getOne(setFieldsCategoryEnduser.id); }, { onResult: function (e) { var _a; return ((_a = e.fields) === null || _a === void 0 ? void 0 : _a['Medication Category']) === 'weightloss1'; } })
513
+ // Category absent on medication → placeholder resolves to empty string
514
+ ];
515
+ case 88:
516
+ _h.sent();
517
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
518
+ case 89:
519
+ setFieldsCategoryEnduserEmpty = _h.sent();
520
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({
521
+ enduserId: setFieldsCategoryEnduserEmpty.id,
522
+ title: 'Lisinopril 20mg',
523
+ })];
524
+ case 90:
525
+ setFieldsCategoryMedEmpty = _h.sent();
526
+ return [4 /*yield*/, wait(undefined, 500)];
527
+ case 91:
528
+ _h.sent();
529
+ return [4 /*yield*/, async_test("Medication Added - Set Fields with no category resolves to empty string", function () { return sdk.api.endusers.getOne(setFieldsCategoryEnduserEmpty.id); }, { onResult: function (e) { var _a; return ((_a = e.fields) === null || _a === void 0 ? void 0 : _a['Medication Category']) === ''; } })];
530
+ case 92:
531
+ _h.sent();
532
+ _h.label = 93;
533
+ case 93:
534
+ _h.trys.push([93, , 101, 102]);
402
535
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(setFieldsTrigger.id)];
403
- case 72:
404
- _e.sent();
536
+ case 94:
537
+ _h.sent();
405
538
  return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(setFieldsTriggerFiltered.id)];
406
- case 73:
407
- _e.sent();
539
+ case 95:
540
+ _h.sent();
541
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(setFieldsCategoryTrigger.id)];
542
+ case 96:
543
+ _h.sent();
408
544
  return [4 /*yield*/, sdk.api.endusers.deleteOne(setFieldsEnduser.id)];
409
- case 74:
410
- _e.sent();
545
+ case 97:
546
+ _h.sent();
411
547
  return [4 /*yield*/, sdk.api.endusers.deleteOne(setFieldsEnduser2.id)];
412
- case 75:
413
- _e.sent();
414
- return [3 /*break*/, 77];
415
- case 76: return [7 /*endfinally*/];
416
- case 77: return [2 /*return*/];
548
+ case 98:
549
+ _h.sent();
550
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(setFieldsCategoryEnduser.id)];
551
+ case 99:
552
+ _h.sent();
553
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(setFieldsCategoryEnduserEmpty.id)];
554
+ case 100:
555
+ _h.sent();
556
+ return [3 /*break*/, 102];
557
+ case 101: return [7 /*endfinally*/];
558
+ case 102:
559
+ // ---- titleCondition (compound conditional logic on title) ----
560
+ log_header("Medication Added - titleCondition compound logic");
561
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
562
+ event: {
563
+ type: 'Medication Added',
564
+ info: {
565
+ titles: [],
566
+ protocols: [],
567
+ titleCondition: { condition: { title: { $contains: 'GLP' } } },
568
+ },
569
+ },
570
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-Contains-GLP'] } },
571
+ status: 'Active',
572
+ title: "Medication - titleCondition contains GLP"
573
+ })];
574
+ case 103:
575
+ c1Trigger = _h.sent();
576
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
577
+ case 104:
578
+ c1MatchEnduser = _h.sent();
579
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c1MatchEnduser.id, title: 'Semaglutide GLP-1' })];
580
+ case 105:
581
+ _h.sent();
582
+ return [4 /*yield*/, wait(undefined, 500)];
583
+ case 106:
584
+ _h.sent();
585
+ return [4 /*yield*/, async_test("titleCondition $contains - matching medication fires", function () { return sdk.api.endusers.getOne(c1MatchEnduser.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Contains-GLP')); } })];
586
+ case 107:
587
+ _h.sent();
588
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
589
+ case 108:
590
+ c1MissEnduser = _h.sent();
591
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c1MissEnduser.id, title: 'Aspirin' })];
592
+ case 109:
593
+ _h.sent();
594
+ return [4 /*yield*/, wait(undefined, 500)];
595
+ case 110:
596
+ _h.sent();
597
+ return [4 /*yield*/, async_test("titleCondition $contains - non-matching medication does NOT fire", function () { return sdk.api.endusers.getOne(c1MissEnduser.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Contains-GLP')); } })
598
+ // C2: $ne — fires for everything except 'Placebo'
599
+ ];
600
+ case 111:
601
+ _h.sent();
602
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
603
+ event: {
604
+ type: 'Medication Added',
605
+ info: {
606
+ titles: [],
607
+ protocols: [],
608
+ titleCondition: { condition: { title: { $ne: 'Placebo' } } },
609
+ },
610
+ },
611
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-Ne-Placebo'] } },
612
+ status: 'Active',
613
+ title: "Medication - titleCondition ne Placebo"
614
+ })];
615
+ case 112:
616
+ c2Trigger = _h.sent();
617
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
618
+ case 113:
619
+ c2MatchEnduser = _h.sent();
620
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c2MatchEnduser.id, title: 'Metformin' })];
621
+ case 114:
622
+ _h.sent();
623
+ return [4 /*yield*/, wait(undefined, 500)];
624
+ case 115:
625
+ _h.sent();
626
+ return [4 /*yield*/, async_test("titleCondition $ne - non-Placebo medication fires", function () { return sdk.api.endusers.getOne(c2MatchEnduser.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Ne-Placebo')); } })];
627
+ case 116:
628
+ _h.sent();
629
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
630
+ case 117:
631
+ c2MissEnduser = _h.sent();
632
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c2MissEnduser.id, title: 'Placebo' })];
633
+ case 118:
634
+ _h.sent();
635
+ return [4 /*yield*/, wait(undefined, 500)];
636
+ case 119:
637
+ _h.sent();
638
+ return [4 /*yield*/, async_test("titleCondition $ne - Placebo medication does NOT fire", function () { return sdk.api.endusers.getOne(c2MissEnduser.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Ne-Placebo')); } })
639
+ // C3: compound $and — contains 'mg' AND does not contain 'Placebo' (case-sensitive)
640
+ ];
641
+ case 120:
642
+ _h.sent();
643
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
644
+ event: {
645
+ type: 'Medication Added',
646
+ info: {
647
+ titles: [],
648
+ protocols: [],
649
+ titleCondition: {
650
+ $and: [
651
+ { condition: { title: { $contains: 'mg' } } },
652
+ { condition: { title: { $doesNotContain: 'Placebo' } } },
653
+ ],
654
+ },
655
+ },
656
+ },
657
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-And'] } },
658
+ status: 'Active',
659
+ title: "Medication - titleCondition compound AND"
660
+ })];
661
+ case 121:
662
+ c3Trigger = _h.sent();
663
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
664
+ case 122:
665
+ c3MatchEnduser = _h.sent();
666
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c3MatchEnduser.id, title: 'Lisinopril 10mg' })];
667
+ case 123:
668
+ _h.sent();
669
+ return [4 /*yield*/, wait(undefined, 500)];
670
+ case 124:
671
+ _h.sent();
672
+ return [4 /*yield*/, async_test("titleCondition $and - both pass fires", function () { return sdk.api.endusers.getOne(c3MatchEnduser.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-And')); } })];
673
+ case 125:
674
+ _h.sent();
675
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
676
+ case 126:
677
+ c3MissEnduser = _h.sent();
678
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c3MissEnduser.id, title: 'Placebo 5mg' })];
679
+ case 127:
680
+ _h.sent();
681
+ return [4 /*yield*/, wait(undefined, 500)];
682
+ case 128:
683
+ _h.sent();
684
+ return [4 /*yield*/, async_test("titleCondition $and - second branch fails does NOT fire", function () { return sdk.api.endusers.getOne(c3MissEnduser.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-And')); } })
685
+ // C4: compound $or — equals 'Aspirin' OR contains 'pril'
686
+ ];
687
+ case 129:
688
+ _h.sent();
689
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
690
+ event: {
691
+ type: 'Medication Added',
692
+ info: {
693
+ titles: [],
694
+ protocols: [],
695
+ titleCondition: {
696
+ $or: [
697
+ { condition: { title: 'Aspirin' } },
698
+ { condition: { title: { $contains: 'pril' } } },
699
+ ],
700
+ },
701
+ },
702
+ },
703
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-Or'] } },
704
+ status: 'Active',
705
+ title: "Medication - titleCondition compound OR"
706
+ })];
707
+ case 130:
708
+ c4Trigger = _h.sent();
709
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
710
+ case 131:
711
+ c4MatchA = _h.sent();
712
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c4MatchA.id, title: 'Aspirin' })];
713
+ case 132:
714
+ _h.sent();
715
+ return [4 /*yield*/, wait(undefined, 500)];
716
+ case 133:
717
+ _h.sent();
718
+ return [4 /*yield*/, async_test("titleCondition $or - first branch matches fires", function () { return sdk.api.endusers.getOne(c4MatchA.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Or')); } })];
719
+ case 134:
720
+ _h.sent();
721
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
722
+ case 135:
723
+ c4MatchB = _h.sent();
724
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c4MatchB.id, title: 'Lisinopril' })];
725
+ case 136:
726
+ _h.sent();
727
+ return [4 /*yield*/, wait(undefined, 500)];
728
+ case 137:
729
+ _h.sent();
730
+ return [4 /*yield*/, async_test("titleCondition $or - second branch matches fires", function () { return sdk.api.endusers.getOne(c4MatchB.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Or')); } })];
731
+ case 138:
732
+ _h.sent();
733
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
734
+ case 139:
735
+ c4Miss = _h.sent();
736
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c4Miss.id, title: 'Metformin' })];
737
+ case 140:
738
+ _h.sent();
739
+ return [4 /*yield*/, wait(undefined, 500)];
740
+ case 141:
741
+ _h.sent();
742
+ return [4 /*yield*/, async_test("titleCondition $or - neither branch matches does NOT fire", function () { return sdk.api.endusers.getOne(c4Miss.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Or')); } })
743
+ // C5: backwards compatibility — no titleCondition, titles array still works
744
+ ];
745
+ case 142:
746
+ _h.sent();
747
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
748
+ event: { type: 'Medication Added', info: { titles: ['Atorvastatin'], protocols: [] } },
749
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-BackCompat'] } },
750
+ status: 'Active',
751
+ title: "Medication - titles array back-compat"
752
+ })];
753
+ case 143:
754
+ c5Trigger = _h.sent();
755
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
756
+ case 144:
757
+ c5Match = _h.sent();
758
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c5Match.id, title: 'Atorvastatin' })];
759
+ case 145:
760
+ _h.sent();
761
+ return [4 /*yield*/, wait(undefined, 500)];
762
+ case 146:
763
+ _h.sent();
764
+ return [4 /*yield*/, async_test("titles back-compat - title match still fires without titleCondition", function () { return sdk.api.endusers.getOne(c5Match.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-BackCompat')); } })];
765
+ case 147:
766
+ _h.sent();
767
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
768
+ case 148:
769
+ c5Miss = _h.sent();
770
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c5Miss.id, title: 'Aspirin' })];
771
+ case 149:
772
+ _h.sent();
773
+ return [4 /*yield*/, wait(undefined, 500)];
774
+ case 150:
775
+ _h.sent();
776
+ return [4 /*yield*/, async_test("titles back-compat - non-match does NOT fire without titleCondition", function () { return sdk.api.endusers.getOne(c5Miss.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-BackCompat')); } })
777
+ // C6: combined — titles array AND titleCondition compose (both must pass)
778
+ ];
779
+ case 151:
780
+ _h.sent();
781
+ return [4 /*yield*/, sdk.api.automation_triggers.createOne({
782
+ event: {
783
+ type: 'Medication Added',
784
+ info: {
785
+ titles: ['Lisinopril'],
786
+ protocols: [],
787
+ titleCondition: { condition: { title: { $contains: 'Lisin' } } },
788
+ },
789
+ },
790
+ action: { type: 'Add Tags', info: { tags: ['Med-Cond-Combined'] } },
791
+ status: 'Active',
792
+ title: "Medication - titles + titleCondition combined"
793
+ })];
794
+ case 152:
795
+ c6Trigger = _h.sent();
796
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
797
+ case 153:
798
+ c6Match = _h.sent();
799
+ return [4 /*yield*/, sdk.api.enduser_medications.createOne({ enduserId: c6Match.id, title: 'Lisinopril' })];
800
+ case 154:
801
+ _h.sent();
802
+ return [4 /*yield*/, wait(undefined, 500)];
803
+ case 155:
804
+ _h.sent();
805
+ return [4 /*yield*/, async_test("titleCondition combined - both pass fires", function () { return sdk.api.endusers.getOne(c6Match.id); }, { onResult: function (e) { var _a; return !!((_a = e.tags) === null || _a === void 0 ? void 0 : _a.includes('Med-Cond-Combined')); } })];
806
+ case 156:
807
+ _h.sent();
808
+ _h.label = 157;
809
+ case 157:
810
+ _h.trys.push([157, , 176, 177]);
811
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c1Trigger.id)];
812
+ case 158:
813
+ _h.sent();
814
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c2Trigger.id)];
815
+ case 159:
816
+ _h.sent();
817
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c3Trigger.id)];
818
+ case 160:
819
+ _h.sent();
820
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c4Trigger.id)];
821
+ case 161:
822
+ _h.sent();
823
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c5Trigger.id)];
824
+ case 162:
825
+ _h.sent();
826
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(c6Trigger.id)];
827
+ case 163:
828
+ _h.sent();
829
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c1MatchEnduser.id)];
830
+ case 164:
831
+ _h.sent();
832
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c1MissEnduser.id)];
833
+ case 165:
834
+ _h.sent();
835
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c2MatchEnduser.id)];
836
+ case 166:
837
+ _h.sent();
838
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c2MissEnduser.id)];
839
+ case 167:
840
+ _h.sent();
841
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c3MatchEnduser.id)];
842
+ case 168:
843
+ _h.sent();
844
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c3MissEnduser.id)];
845
+ case 169:
846
+ _h.sent();
847
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c4MatchA.id)];
848
+ case 170:
849
+ _h.sent();
850
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c4MatchB.id)];
851
+ case 171:
852
+ _h.sent();
853
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c4Miss.id)];
854
+ case 172:
855
+ _h.sent();
856
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c5Match.id)];
857
+ case 173:
858
+ _h.sent();
859
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c5Miss.id)];
860
+ case 174:
861
+ _h.sent();
862
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(c6Match.id)];
863
+ case 175:
864
+ _h.sent();
865
+ return [3 /*break*/, 177];
866
+ case 176: return [7 /*endfinally*/];
867
+ case 177: return [2 /*return*/];
417
868
  }
418
869
  });
419
870
  });