@tellescope/sdk 1.256.6 → 1.256.7

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 (115) hide show
  1. package/lib/cjs/enduser.d.ts +1 -1
  2. package/lib/cjs/enduser.d.ts.map +1 -1
  3. package/lib/cjs/enduser.js +1 -0
  4. package/lib/cjs/enduser.js.map +1 -1
  5. package/lib/cjs/tests/api_tests/calendar_event_create_and_bulk_triggers.test.d.ts +6 -0
  6. package/lib/cjs/tests/api_tests/calendar_event_create_and_bulk_triggers.test.d.ts.map +1 -0
  7. package/lib/cjs/tests/api_tests/calendar_event_create_and_bulk_triggers.test.js +505 -0
  8. package/lib/cjs/tests/api_tests/calendar_event_create_and_bulk_triggers.test.js.map +1 -0
  9. package/lib/cjs/tests/api_tests/configurations_public_read.test.d.ts +6 -0
  10. package/lib/cjs/tests/api_tests/configurations_public_read.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/configurations_public_read.test.js +173 -0
  12. package/lib/cjs/tests/api_tests/configurations_public_read.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/form_started_trigger.test.d.ts.map +1 -1
  14. package/lib/cjs/tests/api_tests/form_started_trigger.test.js +87 -24
  15. package/lib/cjs/tests/api_tests/form_started_trigger.test.js.map +1 -1
  16. package/lib/cjs/tests/api_tests/form_translations.test.d.ts +6 -0
  17. package/lib/cjs/tests/api_tests/form_translations.test.d.ts.map +1 -0
  18. package/lib/cjs/tests/api_tests/form_translations.test.js +259 -0
  19. package/lib/cjs/tests/api_tests/form_translations.test.js.map +1 -0
  20. package/lib/cjs/tests/api_tests/group_event_attendee_status_triggers.test.d.ts.map +1 -1
  21. package/lib/cjs/tests/api_tests/group_event_attendee_status_triggers.test.js +340 -124
  22. package/lib/cjs/tests/api_tests/group_event_attendee_status_triggers.test.js.map +1 -1
  23. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.d.ts +6 -0
  24. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.d.ts.map +1 -0
  25. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.js +277 -0
  26. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.js.map +1 -0
  27. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  28. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js +262 -78
  29. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  30. package/lib/cjs/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.d.ts +31 -0
  31. package/lib/cjs/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  32. package/lib/cjs/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.js +230 -0
  33. package/lib/cjs/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.js.map +1 -0
  34. package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts.map +1 -1
  35. package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.js +206 -198
  36. package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.js.map +1 -1
  37. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.d.ts.map +1 -1
  38. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.js +343 -80
  39. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.js.map +1 -1
  40. package/lib/cjs/tests/api_tests/welle_partner_token.test.d.ts.map +1 -1
  41. package/lib/cjs/tests/api_tests/welle_partner_token.test.js +74 -35
  42. package/lib/cjs/tests/api_tests/welle_partner_token.test.js.map +1 -1
  43. package/lib/cjs/tests/stripe_webhook_helpers.d.ts +134 -0
  44. package/lib/cjs/tests/stripe_webhook_helpers.d.ts.map +1 -1
  45. package/lib/cjs/tests/stripe_webhook_helpers.js +126 -1
  46. package/lib/cjs/tests/stripe_webhook_helpers.js.map +1 -1
  47. package/lib/cjs/tests/tests.d.ts.map +1 -1
  48. package/lib/cjs/tests/tests.js +238 -212
  49. package/lib/cjs/tests/tests.js.map +1 -1
  50. package/lib/esm/enduser.d.ts +1 -1
  51. package/lib/esm/enduser.d.ts.map +1 -1
  52. package/lib/esm/enduser.js +1 -0
  53. package/lib/esm/enduser.js.map +1 -1
  54. package/lib/esm/tests/api_tests/calendar_event_create_and_bulk_triggers.test.d.ts +6 -0
  55. package/lib/esm/tests/api_tests/calendar_event_create_and_bulk_triggers.test.d.ts.map +1 -0
  56. package/lib/esm/tests/api_tests/calendar_event_create_and_bulk_triggers.test.js +501 -0
  57. package/lib/esm/tests/api_tests/calendar_event_create_and_bulk_triggers.test.js.map +1 -0
  58. package/lib/esm/tests/api_tests/configurations_public_read.test.d.ts +6 -0
  59. package/lib/esm/tests/api_tests/configurations_public_read.test.d.ts.map +1 -0
  60. package/lib/esm/tests/api_tests/configurations_public_read.test.js +169 -0
  61. package/lib/esm/tests/api_tests/configurations_public_read.test.js.map +1 -0
  62. package/lib/esm/tests/api_tests/form_started_trigger.test.d.ts.map +1 -1
  63. package/lib/esm/tests/api_tests/form_started_trigger.test.js +87 -24
  64. package/lib/esm/tests/api_tests/form_started_trigger.test.js.map +1 -1
  65. package/lib/esm/tests/api_tests/form_translations.test.d.ts +6 -0
  66. package/lib/esm/tests/api_tests/form_translations.test.d.ts.map +1 -0
  67. package/lib/esm/tests/api_tests/form_translations.test.js +255 -0
  68. package/lib/esm/tests/api_tests/form_translations.test.js.map +1 -0
  69. package/lib/esm/tests/api_tests/group_event_attendee_status_triggers.test.d.ts.map +1 -1
  70. package/lib/esm/tests/api_tests/group_event_attendee_status_triggers.test.js +340 -124
  71. package/lib/esm/tests/api_tests/group_event_attendee_status_triggers.test.js.map +1 -1
  72. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.d.ts +6 -0
  73. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.d.ts.map +1 -0
  74. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.js +273 -0
  75. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.js.map +1 -0
  76. package/lib/esm/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  77. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js +262 -78
  78. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  79. package/lib/esm/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.d.ts +31 -0
  80. package/lib/esm/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  81. package/lib/esm/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.js +226 -0
  82. package/lib/esm/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.js.map +1 -0
  83. package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts.map +1 -1
  84. package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.js +206 -198
  85. package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.js.map +1 -1
  86. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.d.ts.map +1 -1
  87. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.js +344 -81
  88. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.js.map +1 -1
  89. package/lib/esm/tests/api_tests/welle_partner_token.test.d.ts.map +1 -1
  90. package/lib/esm/tests/api_tests/welle_partner_token.test.js +74 -35
  91. package/lib/esm/tests/api_tests/welle_partner_token.test.js.map +1 -1
  92. package/lib/esm/tests/stripe_webhook_helpers.d.ts +134 -0
  93. package/lib/esm/tests/stripe_webhook_helpers.d.ts.map +1 -1
  94. package/lib/esm/tests/stripe_webhook_helpers.js +119 -0
  95. package/lib/esm/tests/stripe_webhook_helpers.js.map +1 -1
  96. package/lib/esm/tests/tests.d.ts.map +1 -1
  97. package/lib/esm/tests/tests.js +238 -212
  98. package/lib/esm/tests/tests.js.map +1 -1
  99. package/lib/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +10 -10
  101. package/src/enduser.ts +4 -2
  102. package/src/tests/api_tests/calendar_event_create_and_bulk_triggers.test.ts +293 -0
  103. package/src/tests/api_tests/configurations_public_read.test.ts +116 -0
  104. package/src/tests/api_tests/form_started_trigger.test.ts +49 -1
  105. package/src/tests/api_tests/form_translations.test.ts +205 -0
  106. package/src/tests/api_tests/group_event_attendee_status_triggers.test.ts +135 -0
  107. package/src/tests/api_tests/mdi_trigger_refill.test.ts +184 -0
  108. package/src/tests/api_tests/purchase_made_trigger.test.ts +137 -0
  109. package/src/tests/api_tests/security/F-0006-develop-health-benefit-verification-rbac.test.ts +144 -0
  110. package/src/tests/api_tests/security/public_endpoint_auth_field_lock.test.ts +16 -6
  111. package/src/tests/api_tests/stripe_webhook_triggers.test.ts +221 -0
  112. package/src/tests/api_tests/welle_partner_token.test.ts +49 -6
  113. package/src/tests/stripe_webhook_helpers.ts +116 -0
  114. package/src/tests/tests.ts +27 -12
  115. package/test_generated.pdf +0 -0
