@tellescope/sdk 1.76.0 → 1.77.0

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.
@@ -153,7 +153,7 @@ var voidResult = function () { return true; };
153
153
  var passOnVoid = { shouldError: false, onResult: voidResult };
154
154
  // const isNull = (d: any) => d === null
155
155
  var setup_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
156
- var uInfo, originalAuthToken;
156
+ var badSDK, badEnduserSDK, uInfo, originalAuthToken;
157
157
  return __generator(this, function (_a) {
158
158
  switch (_a.label) {
159
159
  case 0:
@@ -164,89 +164,142 @@ var setup_tests = function () { return __awaiter(void 0, void 0, void 0, functio
164
164
  return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated', sdk.test_authenticated, { expectedResult: 'Authenticated!' })];
165
165
  case 2:
166
166
  _a.sent();
167
- return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated (with API Key)', (new sdk_1.Session({ host: host, apiKey: '3n5q0SCBT_iUvZz-b9BJtX7o7HQUVJ9v132PgHJNJsg.' /* local test key */ })).test_authenticated, { expectedResult: 'Authenticated!' })];
167
+ return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated (with API Key)', (new sdk_1.Session({ host: host, apiKey: '3n5q0SCBT_iUvZz-b9BJtX7o7HQUVJ9v132PgHJNJsg.' /* local test key */ })).test_authenticated, { expectedResult: 'Authenticated!' })
168
+ // login rate limit tests
169
+ ];
168
170
  case 3:
169
171
  _a.sent();
170
- return [4 /*yield*/, sdk.logout()];
172
+ badSDK = new sdk_1.Session({ host: host });
173
+ return [4 /*yield*/, badSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
171
174
  case 4:
172
175
  _a.sent();
173
- return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated - (logout invalidates jwt)', sdk.test_authenticated, { shouldError: true, onError: function (e) { return e === 'Unauthenticated'; } })];
176
+ return [4 /*yield*/, badSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
174
177
  case 5:
175
178
  _a.sent();
176
- return [4 /*yield*/, sdk.authenticate(email, password)];
179
+ return [4 /*yield*/, badSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
177
180
  case 6:
178
181
  _a.sent();
179
- return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated (re-authenticated)', sdk.test_authenticated, { expectedResult: 'Authenticated!' })];
182
+ return [4 /*yield*/, badSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
180
183
  case 7:
184
+ _a.sent();
185
+ return [4 /*yield*/, badSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
186
+ case 8:
187
+ _a.sent();
188
+ return [4 /*yield*/, (0, testing_1.async_test)('login rate limited', function () { return badSDK.authenticate('bademail@tellescope.com', 'badpassword@tellescope.com'); }, { shouldError: true, onError: function (e) { return e.message === 'Too many login attempts'; } })];
189
+ case 9:
190
+ _a.sent();
191
+ return [4 /*yield*/, (0, testing_1.async_test)('login not rate limited for other user', function () { return sdk.authenticate(email, password); }, passOnAnyResult)];
192
+ case 10:
193
+ _a.sent();
194
+ badEnduserSDK = new sdk_1.EnduserSession({ host: host, businessId: businessId });
195
+ return [4 /*yield*/, badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
196
+ case 11:
197
+ _a.sent();
198
+ return [4 /*yield*/, badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
199
+ case 12:
200
+ _a.sent();
201
+ return [4 /*yield*/, badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
202
+ case 13:
203
+ _a.sent();
204
+ return [4 /*yield*/, badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
205
+ case 14:
206
+ _a.sent();
207
+ return [4 /*yield*/, badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword').catch(console.error)];
208
+ case 15:
209
+ _a.sent();
210
+ return [4 /*yield*/, (0, testing_1.async_test)('login rate limited', function () { return badEnduserSDK.authenticate('bademail@tellescope.com', 'badpassword@tellescope.com'); }, { shouldError: true, onError: function (e) { return e.message === 'Too many login attempts'; } })];
211
+ case 16:
212
+ _a.sent();
213
+ return [4 /*yield*/, (0, testing_1.async_test)('login not rate limited for other enduser', function () { return badEnduserSDK.authenticate('otherbademail@tellescope.com', 'badpassword@tellescope.com'); }, { shouldError: true, onError: function (e) { return e.message !== 'Too many login attempts'; } })
214
+ // prevent additional login throttling
215
+ ];
216
+ case 17:
217
+ _a.sent();
218
+ // prevent additional login throttling
219
+ return [4 /*yield*/, (0, testing_1.async_test)('reset_db', function () { return sdk.reset_db(); }, passOnVoid)];
220
+ case 18:
221
+ // prevent additional login throttling
222
+ _a.sent();
223
+ return [4 /*yield*/, sdk.logout()];
224
+ case 19:
225
+ _a.sent();
226
+ return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated - (logout invalidates jwt)', sdk.test_authenticated, { shouldError: true, onError: function (e) { return e === 'Unauthenticated'; } })];
227
+ case 20:
228
+ _a.sent();
229
+ return [4 /*yield*/, sdk.authenticate(email, password)];
230
+ case 21:
231
+ _a.sent();
232
+ return [4 /*yield*/, (0, testing_1.async_test)('test_authenticated (re-authenticated)', sdk.test_authenticated, { expectedResult: 'Authenticated!' })];
233
+ case 22:
181
234
  _a.sent();
182
235
  uInfo = sdk.userInfo;
183
236
  originalAuthToken = sdk.authToken;
184
237
  return [4 /*yield*/, sdk.refresh_session()];
185
- case 8:
238
+ case 23:
186
239
  _a.sent();
187
240
  (0, testing_1.assert)(uInfo.id === sdk.userInfo.id, 'userInfo mismatch', 'userInfo id preserved after refresh');
188
241
  (0, testing_1.assert)(!!originalAuthToken && !!sdk.authToken && sdk.authToken !== originalAuthToken, 'same authToken after refresh', 'authToken refresh');
189
242
  return [4 /*yield*/, (0, testing_1.async_test)('role change by non-admin prevented (admin)', function () { return sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, { roles: ['Admin'] }, { replaceObjectFields: true }); }, handleAnyError)];
190
- case 9:
243
+ case 24:
191
244
  _a.sent();
192
245
  return [4 /*yield*/, (0, testing_1.async_test)('role change by non-admin prevented (non-admin)', function () { return sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, { roles: ['Not Admin'] }, { replaceObjectFields: true }); }, handleAnyError)
193
246
  // would assign default non-admin role, which could grant additional permissions than currently-defined non-admin role, should block
194
247
  ];
195
- case 10:
248
+ case 25:
196
249
  _a.sent();
197
250
  // would assign default non-admin role, which could grant additional permissions than currently-defined non-admin role, should block
198
251
  return [4 /*yield*/, (0, testing_1.async_test)('role change by non-admin prevented (empty)', function () { return sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, { roles: [] }, { replaceObjectFields: true }); }, handleAnyError)
199
252
  // ensure that going to "Non-Admin" triggers a role change
200
253
  ];
201
- case 11:
254
+ case 26:
202
255
  // would assign default non-admin role, which could grant additional permissions than currently-defined non-admin role, should block
203
256
  _a.sent();
204
257
  // ensure that going to "Non-Admin" triggers a role change
205
258
  return [4 /*yield*/, sdk.api.users.updateOne(sdkNonAdmin.userInfo.id, { roles: ['Test'] }, { replaceObjectFields: true })];
206
- case 12:
259
+ case 27:
207
260
  // ensure that going to "Non-Admin" triggers a role change
208
261
  _a.sent();
209
262
  return [4 /*yield*/, sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword)];
210
- case 13:
263
+ case 28:
211
264
  _a.sent();
212
265
  return [4 /*yield*/, (0, testing_1.async_test)('non admin authenticated', sdkNonAdmin.test_authenticated, { expectedResult: 'Authenticated!' })
213
266
  // reset nonAdmin role to a default non-admin
214
267
  ];
215
- case 14:
268
+ case 29:
216
269
  _a.sent();
217
270
  // reset nonAdmin role to a default non-admin
218
271
  return [4 /*yield*/, sdk.api.users.updateOne(sdkNonAdmin.userInfo.id, { roles: ['Non-Admin'] }, { replaceObjectFields: true })];
219
- case 15:
272
+ case 30:
220
273
  // reset nonAdmin role to a default non-admin
221
274
  _a.sent();
222
275
  // should be unauthenticated due to role change
223
276
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
224
- case 16:
277
+ case 31:
225
278
  // reset nonAdmin role to a default non-admin
226
279
  // should be unauthenticated due to role change
227
280
  _a.sent();
228
281
  return [4 /*yield*/, (0, testing_1.async_test)('role change causes deauthentication', sdkNonAdmin.test_authenticated, handleAnyError)
229
282
  // reauthenticate
230
283
  ];
231
- case 17:
284
+ case 32:
232
285
  _a.sent();
233
286
  // reauthenticate
234
287
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
235
- case 18:
288
+ case 33:
236
289
  // reauthenticate
237
290
  _a.sent();
238
291
  return [4 /*yield*/, sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword)
239
292
  // may do some stuff in background after returning
240
293
  ];
241
- case 19:
294
+ case 34:
242
295
  _a.sent();
243
296
  // may do some stuff in background after returning
244
297
  return [4 /*yield*/, (0, testing_1.async_test)('reset_db', function () { return sdk.reset_db(); }, passOnVoid)];
245
- case 20:
298
+ case 35:
246
299
  // may do some stuff in background after returning
247
300
  _a.sent();
248
301
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
249
- case 21:
302
+ case 36:
250
303
  _a.sent();
251
304
  return [2 /*return*/];
252
305
  }
@@ -441,64 +494,73 @@ var sub_organization_enduser_tests = function () { return __awaiter(void 0, void
441
494
  return [4 /*yield*/, enduserSDK.register({ email: 'root@tellescope.com', password: password })];
442
495
  case 1:
443
496
  _d.sent();
444
- return [4 /*yield*/, subEnduserSDK.register({ email: 'sub@tellescope.com', password: password })];
497
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)]; // avoid rate limiting error
445
498
  case 2:
499
+ _d.sent(); // avoid rate limiting error
500
+ return [4 /*yield*/, subEnduserSDK.register({ email: 'sub@tellescope.com', password: password })];
501
+ case 3:
446
502
  _d.sent();
503
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)]; // avoid rate limiting error
504
+ case 4:
505
+ _d.sent(); // avoid rate limiting error
447
506
  return [4 /*yield*/, enduserSDK.authenticate('root@tellescope.com', password)];
448
- case 3:
507
+ case 5:
449
508
  _d.sent();
509
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)]; // avoid rate limiting error
510
+ case 6:
511
+ _d.sent(); // avoid rate limiting error
450
512
  return [4 /*yield*/, subEnduserSDK.authenticate('sub@tellescope.com', password)];
451
- case 4:
513
+ case 7:
452
514
  _d.sent();
453
515
  (0, testing_1.assert)(!((_a = enduserSDK.userInfo.organizationIds) === null || _a === void 0 ? void 0 : _a.length), 'bad root organizationIds', 'root auth org ids');
454
516
  (0, testing_1.assert)(((_b = subEnduserSDK.userInfo.organizationIds) === null || _b === void 0 ? void 0 : _b.length) === 1, 'bad sub organizationIds', 'sub auth org ids');
455
517
  return [4 /*yield*/, enduserSDK.api.tickets.createOne({ title: 'root', enduserId: enduserSDK.userInfo.id })];
456
- case 5:
518
+ case 8:
457
519
  rootTicket = _d.sent();
458
520
  return [4 /*yield*/, (0, testing_1.async_test)("root get root", function () { return sdk.api.endusers.getOne(enduserSDK.userInfo.id); }, passOnAnyResult)];
459
- case 6:
521
+ case 9:
460
522
  _d.sent();
461
523
  return [4 /*yield*/, (0, testing_1.async_test)("sub get root error", function () { return sdkSub.api.endusers.getOne(enduserSDK.userInfo.id); }, handleAnyError)];
462
- case 7:
524
+ case 10:
463
525
  _d.sent();
464
526
  return [4 /*yield*/, (0, testing_1.async_test)("root get sub", function () { return sdk.api.endusers.getOne(subEnduserSDK.userInfo.id); }, passOnAnyResult)];
465
- case 8:
527
+ case 11:
466
528
  _d.sent();
467
529
  return [4 /*yield*/, (0, testing_1.async_test)("sub get sub", function () { return sdkSub.api.endusers.getOne(subEnduserSDK.userInfo.id); }, passOnAnyResult)];
468
- case 9:
530
+ case 12:
469
531
  _d.sent();
470
532
  return [4 /*yield*/, (0, testing_1.async_test)("root get root ticket", function () { return sdk.api.tickets.getOne(rootTicket.id); }, passOnAnyResult)];
471
- case 10:
533
+ case 13:
472
534
  _d.sent();
473
535
  return [4 /*yield*/, (0, testing_1.async_test)("sub get root ticket error", function () { return sdkSub.api.tickets.getOne(rootTicket.id); }, handleAnyError)];
474
- case 11:
536
+ case 14:
475
537
  _d.sent();
476
538
  return [4 /*yield*/, sdk.api.endusers.updateOne(enduserSDK.userInfo.id, { sharedWithOrganizations: [(_c = sdkSub.userInfo.organizationIds) !== null && _c !== void 0 ? _c : []] })];
477
- case 12:
539
+ case 15:
478
540
  _d.sent();
479
541
  return [4 /*yield*/, enduserSDK.refresh_session()]; // ensure updated session includes new sharedWithOrganizations
480
- case 13:
542
+ case 16:
481
543
  _d.sent(); // ensure updated session includes new sharedWithOrganizations
482
544
  return [4 /*yield*/, enduserSDK.api.tickets.createOne({ title: 'root with shared', enduserId: enduserSDK.userInfo.id })];
483
- case 14:
545
+ case 17:
484
546
  rootTicketAfterUpdate = _d.sent();
485
547
  return [4 /*yield*/, (0, testing_1.async_test)("root get root", function () { return sdk.api.endusers.getOne(enduserSDK.userInfo.id); }, passOnAnyResult)];
486
- case 15:
548
+ case 18:
487
549
  _d.sent();
488
550
  return [4 /*yield*/, (0, testing_1.async_test)("sub get root after update", function () { return sdkSub.api.endusers.getOne(enduserSDK.userInfo.id); }, passOnAnyResult)];
489
- case 16:
551
+ case 19:
490
552
  _d.sent();
491
553
  return [4 /*yield*/, (0, testing_1.async_test)("root get sub", function () { return sdk.api.endusers.getOne(subEnduserSDK.userInfo.id); }, passOnAnyResult)];
492
- case 17:
554
+ case 20:
493
555
  _d.sent();
494
556
  return [4 /*yield*/, (0, testing_1.async_test)("sub get sub", function () { return sdkSub.api.endusers.getOne(subEnduserSDK.userInfo.id); }, passOnAnyResult)];
495
- case 18:
557
+ case 21:
496
558
  _d.sent();
497
559
  return [4 /*yield*/, (0, testing_1.async_test)("root get root ticket after update", function () { return sdk.api.tickets.getOne(rootTicketAfterUpdate.id); }, passOnAnyResult)];
498
- case 19:
560
+ case 22:
499
561
  _d.sent();
500
562
  return [4 /*yield*/, (0, testing_1.async_test)("sub get root ticket after update", function () { return sdkSub.api.tickets.getOne(rootTicketAfterUpdate.id); }, passOnAnyResult)];
501
- case 20:
563
+ case 23:
502
564
  _d.sent();
503
565
  return [4 /*yield*/, Promise.all([
504
566
  sdk.api.endusers.deleteOne(enduserSDK.userInfo.id),
@@ -506,7 +568,7 @@ var sub_organization_enduser_tests = function () { return __awaiter(void 0, void
506
568
  sdk.api.tickets.deleteOne(rootTicket.id),
507
569
  sdk.api.tickets.deleteOne(rootTicketAfterUpdate.id),
508
570
  ])];
509
- case 21:
571
+ case 24:
510
572
  _d.sent();
511
573
  return [2 /*return*/];
512
574
  }
@@ -7038,6 +7100,7 @@ var validate_schema = function () {
7038
7100
  endpoints.add(path);
7039
7101
  }
7040
7102
  }
7103
+ console.log("Schema validated");
7041
7104
  };
7042
7105
  var test_weighted_round_robin = function () { return __awaiter(void 0, void 0, void 0, function () {
7043
7106
  var testUsers, userIds, testAssignments, run_assignment_simulation;
@@ -7658,7 +7721,7 @@ var ticket_reminder_tests = function () { return __awaiter(void 0, void 0, void
7658
7721
  return (((_b = (_a = t.reminders) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.didRemind) === true
7659
7722
  && t.nextReminderInMS !== -1
7660
7723
  && ((_d = (_c = t.reminders) === null || _c === void 0 ? void 0 : _c.filter(function (r) { return r.didRemind; })) === null || _d === void 0 ? void 0 : _d.length) === 1);
7661
- }, 25, 200); }, passOnAnyResult)];
7724
+ }, 10, 500); }, passOnAnyResult)];
7662
7725
  case 13:
