@tellescope/sdk 1.252.3 → 1.253.1

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 (51) hide show
  1. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts +6 -0
  2. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -0
  3. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js +256 -0
  4. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js.map +1 -0
  5. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts +43 -0
  6. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -0
  7. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js +168 -0
  8. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js.map +1 -0
  9. package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts +23 -0
  10. package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +325 -0
  12. package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  14. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +177 -0
  15. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  16. package/lib/cjs/tests/api_tests/user_portal_settings.test.d.ts.map +1 -1
  17. package/lib/cjs/tests/api_tests/user_portal_settings.test.js +104 -28
  18. package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -1
  19. package/lib/cjs/tests/tests.d.ts.map +1 -1
  20. package/lib/cjs/tests/tests.js +444 -174
  21. package/lib/cjs/tests/tests.js.map +1 -1
  22. package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts +6 -0
  23. package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -0
  24. package/lib/esm/tests/api_tests/beluga_manual_sync.test.js +252 -0
  25. package/lib/esm/tests/api_tests/beluga_manual_sync.test.js.map +1 -0
  26. package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts +43 -0
  27. package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -0
  28. package/lib/esm/tests/api_tests/gcal_sync_retry.test.js +164 -0
  29. package/lib/esm/tests/api_tests/gcal_sync_retry.test.js.map +1 -0
  30. package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts +23 -0
  31. package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -0
  32. package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +321 -0
  33. package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -0
  34. package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  35. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +177 -0
  36. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  37. package/lib/esm/tests/api_tests/user_portal_settings.test.d.ts.map +1 -1
  38. package/lib/esm/tests/api_tests/user_portal_settings.test.js +104 -28
  39. package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -1
  40. package/lib/esm/tests/tests.d.ts.map +1 -1
  41. package/lib/esm/tests/tests.js +444 -174
  42. package/lib/esm/tests/tests.js.map +1 -1
  43. package/lib/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +10 -10
  45. package/src/tests/api_tests/beluga_manual_sync.test.ts +159 -0
  46. package/src/tests/api_tests/gcal_sync_retry.test.ts +104 -0
  47. package/src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts +214 -0
  48. package/src/tests/api_tests/set_fields_order_templates.test.ts +122 -0
  49. package/src/tests/api_tests/user_portal_settings.test.ts +71 -1
  50. package/src/tests/tests.ts +222 -6
  51. package/test_generated.pdf +0 -0