@@ -53,9 +53,9 @@ var ALL_STATUSES = ['Completed', 'No-showed', 'Rescheduled', 'Cancelled'];
53
53
  var group_event_attendee_status_triggers_tests = function (_a) {
54
54
  var sdk = _a.sdk;
55
55
  return __awaiter(void 0, void 0, void 0, function () {
56
- var createdTriggerIds, createdEnduserIds, createdEventIds, createEnduser, createGroupEvent, setAttendeeStatuses, tagsOf, _i, ALL_STATUSES_1, status_1, t, _loop_1, _b, ALL_STATUSES_2, status_2, aCompleted_1, bNoShow_1, cCancelled_1, dUnset_1, mixedEvent, transA_1, transABystander_1, transAEvent, transB_1, transBBystander_1, transBEvent, byUserTrigger, byEnduserTrigger, byTarget_1, byBystander_1, byEvent, bulkTarget_1, bulkBystander_1, now, DAY, rootEvent, childEvent, confirmEnduser_1, clearEnduser_1, noopEvent, _c, createdEventIds_1, id, _1, _d, createdEnduserIds_1, id, _2, _e, createdTriggerIds_1, id, _3;
57
- return __generator(this, function (_f) {
58
- switch (_f.label) {
56
+ var createdTriggerIds, createdEnduserIds, createdEventIds, createEnduser, createGroupEvent, setAttendeeStatuses, markEventCompleted, tagsOf, _i, ALL_STATUSES_1, status_1, t, _loop_1, _b, ALL_STATUSES_2, status_2, aCompleted_1, bNoShow_1, cCancelled_1, dUnset_1, mixedEvent, transA_1, transABystander_1, transAEvent, transB_1, transBBystander_1, transBEvent, byUserTrigger, byEnduserTrigger, byTarget_1, byBystander_1, byEvent, bulkTarget_1, bulkBystander_1, now, DAY, rootEvent, childEvent, confirmEnduser_1, clearEnduser_1, noopEvent, _loop_2, _c, _d, status_3, portalCancelled_1, portalActive_1, portalEvent, confirmed_1, confirmedBystander_1, confirmedEvent, plain1, plain2, plain3, plainEvent, plainAttendees, _loop_3, i, _e, createdEventIds_1, id, _1, _f, createdEnduserIds_1, id, _2, _g, createdTriggerIds_1, id, _3;
57
+ return __generator(this, function (_h) {
58
+ switch (_h.label) {
59
59
  case 0:
60
60
  (0, testing_1.log_header)("Automation Trigger Tests (Group Event Per-Attendee Status)");
61
61
  createdTriggerIds = [];
@@ -97,7 +97,14 @@ var group_event_attendee_status_triggers_tests = function (_a) {
97
97
  cancelledGroupAttendees: (statuses
98
98
  .filter(function (s) { return s.status === 'Cancelled' || s.status === 'No-showed' || s.status === 'Rescheduled'; })
99
99
  .map(function (s) { return ({ id: s.id, at: new Date() }); })),
100
- }, { replaceObjectFields: true }))];
100
+ }, { replaceObjectFields: true }))
101
+ // Replicates the webapp "Mark Completed" action on the whole event (Calendar.tsx)
102
+ ];
103
+ });
104
+ }); };
105
+ markEventCompleted = function (eventId) { return __awaiter(void 0, void 0, void 0, function () {
106
+ return __generator(this, function (_a) {
107
+ return [2 /*return*/, (sdk.api.calendar_events.updateOne(eventId, { completedAt: new Date(), completedBy: sdk.userInfo.id }))];
101
108
  });
102
109
  }); };
103
110
  tagsOf = function (enduserId) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
@@ -106,11 +113,11 @@ var group_event_attendee_status_triggers_tests = function (_a) {
106
113
  case 1: return [2 /*return*/, (_a.sent()).tags || []];
107
114
  }
108
115
  }); }); };
109
- _f.label = 1;
116
+ _h.label = 1;
110
117
  case 1:
111
- _f.trys.push([1, , 68, 87]);
118
+ _h.trys.push([1, , 101, 120]);
112
119
  _i = 0, ALL_STATUSES_1 = ALL_STATUSES;
113
- _f.label = 2;
120
+ _h.label = 2;
114
121
  case 2:
115
122
  if (!(_i < ALL_STATUSES_1.length)) return [3 /*break*/, 5];
116
123
  status_1 = ALL_STATUSES_1[_i];
