@tellescope/sdk 1.3.48 → 1.4.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.
@@ -82,7 +82,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
82
82
  return (mod && mod.__esModule) ? mod : { "default": mod };
83
83
  };
84
84
  Object.defineProperty(exports, "__esModule", { value: true });
85
- exports.filter_by_date_tests = exports.databases_tests = exports.calendar_event_RSVPs_tests = exports.managed_content_records_tests = exports.meetings_tests = exports.cancelConditionsTests = void 0;
85
+ exports.self_serve_appointment_booking_tests = exports.filter_by_date_tests = exports.databases_tests = exports.calendar_event_RSVPs_tests = exports.managed_content_records_tests = exports.meetings_tests = exports.cancelConditionsTests = void 0;
86
86
  require('source-map-support').install();
87
87
  var crypto_1 = __importDefault(require("crypto"));
88
88
  var buffer = __importStar(require("buffer")); // only node >=15.7.0
@@ -583,7 +583,7 @@ var verify_missing_defaults = function (_a) {
583
583
  });
584
584
  };
585
585
  var validateReturnType = function (fs, r, d) {
586
- var validation = (0, validation_1.fieldsToValidation)(fs !== null && fs !== void 0 ? fs : {});
586
+ var validation = (0, validation_1.fieldsToValidationOld)(fs !== null && fs !== void 0 ? fs : {});
587
587
  try {
588
588
  for (var f in r) {
589
589
  (validation[f] || d._default)(r[f]);
@@ -629,7 +629,7 @@ var run_generated_tests = function (_a) {
629
629
  case 3:
630
630
  _c.sent();
631
631
  defaultValidation = {
632
- id: (0, validation_1.mongoIdValidator)(), _default: function (x) { return x; }
632
+ id: validation_1.mongoIdStringRequired.validate(), _default: function (x) { return x; },
633
633
  };
634
634
  // If no create, cannot test get, update, or delete
635
635
  if (!(model.defaultActions.create || model.customActions.create))
@@ -909,41 +909,75 @@ var journey_tests = function (queries) {
909
909
  return [4 /*yield*/, queries.updateOne(journey.id, { states: [{ name: 'First', priority: "N/A" }, { name: 'Added', priority: "N/A" }] }, { replaceObjectFields: true })];
910
910
  case 26:
911
911
  _g.sent();
912
- return [4 /*yield*/, (0, testing_1.async_test)("journey-update - insert new state at front", function () { return queries.getOne(journey.id); }, { onResult: function (j) { return (0, utilities_1.objects_equivalent)(j.states, [{ name: 'First', priority: "N/A" }, { name: 'Added', priority: "N/A" }]); } })];
912
+ return [4 /*yield*/, (0, testing_1.async_test)("journey-update - insert new state at front", function () { return queries.getOne(journey.id); }, { onResult: function (j) { return (0, utilities_1.objects_equivalent)(j.states, [{ name: 'First', priority: "N/A" }, { name: 'Added', priority: "N/A" }]); } })
913
+ // removed
914
+ // await async_test(
915
+ // `journey-updateState`,
916
+ // () => queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' }}),
917
+ // passOnVoid,
918
+ // )
919
+ // await wait(undefined, 25) // wait for side effects to update endusers
920
+ // await async_test(
921
+ // `journey-updateState verify propagation to enduser 1`,
922
+ // () => sdk.api.endusers.getOne(e1.id),
923
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated' })},
924
+ // )
925
+ // await async_test(
926
+ // `journey-updateState verify propagation to enduser 2`,
927
+ // () => sdk.api.endusers.getOne(e2.id),
928
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated', [journey2.id]: 'New' })},
929
+ // )
930
+ ];
913
931
  case 27:
914
932
  _g.sent();
915
- return [4 /*yield*/, (0, testing_1.async_test)("journey-updateState", function () { return queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' } }); }, passOnVoid)];
933
+ // removed
934
+ // await async_test(
935
+ // `journey-updateState`,
936
+ // () => queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' }}),
937
+ // passOnVoid,
938
+ // )
939
+ // await wait(undefined, 25) // wait for side effects to update endusers
940
+ // await async_test(
941
+ // `journey-updateState verify propagation to enduser 1`,
942
+ // () => sdk.api.endusers.getOne(e1.id),
943
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated' })},
944
+ // )
945
+ // await async_test(
946
+ // `journey-updateState verify propagation to enduser 2`,
947
+ // () => sdk.api.endusers.getOne(e2.id),
948
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated', [journey2.id]: 'New' })},
949
+ // )
950
+ return [4 /*yield*/, queries.deleteOne(journey.id)];
916
951
  case 28:
952
+ // removed
953
+ // await async_test(
954
+ // `journey-updateState`,
955
+ // () => queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' }}),
956
+ // passOnVoid,
957
+ // )
958
+ // await wait(undefined, 25) // wait for side effects to update endusers
959
+ // await async_test(
960
+ // `journey-updateState verify propagation to enduser 1`,
961
+ // () => sdk.api.endusers.getOne(e1.id),
962
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated' })},
963
+ // )
964
+ // await async_test(
965
+ // `journey-updateState verify propagation to enduser 2`,
966
+ // () => sdk.api.endusers.getOne(e2.id),
967
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated', [journey2.id]: 'New' })},
968
+ // )
917
969
  _g.sent();
918
970
  return [4 /*yield*/, (0, testing_1.wait)(undefined, 25)]; // wait for side effects to update endusers
919
971
  case 29:
920
- _g.sent(); // wait for side effects to update endusers
921
- return [4 /*yield*/, (0, testing_1.async_test)("journey-updateState verify propagation to enduser 1", function () { return sdk.api.endusers.getOne(e1.id); }, { onResult: function (e) {
922
- var _a;
923
- return (0, utilities_1.objects_equivalent)(e.journeys, (_a = {}, _a[journey.id] = 'Updated', _a));
924
- } })];
925
- case 30:
926
- _g.sent();
927
- return [4 /*yield*/, (0, testing_1.async_test)("journey-updateState verify propagation to enduser 2", function () { return sdk.api.endusers.getOne(e2.id); }, { onResult: function (e) {
928
- var _a;
929
- return (0, utilities_1.objects_equivalent)(e.journeys, (_a = {}, _a[journey.id] = 'Updated', _a[journey2.id] = 'New', _a));
930
- } })];
931
- case 31:
932
- _g.sent();
933
- return [4 /*yield*/, queries.deleteOne(journey.id)];
934
- case 32:
935
- _g.sent();
936
- return [4 /*yield*/, (0, testing_1.wait)(undefined, 25)]; // wait for side effects to update endusers
937
- case 33:
938
972
  _g.sent(); // wait for side effects to update endusers
939
973
  return [4 /*yield*/, (0, testing_1.async_test)("journey-delete - corresponding enduser journeys are unset 1", function () { return sdk.api.endusers.getOne(e1.id); }, { onResult: function (e) { return (0, utilities_1.objects_equivalent)(e.journeys, {}); } })];
940
- case 34:
974
+ case 30:
941
975
  _g.sent();
942
976
  return [4 /*yield*/, (0, testing_1.async_test)("journey-delete - corresponding enduser journeys are unset, others left", function () { return sdk.api.endusers.getOne(e2.id); }, { onResult: function (e) {
943
977
  var _a;
944
978
  return (0, utilities_1.objects_equivalent)(e.journeys, (_a = {}, _a[journey2.id] = 'New', _a));
945
979
  } })];
946
- case 35:
980
+ case 31:
947
981
  _g.sent();
948
982
  return [2 /*return*/];
949
983
  }
@@ -1578,10 +1612,12 @@ var enduserAccessTests = function () { return __awaiter(void 0, void 0, void 0,
1578
1612
  });
1579
1613
  }); };
1580
1614
  var files_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
1581
- var enduser, buff, _a, presignedUpload, file, _b, presigned2, publicFile, downloadURL, downloaded, cachedURL, urlForEnduser;
1615
+ var enduser, buff, _a, presignedUpload, file, _b, presignedNonEnduser, fileNonEnduser, presigned2, downloadURL, downloaded, cachedURL, urlForEnduser;
1582
1616
  return __generator(this, function (_c) {
1583
1617
  switch (_c.label) {
1584
- case 0: return [4 /*yield*/, sdk.api.endusers.createOne({ email: email })];
1618
+ case 0:
1619
+ (0, testing_1.log_header)("Files");
1620
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: email })];
1585
1621
  case 1:
1586
1622
  enduser = _c.sent();
1587
1623
  return [4 /*yield*/, sdk.api.endusers.set_password({ id: enduser.id, password: password }).catch(console.error)];
@@ -1597,48 +1633,78 @@ var files_tests = function () { return __awaiter(void 0, void 0, void 0, functio
1597
1633
  case 4:
1598
1634
  _c.sent();
1599
1635
  return [4 /*yield*/, sdk.api.files.prepare_file_upload({
1600
- name: 'Test File', size: buff.byteLength, type: 'text/plain'
1636
+ name: 'Test Private', size: buff.byteLength, type: 'text/plain', enduserId: enduser.id,
1601
1637
  })];
1602
1638
  case 5:
1603
1639
  _a = _c.sent(), presignedUpload = _a.presignedUpload, file = _a.file;
1604
1640
  return [4 /*yield*/, sdk.api.files.prepare_file_upload({
1605
- name: 'Test File', size: buff.byteLength, type: 'text/plain',
1641
+ name: 'Test Private (no enduser)', size: buff.byteLength, type: 'text/plain',
1642
+ })];
1643
+ case 6:
1644
+ _b = _c.sent(), presignedNonEnduser = _b.presignedUpload, fileNonEnduser = _b.file;
1645
+ return [4 /*yield*/, sdk.api.files.prepare_file_upload({
1646
+ name: 'Test Public', size: buff.byteLength, type: 'text/plain',
1647
+ enduserId: enduser.id,
1606
1648
  publicRead: true,
1607
1649
  publicName: 'public',
1608
1650
  })];
1609
- case 6:
1610
- _b = _c.sent(), presigned2 = _b.presignedUpload, publicFile = _b.file;
1651
+ case 7:
1652
+ presigned2 = (_c.sent()).presignedUpload;
1611
1653
  return [4 /*yield*/, sdk.UPLOAD(
1612
1654
  // @ts-ignore
1613
1655
  presignedUpload, buff)];
1614
- case 7:
1656
+ case 8:
1657
+ _c.sent();
1658
+ return [4 /*yield*/, sdk.UPLOAD(
1659
+ // @ts-ignore
1660
+ presignedNonEnduser, buff)];
1661
+ case 9:
1615
1662
  _c.sent();
1616
1663
  return [4 /*yield*/, sdk.UPLOAD(
1617
1664
  // @ts-ignore
1618
1665
  presigned2, buff)];
1619
- case 8:
1666
+ case 10:
1667
+ _c.sent();
1668
+ return [4 /*yield*/, (0, testing_1.async_test)("Files associated with enduser on prepare_file_upload", function () { return sdkNonAdmin.api.files.getSome({ filter: { enduserId: enduser.id } }); }, { onResult: function (fs) { return fs.length === 2; } })];
1669
+ case 11:
1620
1670
  _c.sent();
1621
1671
  return [4 /*yield*/, sdk.api.files.file_download_URL({ secureName: file.secureName })];
1622
- case 9:
1672
+ case 12:
1623
1673
  downloadURL = (_c.sent()).downloadURL;
1624
1674
  return [4 /*yield*/, sdk.DOWNLOAD(downloadURL)];
1625
- case 10:
1675
+ case 13:
1626
1676
  downloaded = _c.sent();
1627
1677
  (0, testing_1.assert)(downloaded === buff.toString(), 'downloaded file does not match uploaded file', 'upload, download comparison');
1628
1678
  return [4 /*yield*/, sdk.api.files.file_download_URL({ secureName: file.secureName })];
1629
- case 11:
1679
+ case 14:
1630
1680
  cachedURL = (_c.sent()).downloadURL;
1631
1681
  (0, testing_1.assert)(downloadURL === cachedURL, 'cache download url failed', 'download url cache');
1632
1682
  return [4 /*yield*/, enduserSDK.api.files.file_download_URL({ secureName: file.secureName })];
1633
- case 12:
1683
+ case 15:
1634
1684
  urlForEnduser = (_c.sent()).downloadURL;
1635
1685
  (0, testing_1.assert)(downloadURL === urlForEnduser, 'failed to get download url for enduser', 'download url for enduser');
1636
1686
  return [4 /*yield*/, Promise.all([
1637
1687
  sdk.api.endusers.deleteOne(enduser.id),
1638
- sdk.api.files.deleteOne(file.id),
1639
- sdk.api.files.deleteOne(publicFile.id),
1640
1688
  ])];
1641
- case 13:
1689
+ case 16:
1690
+ _c.sent();
1691
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)]; // wait for files to be deleted as side effect
1692
+ case 17:
1693
+ _c.sent(); // wait for files to be deleted as side effect
1694
+ return [4 /*yield*/, (0, testing_1.async_test)("Files cleaned up as side effect of deleting enduser", function () { return sdkNonAdmin.api.files.getSome({ filter: { enduserId: enduser.id } }); }, { onResult: function (fs) { return fs.length === 0; } })];
1695
+ case 18:
1696
+ _c.sent();
1697
+ return [4 /*yield*/, (0, testing_1.async_test)("Non-enduser file is left", function () { return sdkNonAdmin.api.files.getSome(); }, { onResult: function (fs) { return fs.length > 0; } })
1698
+ // cleanup other file
1699
+ ];
1700
+ case 19:
1701
+ _c.sent();
1702
+ // cleanup other file
1703
+ return [4 /*yield*/, Promise.all([
1704
+ sdk.api.files.deleteOne(fileNonEnduser.id),
1705
+ ])];
1706
+ case 20:
1707
+ // cleanup other file
1642
1708
  _c.sent();
1643
1709
  return [2 /*return*/];
1644
1710
  }
@@ -3538,11 +3604,160 @@ var filter_by_date_tests = function () { return __awaiter(void 0, void 0, void 0
3538
3604
  });
3539
3605
  }); };