@@ -25,6 +25,11 @@ export const user_portal_settings_tests = async ({ sdk, sdkNonAdmin }: { sdk: Se
25
25
  let testEnduserId: string | undefined
26
26
  let enduserSDK: EnduserSession | undefined
27
27
 
28
+ // Organization.onboardingStatus shares userPortalSettingsValidator — save the
29
+ // current value so we can restore it after exercising the field below.
30
+ const orgId = sdk.userInfo.businessId
31
+ const originalOnboardingStatus = (await sdk.api.organizations.getOne(orgId)).onboardingStatus
32
+
28
33
  try {
29
34
  // ===== Valid: string values =====
30
35
  await async_test(
@@ -179,6 +184,63 @@ export const user_portal_settings_tests = async ({ sdk, sdkNonAdmin }: { sdk: Se
179
184
  }
180
185
  )
181
186
 
187
+ // ===== Organization.onboardingStatus: same key-value shape as portalSettings =====
188
+ await async_test(
189
+ 'onboardingStatus - mixed string and boolean values round-trip',
190
+ async () => {
191
+ await sdk.api.organizations.updateOne(
192
+ orgId,
193
+ { onboardingStatus: { completedIntro: true, currentStep: 'billing', skippedTour: false } },
194
+ { replaceObjectFields: true }
195
+ )
196
+ const updated = await sdk.api.organizations.getOne(orgId)
197
+ return updated.onboardingStatus
198
+ },
199
+ {
200
+ onResult: (r) =>
201
+ r?.completedIntro === true &&
202
+ typeof r?.completedIntro === 'boolean' &&
203
+ r?.currentStep === 'billing' &&
204
+ typeof r?.currentStep === 'string' &&
205
+ r?.skippedTour === false &&
206
+ typeof r?.skippedTour === 'boolean',
207
+ }
208
+ )
209
+
210
+ await async_test(
211
+ 'onboardingStatus - empty object accepted',
212
+ async () => {
213
+ await sdk.api.organizations.updateOne(orgId, { onboardingStatus: {} }, { replaceObjectFields: true })
214
+ const updated = await sdk.api.organizations.getOne(orgId)
215
+ return updated.onboardingStatus
216
+ },
217
+ { onResult: (r) => !!r && typeof r === 'object' && Object.keys(r).length === 0 }
218
+ )
219
+
220
+ // breaking change: the previous string shape must no longer be accepted
221
+ await async_test(
222
+ 'onboardingStatus - plain string (old shape) rejected',
223
+ () => sdk.api.organizations.updateOne(
224
+ orgId,
225
+ { onboardingStatus: 'started' as any },
226
+ { replaceObjectFields: true }
227
+ ),
228
+ handleAnyError
229
+ )
230
+
231
+ // representative validator rejection, confirming the indexable validator is
232
+ // enforced on the organizations route (full coverage lives in the
233
+ // portalSettings cases above, which use the same validator)
234
+ await async_test(
235
+ 'onboardingStatus - number value rejected',
236
+ () => sdk.api.organizations.updateOne(
237
+ orgId,
238
+ { onboardingStatus: { k: 1 as any } },
239
+ { replaceObjectFields: true }
240
+ ),
241
+ handleAnyError
242
+ )
243
+
182
244
  console.log("✅ All User portalSettings tests passed!")
183
245
  } finally {
184
246
  try {
@@ -189,7 +251,15 @@ export const user_portal_settings_tests = async ({ sdk, sdkNonAdmin }: { sdk: Se
189
251
  await sdk.api.endusers.deleteOne(testEnduserId)
190
252
  }
191
253
  } finally {
192
- await sdk.api.users.deleteOne(testUser.id)
254
+ try {
255
+ await sdk.api.organizations.updateOne(
256
+ orgId,
257
+ { onboardingStatus: originalOnboardingStatus ?? {} },
258
+ { replaceObjectFields: true }
259
+ )
260
+ } finally {
261
+ await sdk.api.users.deleteOne(testUser.id)
262
+ }
193
263
  }
194
264
  }
195
265
  }
@@ -91,6 +91,7 @@ import { chats_analytics_tests } from "./api_tests/chats_analytics.test";
91
91
  import { no_access_permission_checks_tests } from "./api_tests/no_access_permission_checks.test";
92
92
  import { field_redaction_tests } from "./api_tests/field_redaction.test";
93
93
  import { data_sync_redaction_bypass_tests } from "./api_tests/security/F-0001-data-sync-redaction-bypass.test";
94
+ import { enduser_write_restrictions_tests } from "./api_tests/security/F-0106-F-0110-enduser-write-restrictions.test";
94
95
  import { ai_conversations_rbac_tests } from "./api_tests/security/F-0005-ai-conversations-rbac.test";
95
96
  import { cascade_role_rename_cross_tenant_tests } from "./api_tests/security/F-0053-cascade-role-rename-cross-tenant.test";
96
97
  import { self_admin_role_assignment_tests } from "./api_tests/security/F-0076-self-admin-role-assignment.test";
@@ -114,6 +115,7 @@ import { organization_settings_duplicates_tests } from "./api_tests/organization
114
115
  import { calendar_events_bulk_update_tests } from "./api_tests/calendar_events_bulk_update.test";
115
116
  import { openloop_webhooks_tests } from "./api_tests/openloop_webhooks.test";
116
117
  import { beluga_pharmacy_mappings_tests } from "./api_tests/beluga_pharmacy_mappings.test";
118
+ import { beluga_manual_sync_tests } from "./api_tests/beluga_manual_sync.test";
117
119
  import { mdi_webhooks_tests } from "./api_tests/mdi_webhooks.test";
118
120
  import { account_switcher_tests } from "./api_tests/account_switcher.test";
119
121
  import { set_fields_order_templates_tests } from "./api_tests/set_fields_order_templates.test";
@@ -4296,12 +4298,208 @@ const assign_care_team_tests = async () => {
4296
4298
  { onResult: e => e.assignedTo?.length === 1 && e.primaryAssignee === e.assignedTo[0] }
4297
4299
  )
4298
4300
 
4301
+ // restrictByState (state credentialing) tests
4302
+ await sdk.api.users.updateOne(sdk.userInfo.id, { credentialedStates: [{ state: 'CA' }] }, { replaceObjectFields: true })
4303
+
4304
+ const t4 = await sdk.api.automation_triggers.createOne({
4305
+ title: 't4',
4306
+ event: { type: 'Tag Added', info: { tag: 'Trigger State' } },
4307
+ action: {
4308
+ type: "Assign Care Team",
4309
+ info: {
4310
+ tags: { qualifier: 'One Of', values: ["Assignment"] },
4311
+ restrictByState: true,
4312
+ },
4313
+ },
4314
+ status: 'Active',
4315
+ })
4316
+ const e2 = await sdk.api.endusers.createOne({ state: 'CA' })
4317
+ const e3 = await sdk.api.endusers.createOne({ state: 'NY' })
4318
+ const e4 = await sdk.api.endusers.createOne({ })
4319
+
4320
+ await Promise.all([
4321
+ sdk.api.endusers.updateOne(e2.id, { tags: ['Trigger State'] }),
4322
+ sdk.api.endusers.updateOne(e3.id, { tags: ['Trigger State'] }),
4323
+ sdk.api.endusers.updateOne(e4.id, { tags: ['Trigger State'] }),
4324
+ ])
4325
+ await wait(undefined, 500) // allow triggers to happen
4326
+ await async_test(
4327
+ "Care team added for enduser in credentialed state",
4328
+ () => sdk.api.endusers.getOne(e2.id),
4329
+ { onResult: e => e.assignedTo?.length === 1 }
4330
+ )
4331
+ await async_test(
4332
+ "No care team added for enduser in non-credentialed state",
4333
+ () => sdk.api.endusers.getOne(e3.id),
4334
+ { onResult: e => !e.assignedTo?.length }
4335
+ )
4336
+ await async_test(
4337
+ "No care team added for enduser with unknown state",
4338
+ () => sdk.api.endusers.getOne(e4.id),
4339
+ { onResult: e => !e.assignedTo?.length }
4340
+ )
4341
+
4342
+ // creating multiple appointments in a single request routes through bulk_handle_actions_for_triggers
4343
+ // (unlike Tag Added above, which uses the per-enduser handler), covering the bulk Assign Care Team
4344
+ // path with mixed enduser states in one batch
4345
+ const t5 = await sdk.api.automation_triggers.createOne({
4346
+ title: 't5',
4347
+ event: { type: 'Appointment Created', info: { titles: ['Bulk Assign State'] } },
4348
+ action: {
4349
+ type: "Assign Care Team",
4350
+ info: {
4351
+ tags: { qualifier: 'One Of', values: ["Assignment"] },
4352
+ restrictByState: true,
4353
+ setAsPrimary: true, // not yet supported in the bulk handler — see canary assertion below
4354
+ },
4355
+ },
4356
+ status: 'Active',
4357
+ })
4358
+ const e5 = await sdk.api.endusers.createOne({ state: 'CA' })
4359
+ const e6 = await sdk.api.endusers.createOne({ state: 'NY' })
4360
+ const e7 = await sdk.api.endusers.createOne({ })
4361
+
4362
+ const bulkEvents = (await sdk.api.calendar_events.createSome([
4363
+ { title: 'Bulk Assign State', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e5.id }] },
4364
+ { title: 'Bulk Assign State', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e6.id }] },
4365
+ { title: 'Bulk Assign State', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e7.id }] },
4366
+ ])).created
4367
+ await wait(undefined, 500) // allow triggers to happen
4368
+ await async_test(
4369
+ "(Bulk) Care team added for enduser in credentialed state",
4370
+ () => sdk.api.endusers.getOne(e5.id),
4371
+ { onResult: e => e.assignedTo?.length === 1 }
4372
+ )
4373
+ // canary: the bulk handler doesn't implement setAsPrimary (the per-enduser handler does), so a set
4374
+ // primaryAssignee here means multi-event creates no longer route through the bulk handler (or
4375
+ // setAsPrimary was implemented there — update this test if so)
4376
+ await async_test(
4377
+ "(Bulk) Primary not set (bulk handler routing canary)",
4378
+ () => sdk.api.endusers.getOne(e5.id),
4379
+ { onResult: e => !e.primaryAssignee }
4380
+ )
4381
+ await async_test(
4382
+ "(Bulk) No care team added for enduser in non-credentialed state",
4383
+ () => sdk.api.endusers.getOne(e6.id),
4384
+ { onResult: e => !e.assignedTo?.length }
4385
+ )
4386
+ await async_test(
4387
+ "(Bulk) No care team added for enduser with unknown state",
4388
+ () => sdk.api.endusers.getOne(e7.id),
4389
+ { onResult: e => !e.assignedTo?.length }
4390
+ )
4391
+
4392
+ // bulk path with restrictByState off: state should not matter (default behavior unchanged)
4393
+ const t6 = await sdk.api.automation_triggers.createOne({
4394
+ title: 't6',
4395
+ event: { type: 'Appointment Created', info: { titles: ['Bulk Assign Any'] } },
4396
+ action: {
4397
+ type: "Assign Care Team",
4398
+ info: {
4399
+ tags: { qualifier: 'One Of', values: ["Assignment"] },
4400
+ },
4401
+ },
4402
+ status: 'Active',
4403
+ })
4404
+ const bulkEventsAny = (await sdk.api.calendar_events.createSome([
4405
+ { title: 'Bulk Assign Any', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e6.id }] },
4406
+ { title: 'Bulk Assign Any', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e7.id }] },
4407
+ ])).created
4408
+ await wait(undefined, 500) // allow triggers to happen
4409
+ await async_test(
4410
+ "(Bulk, no restriction) Care team added for enduser in non-credentialed state",
4411
+ () => sdk.api.endusers.getOne(e6.id),
4412
+ { onResult: e => e.assignedTo?.length === 1 }
4413
+ )
4414
+ await async_test(
4415
+ "(Bulk, no restriction) Care team added for enduser with unknown state",
4416
+ () => sdk.api.endusers.getOne(e7.id),
4417
+ { onResult: e => e.assignedTo?.length === 1 }
4418
+ )
4419
+
4420
+ // limitToOneUser on both handler branches: with two matching users, exactly one is assigned
4421
+ const u2 = await sdk.api.users.createOne({
4422
+ email: `assign-care-team-limit-${Date.now()}@tellescope.example`, fname: 'Throwaway', lname: 'Assignment',
4423
+ } as any)
4424
+ await sdk.api.users.updateOne(u2.id, { tags: ['Assignment'], credentialedStates: [{ state: 'CA' }] }, { replaceObjectFields: true })
4425
+
4426
+ const t7 = await sdk.api.automation_triggers.createOne({
4427
+ title: 't7',
4428
+ event: { type: 'Tag Added', info: { tag: 'Trigger One' } },
4429
+ action: {
4430
+ type: "Assign Care Team",
4431
+ info: {
4432
+ tags: { qualifier: 'One Of', values: ["Assignment"] },
4433
+ restrictByState: true,
4434
+ limitToOneUser: true,
4435
+ },
4436
+ },
4437
+ status: 'Active',
4438
+ })
4439
+ const e8 = await sdk.api.endusers.createOne({ state: 'CA' })
4440
+ await sdk.api.endusers.updateOne(e8.id, { tags: ['Trigger One'] })
4441
+ await wait(undefined, 500) // allow triggers to happen
4442
+ await async_test(
4443
+ "(limitToOneUser) Exactly one of multiple matching users assigned",
4444
+ () => sdk.api.endusers.getOne(e8.id),
4445
+ { onResult: e => e.assignedTo?.length === 1 }
4446
+ )
4447
+
4448
+ const t8 = await sdk.api.automation_triggers.createOne({
4449
+ title: 't8',
4450
+ event: { type: 'Appointment Created', info: { titles: ['Bulk Assign One'] } },
4451
+ action: {
4452
+ type: "Assign Care Team",
4453
+ info: {
4454
+ tags: { qualifier: 'One Of', values: ["Assignment"] },
4455
+ restrictByState: true,
4456
+ limitToOneUser: true,
4457
+ },
4458
+ },
4459
+ status: 'Active',
4460
+ })
4461
+ const e9 = await sdk.api.endusers.createOne({ state: 'CA' })
4462
+ const e10 = await sdk.api.endusers.createOne({ state: 'CA' })
4463
+ const bulkEventsOne = (await sdk.api.calendar_events.createSome([
4464
+ { title: 'Bulk Assign One', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e9.id }] },
4465
+ { title: 'Bulk Assign One', durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ type: 'enduser', id: e10.id }] },
4466
+ ])).created
4467
+ await wait(undefined, 500) // allow triggers to happen
4468
+ await async_test(
4469
+ "(Bulk, limitToOneUser) Exactly one of multiple matching users assigned",
4470
+ () => sdk.api.endusers.getOne(e9.id),
4471
+ { onResult: e => e.assignedTo?.length === 1 }
4472
+ )
4473
+ await async_test(
4474
+ "(Bulk, limitToOneUser) Exactly one of multiple matching users assigned (second enduser)",
4475
+ () => sdk.api.endusers.getOne(e10.id),
4476
+ { onResult: e => e.assignedTo?.length === 1 }
4477
+ )
4478
+
4299
4479
  await Promise.all([
4300
- sdk.api.users.updateOne(sdk.userInfo.id, { tags: [] }, { replaceObjectFields: true }),
4480
+ sdk.api.users.updateOne(sdk.userInfo.id, { tags: [], credentialedStates: [] }, { replaceObjectFields: true }),
4301
4481
  sdk.api.endusers.deleteOne(e1.id),
4482
+ sdk.api.endusers.deleteOne(e2.id),
4483
+ sdk.api.endusers.deleteOne(e3.id),
4484
+ sdk.api.endusers.deleteOne(e4.id),
4485
+ sdk.api.endusers.deleteOne(e5.id),
4486
+ sdk.api.endusers.deleteOne(e6.id),
4487
+ sdk.api.endusers.deleteOne(e7.id),
4302
4488
  sdk.api.automation_triggers.deleteOne(t1.id),
4303
4489
  sdk.api.automation_triggers.deleteOne(t2.id),
4304
4490
  sdk.api.automation_triggers.deleteOne(t3.id),
4491
+ sdk.api.endusers.deleteOne(e8.id),
4492
+ sdk.api.endusers.deleteOne(e9.id),
4493
+ sdk.api.endusers.deleteOne(e10.id),
4494
+ sdk.api.users.deleteOne(u2.id),
4495
+ sdk.api.automation_triggers.deleteOne(t4.id),
4496
+ sdk.api.automation_triggers.deleteOne(t5.id),
4497
+ sdk.api.automation_triggers.deleteOne(t6.id),
4498
+ sdk.api.automation_triggers.deleteOne(t7.id),
4499
+ sdk.api.automation_triggers.deleteOne(t8.id),
4500
+ ...bulkEvents.map(e => sdk.api.calendar_events.deleteOne(e.id)),
4501
+ ...bulkEventsAny.map(e => sdk.api.calendar_events.deleteOne(e.id)),
4502
+ ...bulkEventsOne.map(e => sdk.api.calendar_events.deleteOne(e.id)),
4305
4503
  ])