7663
7726
  _a.sent();
7664
7727
  return [4 /*yield*/, (0, testing_1.async_test)("Delayed reminder not processed yet", function () { return sdk.api.tickets.getOne(tToRemind.id); }, {
@@ -7916,6 +7979,274 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
7916
7979
  }
7917
7980
  });
7918
7981
  }); };
7982
+ var sync_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
7983
+ var from, e, t, e2;
7984
+ return __generator(this, function (_a) {
7985
+ switch (_a.label) {
7986
+ case 0:
7987
+ (0, testing_1.log_header)("Data Sync");
7988
+ from = new Date();
7989
+ return [4 /*yield*/, (0, testing_1.async_test)("No new records, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
7990
+ var results = _a.results;
7991
+ return results.length === 0;
7992
+ } })];
7993
+ case 1:
7994
+ _a.sent();
7995
+ return [4 /*yield*/, (0, testing_1.async_test)("No new records, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
7996
+ var results = _a.results;
7997
+ return results.length === 0;
7998
+ } })];
7999
+ case 2:
8000
+ _a.sent();
8001
+ return [4 /*yield*/, sdk.api.endusers.createOne({})];
8002
+ case 3:
8003
+ e = _a.sent();
8004
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8005
+ case 4:
8006
+ _a.sent();
8007
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser create, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
8008
+ var results = _a.results;
8009
+ return (results.length === 1
8010
+ && results[0].modelName === 'endusers'
8011
+ && results[0].recordId === e.id
8012
+ && results[0].data.includes(e.id)
8013
+ && JSON.parse(results[0].data) // tests no error throwing
8014
+ );
8015
+ } })];
8016
+ case 5:
8017
+ _a.sent();
8018
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser create, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8019
+ var results = _a.results;
8020
+ return results.length === 0;
8021
+ } })];
8022
+ case 6:
8023
+ _a.sent();
8024
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser create, sub organization", function () { return sdkSub.sync({ from: from }); }, { onResult: function (_a) {
8025
+ var results = _a.results;
8026
+ return results.length === 0;
8027
+ } })];
8028
+ case 7:
8029
+ _a.sent();
8030
+ return [4 /*yield*/, sdk.api.endusers.updateOne(e.id, { fname: "UPDATE_TEST" })];
8031
+ case 8:
8032
+ _a.sent();
8033
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8034
+ case 9:
8035
+ _a.sent();
8036
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser update, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
8037
+ var results = _a.results;
8038
+ return (results.length === 1
8039
+ && results[0].modelName === 'endusers'
8040
+ && results[0].recordId === e.id
8041
+ && results[0].data.includes("UPDATE_TEST"));
8042
+ } })];
8043
+ case 10:
8044
+ _a.sent();
8045
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser update, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8046
+ var results = _a.results;
8047
+ return results.length === 0;
8048
+ } })];
8049
+ case 11:
8050
+ _a.sent();
8051
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser update, sub organization", function () { return sdkSub.sync({ from: from }); }, { onResult: function (_a) {
8052
+ var results = _a.results;
8053
+ return results.length === 0;
8054
+ } })];
8055
+ case 12:
8056
+ _a.sent();
8057
+ return [4 /*yield*/, sdk.api.tickets.createOne({ title: 'access test' })];
8058
+ case 13:
8059
+ t = _a.sent();
8060
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8061
+ case 14:
8062
+ _a.sent();
8063
+ return [4 /*yield*/, (0, testing_1.async_test)("Non-admin can't access ticket", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8064
+ var results = _a.results;
8065
+ return results.length === 0;
8066
+ } })
8067
+ // creates a user notification which increments count/index
8068
+ ];
8069
+ case 15:
8070
+ _a.sent();
8071
+ // creates a user notification which increments count/index
8072
+ sdk.api.tickets.updateOne(t.id, { owner: sdkNonAdmin.userInfo.id });
8073
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8074
+ case 16:
8075
+ _a.sent();
8076
+ return [4 /*yield*/, (0, testing_1.async_test)("Non-admin can access tickets on assignment", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8077
+ var results = _a.results;
8078
+ return results.length === 2;
8079
+ } })];
8080
+ case 17:
8081
+ _a.sent();
8082
+ sdk.api.tickets.updateOne(t.id, { owner: '' });
8083
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8084
+ case 18:
8085
+ _a.sent();
8086
+ return [4 /*yield*/, (0, testing_1.async_test)("Non-admin can't access tickets on unassignment", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8087
+ var results = _a.results;
8088
+ return results.length === 1;
8089
+ } })];
8090
+ case 19:
8091
+ _a.sent();
8092
+ return [4 /*yield*/, sdk.api.endusers.updateOne(e.id, { assignedTo: [sdkNonAdmin.userInfo.id] }, { replaceObjectFields: true })];
8093
+ case 20:
8094
+ _a.sent();
8095
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8096
+ case 21:
8097
+ _a.sent();
8098
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser update non-admin assignment, can access", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8099
+ var results = _a.results;
8100
+ return results.length === 2;
8101
+ } })];
8102
+ case 22:
8103
+ _a.sent();
8104
+ sdk.api.tickets.updateOne(t.id, { owner: '', enduserId: e.id });
8105
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8106
+ case 23:
8107
+ _a.sent();
8108
+ return [4 /*yield*/, (0, testing_1.async_test)("Non-admin can access ticket (and enduser) after enduser assignment", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8109
+ var results = _a.results;
8110
+ return results.length === 3;
8111
+ } })];
8112
+ case 24:
8113
+ _a.sent();
8114
+ return [4 /*yield*/, sdk.api.endusers.updateOne(e.id, { assignedTo: [] }, { replaceObjectFields: true })];
8115
+ case 25:
8116
+ _a.sent();
8117
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8118
+ case 26:
8119
+ _a.sent();
8120
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser update non-admin assignment, revoked access to enduser and ticket", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8121
+ var results = _a.results;
8122
+ return results.length === 1;
8123
+ } })
8124
+ // enduser, ticket, and ticket assignment user_notification created
8125
+ ];
8126
+ case 27:
8127
+ _a.sent();
8128
+ // enduser, ticket, and ticket assignment user_notification created
8129
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(e.id)];
8130
+ case 28:
8131
+ // enduser, ticket, and ticket assignment user_notification created
8132
+ _a.sent();
8133
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8134
+ case 29:
8135
+ _a.sent();
8136
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser delete, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
8137
+ var results = _a.results;
8138
+ return (results.length === 3
8139
+ && results[0].modelName === 'endusers'
8140
+ && results[0].recordId === e.id
8141
+ && results[0].data === 'deleted');
8142
+ } })];
8143
+ case 30:
8144
+ _a.sent();
8145
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser delete, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8146
+ var results = _a.results;
8147
+ return results.length === 1;
8148
+ } })];
8149
+ case 31:
8150
+ _a.sent();
8151
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser delete, sub organization", function () { return sdkSub.sync({ from: from }); }, { onResult: function (_a) {
8152
+ var results = _a.results;
8153
+ return results.length === 0;
8154
+ } })
8155
+ // bulk create test coverage
8156
+ ];
8157
+ case 32:
8158
+ _a.sent();
8159
+ return [4 /*yield*/, sdk.api.endusers.createSome([{}])];
8160
+ case 33:
8161
+ e2 = (_a.sent()).created[0];
8162
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8163
+ case 34:
8164
+ _a.sent();
8165
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser create, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
8166
+ var results = _a.results;
8167
+ return (results.length === 4
8168
+ && results[0].modelName === 'endusers'
8169
+ && results[0].recordId === e2.id
8170
+ && results[0].data.includes(e2.id)
8171
+ && JSON.parse(results[0].data) // tests no error throwing
8172
+ );
8173
+ } })];
8174
+ case 35:
8175
+ _a.sent();
8176
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser create, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8177
+ var results = _a.results;
8178
+ return results.length === 1;
8179
+ } })];
8180
+ case 36:
8181
+ _a.sent();
8182
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser create, sub organization", function () { return sdkSub.sync({ from: from }); }, { onResult: function (_a) {
8183
+ var results = _a.results;
8184
+ return results.length === 0;
8185
+ } })];
8186
+ case 37:
8187
+ _a.sent();
8188
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(e2.id)];
8189
+ case 38:
8190
+ _a.sent();
8191
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 100)];
8192
+ case 39:
8193
+ _a.sent();
8194
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser delete, admin", function () { return sdk.sync({ from: from }); }, { onResult: function (_a) {
8195
+ var results = _a.results;
8196
+ return (results.length === 4
8197
+ && results[0].modelName === 'endusers'
8198
+ && results[0].recordId === e2.id
8199
+ && results[0].data === 'deleted');
8200
+ } })];
8201
+ case 40:
8202
+ _a.sent();
8203
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser delete, non-admin", function () { return sdkNonAdmin.sync({ from: from }); }, { onResult: function (_a) {
8204
+ var results = _a.results;
8205
+ return results.length === 1;
8206
+ } })];
8207
+ case 41:
8208
+ _a.sent();
8209
+ return [4 /*yield*/, (0, testing_1.async_test)("Bulk Enduser delete, sub organization", function () { return sdkSub.sync({ from: from }); }, { onResult: function (_a) {
8210
+ var results = _a.results;
8211
+ return results.length === 0;
8212
+ } })];
8213
+ case 42:
8214
+ _a.sent();
8215
+ return [2 /*return*/];
8216
+ }
8217
+ });
8218
+ }); };
8219
+ // to cover potential vulernabilities with enduser public register endpoint
8220
+ var register_as_enduser_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
8221
+ var enduser;
8222
+ return __generator(this, function (_a) {
8223
+ switch (_a.label) {
8224
+ case 0:
8225
+ (0, testing_1.log_header)("Register as Enduser");
8226
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser register", function () { return enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' }); }, passOnAnyResult)];
8227
+ case 1:
8228
+ _a.sent();
8229
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser register (rate limited)", function () { return enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' }); }, { shouldError: true, onError: function (e) { return e.message === "Too many requests"; } })];
8230
+ case 2:
8231
+ _a.sent();
8232
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
8233
+ case 3:
8234
+ _a.sent();
8235
+ return [4 /*yield*/, (0, testing_1.async_test)("Enduser duplicate register (same response, no ability to enumerate contacts)", function () { return enduserSDK.register({ email: 'test@tellescope.com', password: 'testpassWord12345!' }); }, passOnAnyResult)];
8236
+ case 4:
8237
+ _a.sent();
8238
+ return [4 /*yield*/, sdk.api.endusers.getOne({ email: 'test@tellescope.com' })];
8239
+ case 5:
8240
+ enduser = _a.sent();
8241
+ if (!enduser) return [3 /*break*/, 7];
8242
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
8243
+ case 6:
8244
+ _a.sent();
8245
+ _a.label = 7;
8246
+ case 7: return [2 /*return*/];
8247
+ }
8248
+ });
8249
+ }); };
7919
8250
  (function () { return __awaiter(void 0, void 0, void 0, function () {
7920
8251
  var err_1, n, _a, _b, _c, _i, returnValidation, t, _d, _f, _g, _h, err_2;
7921
8252
  var _j, _k;
@@ -7928,7 +8259,7 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
7928
8259
  _l.sent();
7929
8260
  _l.label = 2;
7930
8261
  case 2:
7931
- _l.trys.push([2, 47, , 48]);
8262
+ _l.trys.push([2, 49, , 50]);
7932
8263
  (0, exports.form_conditional_logic_tests)();
7933
8264
  return [4 /*yield*/, test_weighted_round_robin()];
7934
8265
  case 3:
@@ -7942,11 +8273,10 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
7942
8273
  sdkOtherSub.authenticate(otherSubUserEmail, password),
7943
8274
  sdkSubSub.authenticate(subSubUserEmail, password),
7944
8275
  sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword),
7945
- ])
7946
- // console.log(JSON.stringify(await sdk.bulk_load({ load: [{ model: 'users' }]}), null, 2))
7947
- ];
8276
+ ])];
7948
8277
  case 5:
7949
8278
  _l.sent();
8279
+ console.log("Authentication done");
7950
8280
  // console.log(JSON.stringify(await sdk.bulk_load({ load: [{ model: 'users' }]}), null, 2))
7951
8281
  return [4 /*yield*/, (0, testing_1.async_test)("count exists",
7952
8282
  // @ts-ignore
@@ -7966,120 +8296,126 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
7966
8296
  return [4 /*yield*/, multi_tenant_tests()]; // should come right after setup tests
7967
8297
  case 10:
7968
8298
  _l.sent(); // should come right after setup tests
7969
- return [4 /*yield*/, lockout_tests()];
8299
+ return [4 /*yield*/, register_as_enduser_tests()];
7970
8300
  case 11:
7971
8301
  _l.sent();
7972
- return [4 /*yield*/, (0, exports.self_serve_appointment_booking_tests)()];
8302
+ return [4 /*yield*/, sync_tests()];
7973
8303
  case 12:
8304
+ _l.sent();
8305
+ return [4 /*yield*/, lockout_tests()];
8306
+ case 13:
8307
+ _l.sent();
8308
+ return [4 /*yield*/, (0, exports.self_serve_appointment_booking_tests)()];
8309
+ case 14:
7974
8310
  _l.sent();
7975
8311
  return [4 /*yield*/, delete_user_tests()
7976
8312
  // await test_send_with_template()
7977
8313
  ];
7978
- case 13:
8314
+ case 15:
7979
8315
  _l.sent();
7980
8316
  // await test_send_with_template()
7981
8317
  return [4 /*yield*/, bulk_read_tests()];
7982
- case 14:
8318
+ case 16:
7983
8319
  // await test_send_with_template()
7984
8320
  _l.sent();
7985
8321
  return [4 /*yield*/, (0, exports.ticket_reminder_tests)()];
7986
- case 15:
8322
+ case 17:
7987
8323
  _l.sent();
7988
8324
  return [4 /*yield*/, enduser_access_tags_tests()];
7989
- case 16:
8325
+ case 18:
7990
8326
  _l.sent();
7991
8327
  return [4 /*yield*/, marketing_email_unsubscribe_tests()];
7992
- case 17:
8328
+ case 19:
7993
8329
  _l.sent();
7994
8330
  return [4 /*yield*/, unique_strings_tests()];
7995
- case 18:
8331
+ case 20:
7996
8332
  _l.sent();
7997
8333
  return [4 /*yield*/, (0, exports.alternate_phones_tests)()];
7998
- case 19:
8334
+ case 21:
7999
8335
  _l.sent();
8000
8336
  return [4 /*yield*/, (0, exports.ticket_queue_tests)()];
8001
- case 20:
8337
+ case 22:
8002
8338
  _l.sent();
8003
8339
  return [4 /*yield*/, (0, exports.no_chained_triggers_tests)()];
8004
- case 21:
8340
+ case 23:
8005
8341
  _l.sent();
8006
8342
  return [4 /*yield*/, field_equals_trigger_tests()];
8007
- case 22:
8343
+ case 24:
8008
8344
  _l.sent();
8009
8345
  return [4 /*yield*/, test_ticket_automation_assignment_and_optimization()];
8010
- case 23:
8346
+ case 25:
8011
8347
  _l.sent();
8012
8348
  return [4 /*yield*/, role_based_access_tests()];
8013
- case 24:
8349
+ case 26:
8014
8350
  _l.sent();
8015
8351
  return [4 /*yield*/, automation_trigger_tests()];
8016
- case 25:
8352
+ case 27:
8017
8353
  _l.sent();
8018
8354
  return [4 /*yield*/, enduser_session_tests()];
8019
- case 26:
8355
+ case 28:
8020
8356
  _l.sent();
8021
8357
  return [4 /*yield*/, nextReminderInMS_tests()];
8022
- case 27:
8358
+ case 29:
8023
8359
  _l.sent();
8024
8360
  return [4 /*yield*/, search_tests()];
8025
- case 28:
8361
+ case 30:
8026
8362
  _l.sent();
8027
8363
  return [4 /*yield*/, wait_for_trigger_tests()];
8028
- case 29:
8364
+ case 31:
8029
8365
  _l.sent();
8030
8366
  return [4 /*yield*/, pdf_generation()];
8031
- case 30:
8367
+ case 32:
8032
8368
  _l.sent();
8033
8369
  return [4 /*yield*/, remove_from_journey_on_incoming_comms_tests()];
8034
- case 31:
8370
+ case 33:
8035
8371
  _l.sent();
8036
8372
  return [4 /*yield*/, rate_limit_tests()];
8037
- case 32:
8373
+ case 34:
8038
8374
  _l.sent();
8039
8375
  return [4 /*yield*/, merge_enduser_tests()];
8040
- case 33:
8376
+ case 35:
8041
8377
  _l.sent();
8042
8378
  return [4 /*yield*/, auto_reply_tests()];
8043
- case 34:
8379
+ case 36:
8044
8380
  _l.sent();
8045
8381
  return [4 /*yield*/, sub_organization_enduser_tests()];
8046
- case 35:
8382
+ case 37:
8047
8383
  _l.sent();
8048
8384
  return [4 /*yield*/, sub_organization_tests()];
8049
- case 36:
8385
+ case 38:
8050
8386
  _l.sent();
8051
8387
  return [4 /*yield*/, (0, exports.filter_by_date_tests)()];
8052
- case 37:
8388
+ case 39:
8053
8389
  _l.sent();
8054
8390
  return [4 /*yield*/, generate_user_auth_tests()];
8055
- case 38:
8391
+ case 40:
8056
8392
  _l.sent();
8057
8393
  return [4 /*yield*/, generateEnduserAuthTests()];
8058
- case 39:
8394
+ case 41:
8059
8395
  _l.sent();
8060
8396
  return [4 /*yield*/, public_form_tests()];
8061
- case 40:
8397
+ case 42:
8062
8398
  _l.sent();
8063
8399
  return [4 /*yield*/, badInputTests()];
8064
- case 41:
8400
+ case 43:
8065
8401
  _l.sent();
8066
8402
  return [4 /*yield*/, filterTests()];
8067
- case 42:
8403
+ case 44:
8068
8404
  _l.sent();
8069
8405
  return [4 /*yield*/, updatesTests()];
8070
- case 43:
8406
+ case 45:
8071
8407
  _l.sent();
8072
8408
  return [4 /*yield*/, threadKeyTests()];
8073
- case 44:
8409
+ case 46:
8074
8410
  _l.sent();
8075
8411
  return [4 /*yield*/, enduserAccessTests()];
8076
- case 45:
8412
+ case 47:
8077
8413
  _l.sent();
8078
8414
  return [4 /*yield*/, enduser_redaction_tests()];
8079
- case 46:
8415
+ case 48:
8080
8416
  _l.sent();
8081
- return [3 /*break*/, 48];
8082
- case 47:
8417
+ return [3 /*break*/, 50];
8418
+ case 49:
8083
8419
  err_1 = _l.sent();
8084
8420
  console.error("Failed during custom test");
8085
8421
  if (err_1.message && err_1.info) {
@@ -8089,18 +8425,18 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
8089
8425
  console.error(err_1);
8090
8426
  }
8091
8427
  process.exit(1);
8092
- return [3 /*break*/, 48];
8093
- case 48:
8428
+ return [3 /*break*/, 50];
8429
+ case 50:
8094
8430
  _a = schema_1.schema;
8095
8431
  _b = [];
8096
8432
  for (_c in _a)
8097
8433
  _b.push(_c);
8098
8434
  _i = 0;
8099
- _l.label = 49;
8100
- case 49:
8101
- if (!(_i < _b.length)) return [3 /*break*/, 52];
8435
+ _l.label = 51;
8436
+ case 51:
8437
+ if (!(_i < _b.length)) return [3 /*break*/, 54];
8102
8438
  _c = _b[_i];
8103
- if (!(_c in _a)) return [3 /*break*/, 51];
8439
+ if (!(_c in _a)) return [3 /*break*/, 53];
8104
8440
  n = _c;
8105
8441
  returnValidation = (_k = (_j = schema_1.schema[n].customActions) === null || _j === void 0 ? void 0 : _j.create) === null || _k === void 0 ? void 0 : _k.returns;
8106
8442
  return [4 /*yield*/, run_generated_tests({
@@ -8111,41 +8447,41 @@ var lockout_tests = function () { return __awaiter(void 0, void 0, void 0, funct
8111
8447
  create: returnValidation // ModelFields<ClientModel>,
8112
8448
  }
8113
8449
  })];
8114
- case 50:
8450
+ case 52:
8115
8451
  _l.sent();
8116
- _l.label = 51;
8117
- case 51:
8452
+ _l.label = 53;
8453
+ case 53:
8118
8454
  _i++;
8119
- return [3 /*break*/, 49];
8120
- case 52:
8455
+ return [3 /*break*/, 51];
8456
+ case 54:
8121
8457
  _d = tests;
8122
8458
  _f = [];
8123
8459
  for (_g in _d)
8124
8460
  _f.push(_g);
8125
8461
  _h = 0;
8126
- _l.label = 53;
8127
- case 53:
8128
- if (!(_h < _f.length)) return [3 /*break*/, 58];
8462
+ _l.label = 55;
8463
+ case 55:
8464
+ if (!(_h < _f.length)) return [3 /*break*/, 60];
8129
8465
  _g = _f[_h];
8130
- if (!(_g in _d)) return [3 /*break*/, 57];
8466
+ if (!(_g in _d)) return [3 /*break*/, 59];
8131
8467
  t = _g;
8132
- _l.label = 54;
8133
- case 54:
8134
- _l.trys.push([54, 56, , 57]);
8468
+ _l.label = 56;
8469
+ case 56:
8470
+ _l.trys.push([56, 58, , 59]);
8135
8471
  return [4 /*yield*/, tests[t]()];
8136
- case 55:
8472
+ case 57:
8137
8473
  _l.sent();
8138
- return [3 /*break*/, 57];
8139
- case 56:
8474
+ return [3 /*break*/, 59];
8475
+ case 58:
8140
8476
  err_2 = _l.sent();
8141
8477
  console.error("Error running test:");
8142
8478
  console.error(err_2);
8143
8479
  process.exit(1);
8144
- return [3 /*break*/, 57];
8145
- case 57:
8480
+ return [3 /*break*/, 59];
8481
+ case 59:
8146
8482
  _h++;
8147
- return [3 /*break*/, 53];
8148
- case 58:
8483
+ return [3 /*break*/, 55];
8484
+ case 60:
8149
8485
  process.exit();
8150
8486
  return [2 /*return*/];
8151
8487
  }