3540
3606
  exports.filter_by_date_tests = filter_by_date_tests;
3607
+ var self_serve_appointment_booking_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
3608
+ var e1, e2, event15min, event30min, nySlots, bookedAppointment, conflict;
3609
+ return __generator(this, function (_a) {
3610
+ switch (_a.label) {
3611
+ case 0:
3612
+ (0, testing_1.log_header)("Self Serve Appointment Booking");
3613
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'ny@tellescope.com', state: 'NY' })];
3614
+ case 1:
3615
+ e1 = _a.sent();
3616
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'ca@tellescope.com', state: 'CA' })];
3617
+ case 2:
3618
+ e2 = _a.sent();
3619
+ return [4 /*yield*/, sdk.api.endusers.set_password({ id: e1.id, password: password })];
3620
+ case 3:
3621
+ _a.sent();
3622
+ return [4 /*yield*/, sdk.api.endusers.set_password({ id: e2.id, password: password })];
3623
+ case 4:
3624
+ _a.sent();
3625
+ return [4 /*yield*/, sdk.api.calendar_event_templates.createOne({
3626
+ title: 'test 2', durationInMinutes: 15,
3627
+ })];
3628
+ case 5:
3629
+ event15min = _a.sent();
3630
+ return [4 /*yield*/, sdk.api.calendar_event_templates.createOne({
3631
+ title: 'test 1', durationInMinutes: 30,
3632
+ })];
3633
+ case 6:
3634
+ event30min = _a.sent();
3635
+ return [4 /*yield*/, sdk.api.users.updateOne(sdk.userInfo.id, {
3636
+ weeklyAvailabilities: [
3637
+ {
3638
+ dayOfWeekStartingSundayIndexedByZero: 0,
3639
+ startTimeInMinutes: 60 * 12,
3640
+ endTimeInMinutes: 60 * 13, // 1pm,
3641
+ },
3642
+ ],
3643
+ credentialedStates: [{ state: 'NY' }, { state: "CA" }],
3644
+ timezone: 'America/New_York',
3645
+ }, {
3646
+ replaceObjectFields: true,
3647
+ })];
3648
+ case 7:
3649
+ _a.sent();
3650
+ return [4 /*yield*/, sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, {
3651
+ weeklyAvailabilities: [
3652
+ {
3653
+ dayOfWeekStartingSundayIndexedByZero: 0,
3654
+ startTimeInMinutes: 60 * 12,
3655
+ endTimeInMinutes: 60 * 13, // 1pm,
3656
+ },
3657
+ ],
3658
+ credentialedStates: [{ state: "CA" }],
3659
+ timezone: 'America/Los_Angeles',
3660
+ }, {
3661
+ replaceObjectFields: true,
3662
+ })
3663
+ // NY Enduser Tests
3664
+ ];
3665
+ case 8:
3666
+ _a.sent();
3667
+ // NY Enduser Tests
3668
+ return [4 /*yield*/, enduserSDK.authenticate('ny@tellescope.com', password).catch(console.error)];
3669
+ case 9:
3670
+ // NY Enduser Tests
3671
+ _a.sent();
3672
+ return [4 /*yield*/, (0, testing_1.async_test)('30 minute slots for state restriction', function () { return enduserSDK.api.calendar_events.get_appointment_availability({
3673
+ calendarEventTemplateId: event30min.id,
3674
+ from: new Date(),
3675
+ restrictedByState: true,
3676
+ }); }, { onResult: function (r) { return r.availabilityBlocks.length === 2; } })];
3677
+ case 10:
3678
+ _a.sent();
3679
+ return [4 /*yield*/, (0, testing_1.async_test)('30 minute slots for no state restrictions', function () { return enduserSDK.api.calendar_events.get_appointment_availability({
3680
+ calendarEventTemplateId: event30min.id,
3681
+ from: new Date(),
3682
+ restrictedByState: false,
3683
+ }); }, { onResult: function (r) { return r.availabilityBlocks.length === 4; } })];
3684
+ case 11:
3685
+ _a.sent();
3686
+ return [4 /*yield*/, enduserSDK.api.calendar_events.get_appointment_availability({
3687
+ calendarEventTemplateId: event30min.id,
3688
+ from: new Date(),
3689
+ restrictedByState: true,
3690
+ })];
3691
+ case 12:
3692
+ nySlots = _a.sent();
3693
+ return [4 /*yield*/, enduserSDK.api.calendar_events.book_appointment({
3694
+ calendarEventTemplateId: event30min.id,
3695
+ startTime: new Date(nySlots.availabilityBlocks[0].startTimeInMS),
3696
+ userId: nySlots.availabilityBlocks[0].userId,
3697
+ })];
3698
+ case 13:
3699
+ bookedAppointment = (_a.sent()).createdEvent;
3700
+ return [4 /*yield*/, (0, testing_1.async_test)('double-booking prevented', function () { return enduserSDK.api.calendar_events.book_appointment({
3701
+ calendarEventTemplateId: event30min.id,
3702
+ startTime: new Date(nySlots.availabilityBlocks[0].startTimeInMS),
3703
+ userId: nySlots.availabilityBlocks[0].userId,
3704
+ }); }, handleAnyError)];
3705
+ case 14:
3706
+ _a.sent();
3707
+ return [4 /*yield*/, (0, testing_1.async_test)('30 minute slots for state restriction with 1 overlapping conflict', function () { return enduserSDK.api.calendar_events.get_appointment_availability({
3708
+ calendarEventTemplateId: event30min.id,
3709
+ from: new Date(),
3710
+ restrictedByState: true,
3711
+ }); }, { onResult: function (r) {
3712
+ return r.availabilityBlocks.length === 1
3713
+ && r.availabilityBlocks[0].startTimeInMS === nySlots.availabilityBlocks[1].startTimeInMS;
3714
+ } // the first slot of nySlots is booked
3715
+ })];
3716
+ case 15:
3717
+ _a.sent();
3718
+ return [4 /*yield*/, sdk.api.calendar_events.createOne({
3719
+ title: 'conflict',
3720
+ startTimeInMS: nySlots.availabilityBlocks[1].startTimeInMS,
3721
+ durationInMinutes: nySlots.availabilityBlocks[1].durationInMinutes,
3722
+ })];
3723
+ case 16:
3724
+ conflict = _a.sent();
3725
+ return [4 /*yield*/, (0, testing_1.async_test)('30 minute slots for state restriction with 2 overlapping conflict', function () { return enduserSDK.api.calendar_events.get_appointment_availability({
3726
+ calendarEventTemplateId: event30min.id,
3727
+ from: new Date(),
3728
+ restrictedByState: true,
3729
+ }); }, { onResult: function (r) { return r.availabilityBlocks.length === 0; } })];
3730
+ case 17:
3731
+ _a.sent();
3732
+ return [4 /*yield*/, (0, testing_1.async_test)('booking against conflict prevented', function () { return enduserSDK.api.calendar_events.book_appointment({
3733
+ calendarEventTemplateId: event30min.id,
3734
+ startTime: new Date(nySlots.availabilityBlocks[1].startTimeInMS),
3735
+ userId: nySlots.availabilityBlocks[1].userId,
3736
+ }); }, handleAnyError)];
3737
+ case 18:
3738
+ _a.sent();
3739
+ return [4 /*yield*/, Promise.all([
3740
+ sdk.api.endusers.deleteOne(e1.id),
3741
+ sdk.api.endusers.deleteOne(e2.id),
3742
+ sdk.api.calendar_event_templates.deleteOne(event30min.id),
3743
+ sdk.api.calendar_event_templates.deleteOne(event15min.id),
3744
+ sdk.api.calendar_events.deleteOne(bookedAppointment.id),
3745
+ sdk.api.calendar_events.deleteOne(conflict.id),
3746
+ ])];
3747
+ case 19:
3748
+ _a.sent();
3749
+ return [2 /*return*/];
3750
+ }
3751
+ });
3752
+ }); };
3753
+ exports.self_serve_appointment_booking_tests = self_serve_appointment_booking_tests;
3541
3754
  var NO_TEST = function () { };