4306
4504
  }
4307
4505
 
@@ -5104,6 +5302,7 @@ const trigger_events_api_tests = async () => {
5104
5302
  const automation_trigger_tests = async () => {
5105
5303
  log_header("Automation Trigger Tests")
5106
5304
 
5305
+ await assign_care_team_tests()
5107
5306
  await push_forms_to_portal_group_completion_tests({ sdk, sdkNonAdmin })
5108
5307
  await order_status_equals_tests()
5109
5308
  await set_fields_order_templates_tests({ sdk, sdkNonAdmin })
@@ -5118,7 +5317,6 @@ const automation_trigger_tests = async () => {
5118
5317
  await trigger_events_api_tests()
5119
5318
  await fields_changed_tests()
5120
5319
  await field_equals_trigger_tests()
5121
- await assign_care_team_tests()
5122
5320
  await contact_created_tests()
5123
5321
  await appointment_created_tests()
5124
5322
  await tag_added_tests()
@@ -11147,7 +11345,23 @@ const register_as_enduser_tests = async () => {
11147
11345
  )
11148
11346
  await async_test(
11149
11347
  "Enduser register (rate limited)",
11150
- () => enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' }),
11348
+ // The register limiter records its throttle event at request start with a 1s expiry
11349
+ // (countPerInterval: 1, intervalInMS: 1000), so back-to-back registers are only
11350
+ // rate limited when they land within 1s of each other. A slow register (bcrypt on a
11351
+ // cold/loaded server) can exceed the window and flake — retry the pair instead of
11352
+ // failing on a timing miss. Any "Too many requests" from either call is the expected error.
11353
+ async () => {
11354
+ for (let attempt = 0; attempt < 3; attempt++) {
11355
+ const windowStart = Date.now()
11356
+ await enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' })
11357
+ await enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' })
11358
+ if (Date.now() - windowStart < 900) {
11359
+ return 'two registers within the same 1s window were not rate limited'
11360
+ }
11361
+ await wait(undefined, 1100) // let the throttle window expire before retrying the pair
11362
+ }
11363
+ return 'rate-limit timing window missed on every attempt'
11364
+ },
11151
11365
  { shouldError: true, onError: e => e.message === "Too many requests" }
11152
11366
  )
11153
11367
  await wait(undefined, 1000)
@@ -14333,6 +14547,11 @@ const ip_address_form_tests = async () => {
14333
14547
  await replace_form_field_template_values_tests()
14334
14548
  await mfa_tests()
14335
14549
  await setup_tests(sdk, sdkNonAdmin)
14550
+ await beluga_manual_sync_tests({ sdk, sdkNonAdmin })
14551
+ await beluga_pharmacy_mappings_tests({ sdk, sdkNonAdmin })
14552
+ await enduser_write_restrictions_tests({ sdk, sdkNonAdmin })
14553
+ await user_portal_settings_tests({ sdk, sdkNonAdmin })
14554
+ await automation_trigger_tests()
14336
14555
  await invite_user_enumeration_tests({ sdk, sdkNonAdmin })
14337
14556
  await handle_incoming_communication_cross_tenant_tests({ sdk, sdkNonAdmin })
14338
14557
  await calendar_event_webhook_template_tests({ sdk, sdkNonAdmin })
@@ -14344,7 +14563,6 @@ const ip_address_form_tests = async () => {
14344
14563
  await self_admin_role_assignment_tests({ sdk, sdkNonAdmin })
14345
14564
  await sanitize_user_html_xss_tests()
14346
14565
  await prototype_pollution_tests()
14347
- await automation_trigger_tests()
14348
14566
  await account_switcher_tests({ sdk, sdkNonAdmin })
14349
14567
  await enduser_login_tests({ sdk, sdkNonAdmin })
14350
14568
  await outbound_chat_sent_trigger_tests({ sdk })
@@ -14384,7 +14602,6 @@ const ip_address_form_tests = async () => {
14384
14602
  await load_threads_autobuild_tests({ sdk, sdkNonAdmin })
14385
14603
  await inbox_threads_new_fields_tests()
14386
14604
  await auto_merge_form_submission_tests({ sdk, sdkNonAdmin })
14387
- await beluga_pharmacy_mappings_tests({ sdk, sdkNonAdmin })
14388
14605
  await threadKeyTests()
14389
14606
  await managed_content_enduser_access_tests({ sdk, sdkNonAdmin })
14390
14607
  await managed_content_file_access_tests({ sdk, sdkNonAdmin })
@@ -14400,7 +14617,6 @@ const ip_address_form_tests = async () => {
14400
14617
  await inbox_threads_loading_tests()
14401
14618
  await load_inbox_data_tests({ sdk, sdkNonAdmin })
14402
14619
  await enduser_observations_acknowledge_tests({ sdk, sdkNonAdmin })
14403
- await user_portal_settings_tests({ sdk, sdkNonAdmin })
14404
14620
  await create_user_notifications_trigger_tests({ sdk })
14405
14621
  await group_mms_active_tests()
14406
14622
  await auto_reply_tests()
Binary file