@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.
- package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js +256 -0
- package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts +43 -0
- package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js +168 -0
- package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts +23 -0
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +325 -0
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +177 -0
- package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/user_portal_settings.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js +104 -28
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -1
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +444 -174
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/beluga_manual_sync.test.js +252 -0
- package/lib/esm/tests/api_tests/beluga_manual_sync.test.js.map +1 -0
- package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts +43 -0
- package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/gcal_sync_retry.test.js +164 -0
- package/lib/esm/tests/api_tests/gcal_sync_retry.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts +23 -0
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +321 -0
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -0
- package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +177 -0
- package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
- package/lib/esm/tests/api_tests/user_portal_settings.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/user_portal_settings.test.js +104 -28
- package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -1
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +444 -174
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/tests/api_tests/beluga_manual_sync.test.ts +159 -0
- package/src/tests/api_tests/gcal_sync_retry.test.ts +104 -0
- package/src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts +214 -0
- package/src/tests/api_tests/set_fields_order_templates.test.ts +122 -0
- package/src/tests/api_tests/user_portal_settings.test.ts +71 -1
- package/src/tests/tests.ts +222 -6
- 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
|
-
|
|
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
|
}
|
package/src/tests/tests.ts
CHANGED
|
@@ -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
|
-
|
|
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()
|
package/test_generated.pdf
CHANGED
|
Binary file
|