3542
3755
  var tests = {
3756
+ chat_rooms: chat_room_tests,
3757
+ automation_steps: automation_events_tests,
3758
+ files: files_tests,
3543
3759
  enduser_tasks: NO_TEST,
3544
3760
  care_plans: NO_TEST,
3545
- automation_steps: automation_events_tests,
3546
3761
  portal_customizations: NO_TEST,
3547
3762
  calendar_event_templates: NO_TEST,
3548
3763
  databases: exports.databases_tests,
@@ -3557,10 +3772,8 @@ var tests = {
3557
3772
  tasks: tasks_tests,
3558
3773
  emails: email_tests,
3559
3774
  sms_messages: sms_tests,
3560
- chat_rooms: chat_room_tests,
3561
3775
  users: users_tests,
3562
3776
  templates: NO_TEST,
3563
- files: files_tests,
3564
3777
  tickets: NO_TEST,
3565
3778
  meetings: exports.meetings_tests,
3566
3779
  notes: NO_TEST,
@@ -3591,7 +3804,7 @@ var tests = {
3591
3804
  (0, testing_1.log_header)("API");
3592
3805
  _h.label = 1;
3593
3806
  case 1:
3594
- _h.trys.push([1, 18, , 19]);
3807
+ _h.trys.push([1, 19, , 20]);
3595
3808
  return [4 /*yield*/, Promise.all([
3596
3809
  sdk.authenticate(email, password),
3597
3810
  sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword),
@@ -3604,47 +3817,50 @@ var tests = {
3604
3817
  return [4 /*yield*/, multi_tenant_tests()]; // should come right after setup tests
3605
3818
  case 4:
3606
3819
  _h.sent(); // should come right after setup tests
3607
- return [4 /*yield*/, (0, exports.filter_by_date_tests)()];
3820
+ return [4 /*yield*/, (0, exports.self_serve_appointment_booking_tests)()];
3608
3821
  case 5:
3609
3822
  _h.sent();
3610
- return [4 /*yield*/, generate_user_auth_tests()];
3823
+ return [4 /*yield*/, (0, exports.filter_by_date_tests)()];
3611
3824
  case 6:
3612
3825
  _h.sent();
3613
- return [4 /*yield*/, role_based_access_tests()];
3826
+ return [4 /*yield*/, generate_user_auth_tests()];
3614
3827
  case 7:
3615
3828
  _h.sent();
3616
- return [4 /*yield*/, generateEnduserAuthTests()];
3829
+ return [4 /*yield*/, role_based_access_tests()];
3617
3830
  case 8:
3618
3831
  _h.sent();
3619
- return [4 /*yield*/, public_form_tests()];
3832
+ return [4 /*yield*/, generateEnduserAuthTests()];
3620
3833
  case 9:
3621
3834
  _h.sent();
3622
- return [4 /*yield*/, search_tests()];
3835
+ return [4 /*yield*/, public_form_tests()];
3623
3836
  case 10:
3624
3837
  _h.sent();
3625
- return [4 /*yield*/, badInputTests()];
3838
+ return [4 /*yield*/, search_tests()];
3626
3839
  case 11:
3627
3840
  _h.sent();
3628
- return [4 /*yield*/, filterTests()];
3841
+ return [4 /*yield*/, badInputTests()];
3629
3842
  case 12:
3630
3843
  _h.sent();
3631
- return [4 /*yield*/, updatesTests()];
3844
+ return [4 /*yield*/, filterTests()];
3632
3845
  case 13:
3633
3846
  _h.sent();
3634
- return [4 /*yield*/, threadKeyTests()];
3847
+ return [4 /*yield*/, updatesTests()];
3635
3848
  case 14:
3636
3849
  _h.sent();
3637
- return [4 /*yield*/, enduserAccessTests()];
3850
+ return [4 /*yield*/, threadKeyTests()];
3638
3851
  case 15:
3639
3852
  _h.sent();
3640
- return [4 /*yield*/, enduser_session_tests()];
3853
+ return [4 /*yield*/, enduserAccessTests()];
3641
3854
  case 16:
3642
3855
  _h.sent();
3643
- return [4 /*yield*/, enduser_redaction_tests()];
3856
+ return [4 /*yield*/, enduser_session_tests()];
3644
3857
  case 17:
3645
3858
  _h.sent();
3646
- return [3 /*break*/, 19];
3859
+ return [4 /*yield*/, enduser_redaction_tests()];
3647
3860
  case 18:
3861
+ _h.sent();
3862
+ return [3 /*break*/, 20];
3863
+ case 19:
3648
3864
  err_1 = _h.sent();
3649
3865
  console.error("Failed during custom test");
3650
3866
  if (err_1.message && err_1.info) {
@@ -3654,15 +3870,15 @@ var tests = {
3654
3870
  console.error(err_1);
3655
3871
  }
3656
3872
  process.exit(1);
3657
- return [3 /*break*/, 19];
3658
- case 19:
3873
+ return [3 /*break*/, 20];
3874
+ case 20:
3659
3875
  _a = [];
3660
3876
  for (_b in schema_1.schema)
3661
3877
  _a.push(_b);
3662
3878
  _i = 0;
3663
- _h.label = 20;
3664
- case 20:
3665
- if (!(_i < _a.length)) return [3 /*break*/, 23];
3879
+ _h.label = 21;
3880
+ case 21:
3881
+ if (!(_i < _a.length)) return [3 /*break*/, 24];
3666
3882
  n = _a[_i];
3667
3883
  returnValidation = (_g = (_f = schema_1.schema[n].customActions) === null || _f === void 0 ? void 0 : _f.create) === null || _g === void 0 ? void 0 : _g.returns;
3668
3884
  return [4 /*yield*/, run_generated_tests({
@@ -3673,38 +3889,38 @@ var tests = {
3673
3889
  create: returnValidation // ModelFields<ClientModel>,
3674
3890
  }
3675
3891
  })];
3676
- case 21:
3677
- _h.sent();
3678
- _h.label = 22;
3679
3892
  case 22:
3680
- _i++;
3681
- return [3 /*break*/, 20];
3893
+ _h.sent();
3894
+ _h.label = 23;
3682
3895
  case 23:
3896
+ _i++;
3897
+ return [3 /*break*/, 21];
3898
+ case 24:
3683
3899
  _c = [];
3684
3900
  for (_d in tests)
3685
3901
  _c.push(_d);
3686
3902
  _e = 0;
3687
- _h.label = 24;
3688
- case 24:
3689
- if (!(_e < _c.length)) return [3 /*break*/, 29];
3690
- t = _c[_e];
3691
3903
  _h.label = 25;
3692
3904
  case 25:
3693
- _h.trys.push([25, 27, , 28]);
3694
- return [4 /*yield*/, tests[t]()];
3905
+ if (!(_e < _c.length)) return [3 /*break*/, 30];
3906
+ t = _c[_e];
3907
+ _h.label = 26;
3695
3908
  case 26:
3696
- _h.sent();
3697
- return [3 /*break*/, 28];
3909
+ _h.trys.push([26, 28, , 29]);
3910
+ return [4 /*yield*/, tests[t]()];
3698
3911
  case 27:
3912
+ _h.sent();
3913
+ return [3 /*break*/, 29];
3914
+ case 28:
3699
3915
  err_2 = _h.sent();
3700
3916
  console.error("Error running test:");
3701
3917
  console.error(err_2);
3702
3918
  process.exit(1);
3703
- return [3 /*break*/, 28];
3704
- case 28:
3705
- _e++;
3706
- return [3 /*break*/, 24];
3919
+ return [3 /*break*/, 29];
3707
3920
  case 29:
3921
+ _e++;
3922
+ return [3 /*break*/, 25];
3923
+ case 30:
3708
3924
  process.exit();
3709
3925
  return [2 /*return*/];
3710
3926
  }