@@ -127,74 +134,74 @@ var group_event_attendee_status_triggers_tests = function (_a) {
127
134
  title: "Group Attendee ".concat(status_1),
128
135
  })];
129
136
  case 3:
130
- t = _f.sent();
137
+ t = _h.sent();
131
138
  createdTriggerIds.push(t.id);
132
- _f.label = 4;
139
+ _h.label = 4;
133
140
  case 4:
134
141
  _i++;
135
142
  return [3 /*break*/, 2];
136
143
  case 5:
137
144
  _loop_1 = function (status_2) {
138
145
  var target, bystander1, bystander2, event_1;
139
- return __generator(this, function (_g) {
140
- switch (_g.label) {
146
+ return __generator(this, function (_j) {
147
+ switch (_j.label) {
141
148
  case 0:
142
149
  (0, testing_1.log_header)("Per-attendee '".concat(status_2, "' in a group event"));
143
150
  return [4 /*yield*/, createEnduser()];
144
151
  case 1:
145
- target = _g.sent();
152
+ target = _j.sent();
146
153
  return [4 /*yield*/, createEnduser()];
147
154
  case 2:
148
- bystander1 = _g.sent();
155
+ bystander1 = _j.sent();
149
156
  return [4 /*yield*/, createEnduser()];
150
157
  case 3:
151
- bystander2 = _g.sent();
158
+ bystander2 = _j.sent();
152
159
  return [4 /*yield*/, createGroupEvent([target.id, bystander1.id, bystander2.id])];
153
160
  case 4:
154
- event_1 = _g.sent();
161
+ event_1 = _j.sent();
155
162
  return [4 /*yield*/, setAttendeeStatuses(event_1.id, [{ id: target.id, status: status_2 }])];
156
163
  case 5:
157
- _g.sent();
164
+ _j.sent();
158
165
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)
159
166
  // 1 + 2. True positive / no false negative: target has the correct tag
160
167
  ]; // allow trigger to fire
161
168
  case 6:
162
- _g.sent(); // allow trigger to fire
169
+ _j.sent(); // allow trigger to fire
163
170
  // 1 + 2. True positive / no false negative: target has the correct tag
164
171
  return [4 /*yield*/, (0, testing_1.async_test)("'".concat(status_2, "' fires its trigger for the target attendee"), function () { return tagsOf(target.id); }, { onResult: function (tags) { return tags.includes(TAG[status_2]); } })
165
172
  // 3. No false positive (wrong trigger): target has none of the other status tags
166
173
  ];
167
174
  case 7:
168
175
  // 1 + 2. True positive / no false negative: target has the correct tag
169
- _g.sent();
176
+ _j.sent();
170
177
  // 3. No false positive (wrong trigger): target has none of the other status tags
171
178
  return [4 /*yield*/, (0, testing_1.async_test)("'".concat(status_2, "' does NOT fire any other status trigger for the target"), function () { return tagsOf(target.id); }, { onResult: function (tags) { return ALL_STATUSES.every(function (s) { return s === status_2 || !tags.includes(TAG[s]); }); } })
172
179
  // 4. No false positive (collateral): bystanders received zero tags
173
180
  ];
174
181
  case 8:
175
182
  // 3. No false positive (wrong trigger): target has none of the other status tags
176
- _g.sent();
183
+ _j.sent();
177
184
  // 4. No false positive (collateral): bystanders received zero tags
178
185
  return [4 /*yield*/, (0, testing_1.async_test)("'".concat(status_2, "' does NOT fire for bystander attendee #1"), function () { return sdk.api.endusers.getOne(bystander1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })];
179
186
  case 9:
180
187
  // 4. No false positive (collateral): bystanders received zero tags
181
- _g.sent();
188
+ _j.sent();
182
189
  return [4 /*yield*/, (0, testing_1.async_test)("'".concat(status_2, "' does NOT fire for bystander attendee #2"), function () { return sdk.api.endusers.getOne(bystander2.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })];
183
190
  case 10:
184
- _g.sent();
191
+ _j.sent();
185
192
  return [2 /*return*/];
186
193
  }
187
194
  });
188
195
  };
189
196
  _b = 0, ALL_STATUSES_2 = ALL_STATUSES;
190
- _f.label = 6;
197
+ _h.label = 6;
191
198
  case 6:
192
199
  if (!(_b < ALL_STATUSES_2.length)) return [3 /*break*/, 9];
193
200
  status_2 = ALL_STATUSES_2[_b];
194
201
  return [5 /*yield**/, _loop_1(status_2)];
195
202
  case 7:
196
- _f.sent();
197
- _f.label = 8;
203
+ _h.sent();
204
+ _h.label = 8;
198
205
  case 8:
199
206
  _b++;
200
207
  return [3 /*break*/, 6];
@@ -205,19 +212,19 @@ var group_event_attendee_status_triggers_tests = function (_a) {
205
212
  (0, testing_1.log_header)("Multiple distinct per-attendee statuses in one group event");
206
213
  return [4 /*yield*/, createEnduser()];
207
214
  case 10:
208
- aCompleted_1 = _f.sent();
215
+ aCompleted_1 = _h.sent();
209
216
  return [4 /*yield*/, createEnduser()];
210
217
  case 11:
211
- bNoShow_1 = _f.sent();
218
+ bNoShow_1 = _h.sent();
212
219
  return [4 /*yield*/, createEnduser()];
213
220
  case 12:
214
- cCancelled_1 = _f.sent();
221
+ cCancelled_1 = _h.sent();
215
222
  return [4 /*yield*/, createEnduser()];
216
223
  case 13:
217
- dUnset_1 = _f.sent();
224
+ dUnset_1 = _h.sent();
218
225
  return [4 /*yield*/, createGroupEvent([aCompleted_1.id, bNoShow_1.id, cCancelled_1.id, dUnset_1.id])];
219
226
  case 14:
220
- mixedEvent = _f.sent();
227
+ mixedEvent = _h.sent();
221
228
  return [4 /*yield*/, setAttendeeStatuses(mixedEvent.id, [
222
229
  { id: aCompleted_1.id, status: 'Completed' },
223
230
  { id: bNoShow_1.id, status: 'No-showed' },
@@ -225,19 +232,19 @@ var group_event_attendee_status_triggers_tests = function (_a) {
225
232
  // dUnset intentionally left without a status
226
233
  ])];
227
234
  case 15:
228
- _f.sent();
235
+ _h.sent();
229
236
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)]; // allow all triggers to fire
230
237
  case 16:
231
- _f.sent(); // allow all triggers to fire
238
+ _h.sent(); // allow all triggers to fire
232
239
  return [4 /*yield*/, (0, testing_1.async_test)("mixed: Completed attendee gets only the Completed tag", function () { return tagsOf(aCompleted_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Completed']) && ALL_STATUSES.every(function (s) { return s === 'Completed' || !tags.includes(TAG[s]); }); } })];
233
240
  case 17:
234
- _f.sent();
241
+ _h.sent();
235
242
  return [4 /*yield*/, (0, testing_1.async_test)("mixed: No-showed attendee gets only the No-showed tag", function () { return tagsOf(bNoShow_1.id); }, { onResult: function (tags) { return tags.includes(TAG['No-showed']) && ALL_STATUSES.every(function (s) { return s === 'No-showed' || !tags.includes(TAG[s]); }); } })];
236
243
  case 18:
237
- _f.sent();
244
+ _h.sent();
238
245
  return [4 /*yield*/, (0, testing_1.async_test)("mixed: Cancelled attendee gets only the Cancelled tag", function () { return tagsOf(cCancelled_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Cancelled']) && ALL_STATUSES.every(function (s) { return s === 'Cancelled' || !tags.includes(TAG[s]); }); } })];
239
246
  case 19:
240
- _f.sent();
247
+ _h.sent();
241
248
  return [4 /*yield*/, (0, testing_1.async_test)("mixed: unset attendee receives no tags", function () { return sdk.api.endusers.getOne(dUnset_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
242
249
  // ============================================================
243
250
  // Status transitions (A -> B): changing an attendee's status fires the NEW status's trigger.
@@ -249,7 +256,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
249
256
  // ============================================================
250
257
  ];
251
258
  case 20:
252
- _f.sent();
259
+ _h.sent();
253
260
  // ============================================================
254
261
  // Status transitions (A -> B): changing an attendee's status fires the NEW status's trigger.
255
262
  // Exercises both directions of the cancelledGroupAttendees mirroring:
@@ -261,28 +268,28 @@ var group_event_attendee_status_triggers_tests = function (_a) {
261
268
  (0, testing_1.log_header)("Per-attendee status transitions fire the new status only");
262
269
  return [4 /*yield*/, createEnduser()];
263
270
  case 21:
264
- transA_1 = _f.sent();
271
+ transA_1 = _h.sent();
265
272
  return [4 /*yield*/, createEnduser()];
266
273
  case 22:
267
- transABystander_1 = _f.sent();
274
+ transABystander_1 = _h.sent();
268
275
  return [4 /*yield*/, createGroupEvent([transA_1.id, transABystander_1.id])];
269
276
  case 23:
270
- transAEvent = _f.sent();
277
+ transAEvent = _h.sent();
271
278
  return [4 /*yield*/, setAttendeeStatuses(transAEvent.id, [{ id: transA_1.id, status: 'No-showed' }])];
272
279
  case 24:
273
- _f.sent();
280
+ _h.sent();
274
281
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
275
282
  case 25:
276
- _f.sent();
283
+ _h.sent();
277
284
  return [4 /*yield*/, (0, testing_1.async_test)("transition step 1: No-showed fires No-showed", function () { return tagsOf(transA_1.id); }, { onResult: function (tags) { return tags.includes(TAG['No-showed']); } })];
278
285
  case 26:
279
- _f.sent();
286
+ _h.sent();
280
287
  return [4 /*yield*/, setAttendeeStatuses(transAEvent.id, [{ id: transA_1.id, status: 'Completed' }])];
281
288
  case 27:
282
- _f.sent();
289
+ _h.sent();
283
290
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
284
291
  case 28:
285
- _f.sent();
292
+ _h.sent();
286
293
  return [4 /*yield*/, (0, testing_1.async_test)("transition No-showed -> Completed fires Completed (No-showed tag retained, no Cancelled)", function () { return tagsOf(transA_1.id); }, { onResult: function (tags) {
287
294
  return tags.includes(TAG['Completed'])
288
295
  && tags.includes(TAG['No-showed'])
@@ -291,33 +298,33 @@ var group_event_attendee_status_triggers_tests = function (_a) {
291
298
  }
292
299
  })];
293
300
  case 29:
294
- _f.sent();
301
+ _h.sent();
295
302
  return [4 /*yield*/, (0, testing_1.async_test)("transition (mirrored->unmirrored): bystander never fires", function () { return sdk.api.endusers.getOne(transABystander_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
296
303
  // unmirrored -> mirrored
297
304
  ];
298
305
  case 30:
299
- _f.sent();
306
+ _h.sent();
300
307
  return [4 /*yield*/, createEnduser()];
301
308
  case 31:
302
- transB_1 = _f.sent();
309
+ transB_1 = _h.sent();
303
310
  return [4 /*yield*/, createEnduser()];
304
311
  case 32:
305
- transBBystander_1 = _f.sent();
312
+ transBBystander_1 = _h.sent();
306
313
  return [4 /*yield*/, createGroupEvent([transB_1.id, transBBystander_1.id])];
307
314
  case 33:
308
- transBEvent = _f.sent();
315
+ transBEvent = _h.sent();
309
316
  return [4 /*yield*/, setAttendeeStatuses(transBEvent.id, [{ id: transB_1.id, status: 'Completed' }])];
310
317
  case 34:
311
- _f.sent();
318
+ _h.sent();
312
319
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
313
320
  case 35:
314
- _f.sent();
321
+ _h.sent();
315
322
  return [4 /*yield*/, setAttendeeStatuses(transBEvent.id, [{ id: transB_1.id, status: 'No-showed' }])];
316
323
  case 36:
317
- _f.sent();
324
+ _h.sent();
318
325
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
319
326
  case 37:
320
- _f.sent();
327
+ _h.sent();
321
328
  return [4 /*yield*/, (0, testing_1.async_test)("transition Completed -> No-showed fires No-showed (Completed tag retained, no Cancelled)", function () { return tagsOf(transB_1.id); }, { onResult: function (tags) {
322
329
  return tags.includes(TAG['No-showed'])
323
330
  && tags.includes(TAG['Completed'])
@@ -326,7 +333,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
326
333
  }
327
334
  })];
328
335
  case 38:
329
- _f.sent();
336
+ _h.sent();
330
337
  return [4 /*yield*/, (0, testing_1.async_test)("transition (unmirrored->mirrored): bystander never fires", function () { return sdk.api.endusers.getOne(transBBystander_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
331
338
  // ============================================================
332
339
  // 'by' filter on the per-attendee Cancelled path. The AttendeeStatusEditor update does not set
@@ -337,7 +344,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
337
344
  // ============================================================
338
345
  ];
339
346
  case 39:
340
- _f.sent();
347
+ _h.sent();
341
348
  // ============================================================
342
349
  // 'by' filter on the per-attendee Cancelled path. The AttendeeStatusEditor update does not set
343
350
  // statusChangeSource, so handle_cancelled_event's by-filter (which requires statusChangeSource
@@ -353,7 +360,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
353
360
  title: "Group Attendee Cancelled by user",
354
361
  })];
355
362
  case 40:
356
- byUserTrigger = _f.sent();
363
+ byUserTrigger = _h.sent();
357
364
  createdTriggerIds.push(byUserTrigger.id);
358
365
  return [4 /*yield*/, sdk.api.automation_triggers.createOne({
359
366
  event: { type: 'Appointment Cancelled', info: { by: 'enduser' } },
@@ -362,32 +369,32 @@ var group_event_attendee_status_triggers_tests = function (_a) {
362
369
  title: "Group Attendee Cancelled by enduser",
363
370
  })];
364
371
  case 41:
365
- byEnduserTrigger = _f.sent();
372
+ byEnduserTrigger = _h.sent();
366
373
  createdTriggerIds.push(byEnduserTrigger.id);
367
374
  return [4 /*yield*/, createEnduser()];
368
375
  case 42:
369
- byTarget_1 = _f.sent();
376
+ byTarget_1 = _h.sent();
370
377
  return [4 /*yield*/, createEnduser()];
371
378
  case 43:
372
- byBystander_1 = _f.sent();
379
+ byBystander_1 = _h.sent();
373
380
  return [4 /*yield*/, createGroupEvent([byTarget_1.id, byBystander_1.id])];
374
381
  case 44:
375
- byEvent = _f.sent();
382
+ byEvent = _h.sent();
376
383
  return [4 /*yield*/, setAttendeeStatuses(byEvent.id, [{ id: byTarget_1.id, status: 'Cancelled' }])];
377
384
  case 45:
378
- _f.sent();
385
+ _h.sent();
379
386
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
380
387
  case 46:
381
- _f.sent();
388
+ _h.sent();
382
389
  return [4 /*yield*/, (0, testing_1.async_test)("per-attendee cancel fires the unfiltered (by: undefined) Cancelled trigger", function () { return tagsOf(byTarget_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Cancelled']); } })];
383
390
  case 47:
384
- _f.sent();
391
+ _h.sent();
385
392
  return [4 /*yield*/, (0, testing_1.async_test)("per-attendee cancel does NOT fire by:'enduser' Cancelled trigger", function () { return tagsOf(byTarget_1.id); }, { onResult: function (tags) { return !tags.includes('Group Attendee Cancelled by:enduser'); } })];
386
393
  case 48:
387
- _f.sent();
394
+ _h.sent();
388
395
  return [4 /*yield*/, (0, testing_1.async_test)("per-attendee cancel does NOT fire by:'user' Cancelled trigger (statusChangeSource unset)", function () { return tagsOf(byTarget_1.id); }, { onResult: function (tags) { return !tags.includes('Group Attendee Cancelled by:user'); } })];
389
396
  case 49:
390
- _f.sent();
397
+ _h.sent();
391
398
  return [4 /*yield*/, (0, testing_1.async_test)("'by' filter case: bystander never fires", function () { return sdk.api.endusers.getOne(byBystander_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
392
399
  // ============================================================
393
400
  // bulk_update cancel_for_attendee fires Cancelled exactly once (via the new handler;
@@ -395,7 +402,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
395
402
  // ============================================================
396
403
  ];
397
404
  case 50:
398
- _f.sent();
405
+ _h.sent();
399
406
  // ============================================================
400
407
  // bulk_update cancel_for_attendee fires Cancelled exactly once (via the new handler;
401
408
  // the legacy cancelledGroupAttendees branch is suppressed by the attendeeStatuses filter).
@@ -403,10 +410,10 @@ var group_event_attendee_status_triggers_tests = function (_a) {
403
410
  (0, testing_1.log_header)("bulk_update cancel_for_attendee fires Cancelled for attendee");
404
411
  return [4 /*yield*/, createEnduser()];
405
412
  case 51:
406
- bulkTarget_1 = _f.sent();
413
+ bulkTarget_1 = _h.sent();
407
414
  return [4 /*yield*/, createEnduser()];
408
415
  case 52:
409
- bulkBystander_1 = _f.sent();
416
+ bulkBystander_1 = _h.sent();
410
417
  now = Date.now();
411
418
  DAY = 24 * 60 * 60 * 1000;
412
419
  return [4 /*yield*/, sdk.api.calendar_events.createOne({
@@ -416,7 +423,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
416
423
  attendees: [{ type: 'enduser', id: bulkTarget_1.id }, { type: 'enduser', id: bulkBystander_1.id }],
417
424
  })];
418
425
  case 53:
419
- rootEvent = _f.sent();
426
+ rootEvent = _h.sent();
420
427
  createdEventIds.push(rootEvent.id);
421
428
  return [4 /*yield*/, sdk.api.calendar_events.createOne({
422
429
  title: 'Group Status Test',
@@ -426,7 +433,7 @@ var group_event_attendee_status_triggers_tests = function (_a) {
426
433
  attendees: [{ type: 'enduser', id: bulkTarget_1.id }, { type: 'enduser', id: bulkBystander_1.id }],
427
434
  })];
428
435
  case 54:
429
- childEvent = _f.sent();
436
+ childEvent = _h.sent();
430
437
  createdEventIds.push(childEvent.id);
431
438
  return [4 /*yield*/, sdk.api.calendar_events.bulk_update({
432
439
  recurringEventId: rootEvent.id,
@@ -435,122 +442,331 @@ var group_event_attendee_status_triggers_tests = function (_a) {
435
442
  enduserId: bulkTarget_1.id,
436
443
  })];
437
444
  case 55:
438
- _f.sent();
445
+ _h.sent();
439
446
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
440
447
  case 56:
441
- _f.sent();
448
+ _h.sent();
442
449
  return [4 /*yield*/, (0, testing_1.async_test)("cancel_for_attendee fires Cancelled trigger for the target", function () { return tagsOf(bulkTarget_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Cancelled']); } })];
443
450
  case 57:
444
- _f.sent();
451
+ _h.sent();
445
452
  return [4 /*yield*/, (0, testing_1.async_test)("cancel_for_attendee does NOT fire for the bystander", function () { return sdk.api.endusers.getOne(bulkBystander_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
446
453
  // ============================================================
447
454
  // 'Confirmed' and clearing a status fire nothing.
448
455
  // ============================================================
449
456
  ];
450
457
  case 58:
451
- _f.sent();
458
+ _h.sent();
452
459
  // ============================================================
453
460
  // 'Confirmed' and clearing a status fire nothing.
454
461
  // ============================================================
455
462
  (0, testing_1.log_header)("Confirmed / cleared statuses fire no triggers");
456
463
  return [4 /*yield*/, createEnduser()];
457
464
  case 59:
458
- confirmEnduser_1 = _f.sent();
465
+ confirmEnduser_1 = _h.sent();
459
466
  return [4 /*yield*/, createEnduser()];
460
467
  case 60:
461
- clearEnduser_1 = _f.sent();
468
+ clearEnduser_1 = _h.sent();
462
469
  return [4 /*yield*/, createGroupEvent([confirmEnduser_1.id, clearEnduser_1.id])
463
470
  // set clearEnduser to No-showed, then clear it; set confirmEnduser to Confirmed
464
471
  ];
465
472
  case 61:
466
- noopEvent = _f.sent();
473
+ noopEvent = _h.sent();
467
474
  // set clearEnduser to No-showed, then clear it; set confirmEnduser to Confirmed
468
475
  return [4 /*yield*/, setAttendeeStatuses(noopEvent.id, [{ id: clearEnduser_1.id, status: 'No-showed' }])];
469
476
  case 62:
470
477
  // set clearEnduser to No-showed, then clear it; set confirmEnduser to Confirmed
471
- _f.sent();
478
+ _h.sent();
472
479
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
473
480
  case 63:
474
- _f.sent();
481
+ _h.sent();
475
482
  return [4 /*yield*/, setAttendeeStatuses(noopEvent.id, [{ id: confirmEnduser_1.id, status: 'Confirmed' }])]; // also clears clearEnduser
476
483
  case 64:
477
- _f.sent(); // also clears clearEnduser
484
+ _h.sent(); // also clears clearEnduser
478
485
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
479
486
  case 65:
480
- _f.sent();
487
+ _h.sent();
481
488
  return [4 /*yield*/, (0, testing_1.async_test)("'Confirmed' status fires no trigger", function () { return sdk.api.endusers.getOne(confirmEnduser_1.id); }, { onResult: function (e) { var _a; return !((_a = e.tags) === null || _a === void 0 ? void 0 : _a.length); } })
482
489
  // clearEnduser previously got the No-showed tag (that firing is expected); clearing must not
483
490
  // add anything new. Assert it still has exactly the one No-showed tag and nothing else.
484
491
  ];
485
492
  case 66:
486
- _f.sent();
493
+ _h.sent();
487
494
  // clearEnduser previously got the No-showed tag (that firing is expected); clearing must not
488
495
  // add anything new. Assert it still has exactly the one No-showed tag and nothing else.
489
- return [4 /*yield*/, (0, testing_1.async_test)("clearing a status fires no additional trigger", function () { return tagsOf(clearEnduser_1.id); }, { onResult: function (tags) { return tags.length === 1 && tags.includes(TAG['No-showed']); } })];
496
+ return [4 /*yield*/, (0, testing_1.async_test)("clearing a status fires no additional trigger", function () { return tagsOf(clearEnduser_1.id); }, { onResult: function (tags) { return tags.length === 1 && tags.includes(TAG['No-showed']); } })
497
+ // ============================================================
498
+ // Marking the WHOLE event Complete must not fan "Appointment Completed" out to attendees who
499
+ // already have an explicit per-attendee status — they were resolved individually (and already
500
+ // fired their own trigger via handle_attendee_status_change_triggers). Attendees with no status,
501
+ // or 'Confirmed', are still active participants and must still fire.
502
+ //
503
+ // Each case uses fresh endusers and a fresh event: triggers are throttled for 60s per
504
+ // trigger-per-enduser, and the completion handler early-returns once completedAt is already set.
505
+ //
506
+ // Not covered here: per-attendee 'Completed' followed by event-wide completion. That duplicate
507
+ // fire is already swallowed by the 60s throttle (which is applied before the action, and Add Tags
508
+ // is idempotent), so the assertion would pass with or without the filter.
509
+ // ============================================================
510
+ ];
490
511
  case 67:
491
512
  // clearEnduser previously got the No-showed tag (that firing is expected); clearing must not
492
513
  // add anything new. Assert it still has exactly the one No-showed tag and nothing else.
493
- _f.sent();
494
- return [3 /*break*/, 87];
514
+ _h.sent();
515
+ // ============================================================
516
+ // Marking the WHOLE event Complete must not fan "Appointment Completed" out to attendees who
517
+ // already have an explicit per-attendee status — they were resolved individually (and already
518
+ // fired their own trigger via handle_attendee_status_change_triggers). Attendees with no status,
519
+ // or 'Confirmed', are still active participants and must still fire.
520
+ //
521
+ // Each case uses fresh endusers and a fresh event: triggers are throttled for 60s per
522
+ // trigger-per-enduser, and the completion handler early-returns once completedAt is already set.
523
+ //
524
+ // Not covered here: per-attendee 'Completed' followed by event-wide completion. That duplicate
525
+ // fire is already swallowed by the 60s throttle (which is applied before the action, and Add Tags
526
+ // is idempotent), so the assertion would pass with or without the filter.
527
+ // ============================================================
528
+ (0, testing_1.log_header)("Event-wide completion respects per-attendee statuses");
529
+ _loop_2 = function (status_3) {
530
+ var target, active, event_2;
531
+ return __generator(this, function (_k) {
532
+ switch (_k.label) {
533
+ case 0: return [4 /*yield*/, createEnduser()];
534
+ case 1:
535
+ target = _k.sent();
536
+ return [4 /*yield*/, createEnduser()];
537
+ case 2:
538
+ active = _k.sent();
539
+ return [4 /*yield*/, createGroupEvent([target.id, active.id])];
540
+ case 3:
541
+ event_2 = _k.sent();
542
+ return [4 /*yield*/, setAttendeeStatuses(event_2.id, [{ id: target.id, status: status_3 }])];
543
+ case 4:
544
+ _k.sent();
545
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)
546
+ // pre-condition: the per-attendee status fired its own trigger
547
+ ];
548
+ case 5:
549
+ _k.sent();
550
+ // pre-condition: the per-attendee status fired its own trigger
551
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion setup: '".concat(status_3, "' attendee has the '").concat(status_3, "' tag"), function () { return tagsOf(target.id); }, { onResult: function (tags) { return tags.includes(TAG[status_3]); } })];
552
+ case 6:
553
+ // pre-condition: the per-attendee status fired its own trigger
554
+ _k.sent();
555
+ return [4 /*yield*/, markEventCompleted(event_2.id)];
556
+ case 7:
557
+ _k.sent();
558
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
559
+ case 8:
560
+ _k.sent();
561
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion does NOT fire Completed for the '".concat(status_3, "' attendee"), function () { return tagsOf(target.id); }, { onResult: function (tags) { return !tags.includes(TAG['Completed']); } })];
562
+ case 9:
563
+ _k.sent();
564
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion leaves the '".concat(status_3, "' attendee with only its own tag"), function () { return tagsOf(target.id); }, { onResult: function (tags) { return tags.length === 1 && tags.includes(TAG[status_3]); } })
565
+ // guard against over-filtering: the un-statused attendee must still be completed
566
+ ];
567
+ case 10:
568
+ _k.sent();
569
+ // guard against over-filtering: the un-statused attendee must still be completed
570
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion still fires Completed for the active attendee (alongside '".concat(status_3, "')"), function () { return tagsOf(active.id); }, { onResult: function (tags) { return tags.includes(TAG['Completed']); } })];
571
+ case 11:
572
+ // guard against over-filtering: the un-statused attendee must still be completed
573
+ _k.sent();
574
+ return [2 /*return*/];
575
+ }
576
+ });
577
+ };
578
+ _c = 0, _d = ['No-showed', 'Cancelled', 'Rescheduled'];
579
+ _h.label = 68;
495
580
  case 68:
496
- _c = 0, createdEventIds_1 = createdEventIds;
497
- _f.label = 69;
581
+ if (!(_c < _d.length)) return [3 /*break*/, 71];
582
+ status_3 = _d[_c];
583
+ return [5 /*yield**/, _loop_2(status_3)];
498
584
  case 69:
499
- if (!(_c < createdEventIds_1.length)) return [3 /*break*/, 74];
500
- id = createdEventIds_1[_c];
501
- _f.label = 70;
585
+ _h.sent();
586
+ _h.label = 70;
502
587
  case 70:
503
- _f.trys.push([70, 72, , 73]);
504
- return [4 /*yield*/, sdk.api.calendar_events.deleteOne(id)];
588
+ _c++;
589
+ return [3 /*break*/, 68];
505
590
  case 71:
506
- _f.sent();
507
- return [3 /*break*/, 73];
591
+ // cancelledGroupAttendees with no attendeeStatuses entry — the shape written by the patient
592
+ // portal when an enduser cancels themselves out of a group event.
593
+ (0, testing_1.log_header)("Event-wide completion respects legacy cancelledGroupAttendees");
594
+ return [4 /*yield*/, createEnduser()];
508
595
  case 72:
509
- _1 = _f.sent();
510
- return [3 /*break*/, 73];
596
+ portalCancelled_1 = _h.sent();
597
+ return [4 /*yield*/, createEnduser()];
511
598
  case 73:
512
- _c++;
513
- return [3 /*break*/, 69];
599
+ portalActive_1 = _h.sent();
600
+ return [4 /*yield*/, createGroupEvent([portalCancelled_1.id, portalActive_1.id])];
514
601
  case 74:
515
- _d = 0, createdEnduserIds_1 = createdEnduserIds;
516
- _f.label = 75;
602
+ portalEvent = _h.sent();
603
+ return [4 /*yield*/, sdk.api.calendar_events.updateOne(portalEvent.id, {
604
+ cancelledGroupAttendees: [{ id: portalCancelled_1.id, at: new Date() }],
605
+ }, { replaceObjectFields: true })];
517
606
  case 75:
518
- if (!(_d < createdEnduserIds_1.length)) return [3 /*break*/, 80];
519
- id = createdEnduserIds_1[_d];
520
- _f.label = 76;
607
+ _h.sent();
608
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)
609
+ // pre-condition: the legacy branch fires Cancelled for them
610
+ ];
521
611
  case 76:
522
- _f.trys.push([76, 78, , 79]);
523
- return [4 /*yield*/, sdk.api.endusers.deleteOne(id)];
612
+ _h.sent();
613
+ // pre-condition: the legacy branch fires Cancelled for them
614
+ return [4 /*yield*/, (0, testing_1.async_test)("legacy cancelledGroupAttendees setup: attendee has the Cancelled tag", function () { return tagsOf(portalCancelled_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Cancelled']); } })];
524
615
  case 77:
525
- _f.sent();
526
- return [3 /*break*/, 79];
616
+ // pre-condition: the legacy branch fires Cancelled for them
617
+ _h.sent();
618
+ return [4 /*yield*/, markEventCompleted(portalEvent.id)];
527
619
  case 78:
528
- _2 = _f.sent();
529
- return [3 /*break*/, 79];
620
+ _h.sent();
621
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
530
622
  case 79:
531
- _d++;
532
- return [3 /*break*/, 75];
623
+ _h.sent();
624
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion does NOT fire Completed for a cancelledGroupAttendees attendee", function () { return tagsOf(portalCancelled_1.id); }, { onResult: function (tags) { return !tags.includes(TAG['Completed']); } })];
533
625
  case 80:
534
- _e = 0, createdTriggerIds_1 = createdTriggerIds;
535
- _f.label = 81;
626
+ _h.sent();
627
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion still fires Completed for the active attendee (legacy cancel case)", function () { return tagsOf(portalActive_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Completed']); } })
628
+ // ============================================================
629
+ // Over-filtering guards: 'Confirmed' and no-status attendees must still complete.
630
+ // ============================================================
631
+ ];
536
632
  case 81:
537
- if (!(_e < createdTriggerIds_1.length)) return [3 /*break*/, 86];
538
- id = createdTriggerIds_1[_e];
539
- _f.label = 82;
633
+ _h.sent();
634
+ // ============================================================
635
+ // Over-filtering guards: 'Confirmed' and no-status attendees must still complete.
636
+ // ============================================================
637
+ (0, testing_1.log_header)("Event-wide completion still fires for Confirmed / un-statused attendees");
638
+ return [4 /*yield*/, createEnduser()];
540
639
  case 82:
541
- _f.trys.push([82, 84, , 85]);
542
- return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(id)];
640
+ confirmed_1 = _h.sent();
641
+ return [4 /*yield*/, createEnduser()];
543
642
  case 83:
544
- _f.sent();
545
- return [3 /*break*/, 85];
643
+ confirmedBystander_1 = _h.sent();
644
+ return [4 /*yield*/, createGroupEvent([confirmed_1.id, confirmedBystander_1.id])];
546
645
  case 84:
547
- _3 = _f.sent();
548
- return [3 /*break*/, 85];
646
+ confirmedEvent = _h.sent();
647
+ return [4 /*yield*/, setAttendeeStatuses(confirmedEvent.id, [{ id: confirmed_1.id, status: 'Confirmed' }])];
549
648
  case 85:
649
+ _h.sent();
650
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 750)];
651
+ case 86:
652
+ _h.sent();
653
+ return [4 /*yield*/, markEventCompleted(confirmedEvent.id)];
654
+ case 87:
655
+ _h.sent();
656
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
657
+ case 88:
658
+ _h.sent();
659
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion fires Completed for a 'Confirmed' attendee", function () { return tagsOf(confirmed_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Completed']); } })];
660
+ case 89:
661
+ _h.sent();
662
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion fires Completed for the bystander alongside 'Confirmed'", function () { return tagsOf(confirmedBystander_1.id); }, { onResult: function (tags) { return tags.includes(TAG['Completed']); } })
663
+ // baseline: a group event with no per-attendee statuses completes for everyone
664
+ ];
665
+ case 90:
666
+ _h.sent();
667
+ return [4 /*yield*/, createEnduser()];
668
+ case 91:
669
+ plain1 = _h.sent();
670
+ return [4 /*yield*/, createEnduser()];
671
+ case 92:
672
+ plain2 = _h.sent();
673
+ return [4 /*yield*/, createEnduser()];
674
+ case 93:
675
+ plain3 = _h.sent();
676
+ return [4 /*yield*/, createGroupEvent([plain1.id, plain2.id, plain3.id])];
677
+ case 94:
678
+ plainEvent = _h.sent();
679
+ return [4 /*yield*/, markEventCompleted(plainEvent.id)];
680
+ case 95:
681
+ _h.sent();
682
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
683
+ case 96:
684
+ _h.sent();
685
+ plainAttendees = [plain1, plain2, plain3];
686
+ _loop_3 = function (i) {
687
+ var enduserId;
688
+ return __generator(this, function (_l) {
689
+ switch (_l.label) {
690
+ case 0:
691
+ enduserId = plainAttendees[i].id;
692
+ return [4 /*yield*/, (0, testing_1.async_test)("event-wide completion fires Completed for un-statused attendee #".concat(i + 1), function () { return tagsOf(enduserId); }, { onResult: function (tags) { return tags.includes(TAG['Completed']); } })];
693
+ case 1:
694
+ _l.sent();
695
+ return [2 /*return*/];
696
+ }
697
+ });
698
+ };
699
+ i = 0;
700
+ _h.label = 97;
701
+ case 97:
702
+ if (!(i < plainAttendees.length)) return [3 /*break*/, 100];
703
+ return [5 /*yield**/, _loop_3(i)];
704
+ case 98:
705
+ _h.sent();
706
+ _h.label = 99;
707
+ case 99:
708
+ i++;
709
+ return [3 /*break*/, 97];
710
+ case 100: return [3 /*break*/, 120];
711
+ case 101:
712
+ _e = 0, createdEventIds_1 = createdEventIds;
713
+ _h.label = 102;
714
+ case 102:
715
+ if (!(_e < createdEventIds_1.length)) return [3 /*break*/, 107];
716
+ id = createdEventIds_1[_e];
717
+ _h.label = 103;
718
+ case 103:
719
+ _h.trys.push([103, 105, , 106]);
720
+ return [4 /*yield*/, sdk.api.calendar_events.deleteOne(id)];
721
+ case 104:
722
+ _h.sent();
723
+ return [3 /*break*/, 106];
724
+ case 105:
725
+ _1 = _h.sent();
726
+ return [3 /*break*/, 106];
727
+ case 106:
550
728
  _e++;
551
- return [3 /*break*/, 81];
552
- case 86: return [7 /*endfinally*/];
553
- case 87: return [2 /*return*/];
729
+ return [3 /*break*/, 102];
730
+ case 107:
731
+ _f = 0, createdEnduserIds_1 = createdEnduserIds;
732
+ _h.label = 108;
733
+ case 108:
734
+ if (!(_f < createdEnduserIds_1.length)) return [3 /*break*/, 113];
735
+ id = createdEnduserIds_1[_f];
736
+ _h.label = 109;
737
+ case 109:
738
+ _h.trys.push([109, 111, , 112]);
739
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(id)];
740
+ case 110:
741
+ _h.sent();
742
+ return [3 /*break*/, 112];
743
+ case 111:
744
+ _2 = _h.sent();
745
+ return [3 /*break*/, 112];
746
+ case 112:
747
+ _f++;
748
+ return [3 /*break*/, 108];
749
+ case 113:
750
+ _g = 0, createdTriggerIds_1 = createdTriggerIds;
751
+ _h.label = 114;
752
+ case 114:
753
+ if (!(_g < createdTriggerIds_1.length)) return [3 /*break*/, 119];
754
+ id = createdTriggerIds_1[_g];
755
+ _h.label = 115;
756
+ case 115:
757
+ _h.trys.push([115, 117, , 118]);
758
+ return [4 /*yield*/, sdk.api.automation_triggers.deleteOne(id)];
759
+ case 116:
760
+ _h.sent();
761
+ return [3 /*break*/, 118];
762
+ case 117:
763
+ _3 = _h.sent();
764
+ return [3 /*break*/, 118];
765
+ case 118:
766
+ _g++;
767
+ return [3 /*break*/, 114];
768
+ case 119: return [7 /*endfinally*/];
769
+ case 120: return [2 /*return*/];
554
770
  }
555
771
  });
556
772
  });