@tellescope/sdk 1.1.5 → 1.2.2

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.
@@ -1104,36 +1104,58 @@ var chat_room_tests = function () { return __awaiter(void 0, void 0, void 0, fun
1104
1104
  });
1105
1105
  }); };
1106
1106
  var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
1107
- var sdk2, room, chat, chat2, sharedRoom, sharedChat, sharedChat2, roomNull, chatNull, chat2Null;
1107
+ var sdk2, enduser, room, chat, chat2, enduserRoom, sharedRoom, sharedChat, sharedChat2, roomNull, chatNull, chat2Null;
1108
1108
  return __generator(this, function (_a) {
1109
1109
  switch (_a.label) {
1110
1110
  case 0:
1111
+ log_header("Chat");
1111
1112
  sdk2 = new Session({ host: host });
1112
1113
  return [4 /*yield*/, sdk2.authenticate(nonAdminEmail, nonAdminPassword)]; // non-admin has access restrictions we want to test
1113
1114
  case 1:
1114
1115
  _a.sent(); // non-admin has access restrictions we want to test
1115
- return [4 /*yield*/, sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId] })];
1116
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: email })];
1116
1117
  case 2:
1118
+ enduser = _a.sent();
1119
+ return [4 /*yield*/, sdk.api.endusers.set_password({ id: enduser.id, password: password }).catch(console.error)];
1120
+ case 3:
1121
+ _a.sent();
1122
+ return [4 /*yield*/, enduserSDK.authenticate(email, password).catch(console.error)];
1123
+ case 4:
1124
+ _a.sent();
1125
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId] })];
1126
+ case 5:
1117
1127
  room = _a.sent();
1118
1128
  return [4 /*yield*/, sdk.api.chats.createOne({ roomId: room.id, message: "Hello!" })];
1119
- case 3:
1129
+ case 6:
1120
1130
  chat = _a.sent();
1121
- return [4 /*yield*/, sdk.api.chats.createOne({ roomId: room.id, message: "Hello..." })
1131
+ return [4 /*yield*/, sdk.api.chats.createOne({ roomId: room.id, message: "Hello..." })];
1132
+ case 7:
1133
+ chat2 = _a.sent();
1134
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId], enduserIds: [enduser.id] })];
1135
+ case 8:
1136
+ enduserRoom = _a.sent();
1137
+ return [4 /*yield*/, sdk.api.chats.createOne({ roomId: enduserRoom.id, message: 'enduser' })];
1138
+ case 9:
1139
+ _a.sent();
1140
+ return [4 /*yield*/, enduserSDK.api.chats.createOne({ roomId: enduserRoom.id, message: 'enduser' })];
1141
+ case 10:
1142
+ _a.sent();
1143
+ return [4 /*yield*/, async_test("get-chats for enduser", function () { return enduserSDK.api.chats.getSome({ filter: { roomId: enduserRoom.id } }); }, { onResult: function (c) { return (c === null || c === void 0 ? void 0 : c.length) === 2; } })
1122
1144
  // await async_test(
1123
1145
  // `get-chat (without filter)`,
1124
1146
  // () => sdk.api.chats.getOne(chat.id),
1125
1147
  // { shouldError: true, onError: () => true }
1126
1148
  // )
1127
1149
  ];
1128
- case 4:
1129
- chat2 = _a.sent();
1150
+ case 11:
1151
+ _a.sent();
1130
1152
  // await async_test(
1131
1153
  // `get-chat (without filter)`,
1132
1154
  // () => sdk.api.chats.getOne(chat.id),
1133
1155
  // { shouldError: true, onError: () => true }
1134
1156
  // )
1135
1157
  return [4 /*yield*/, async_test("get-chats (without filter)", function () { return sdk.api.chats.getSome({}); }, { shouldError: true, onError: function () { return true; } })];
1136
- case 5:
1158
+ case 12:
1137
1159
  // await async_test(
1138
1160
  // `get-chat (without filter)`,
1139
1161
  // () => sdk.api.chats.getOne(chat.id),
@@ -1141,10 +1163,10 @@ var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function
1141
1163
  // )
1142
1164
  _a.sent();
1143
1165
  return [4 /*yield*/, async_test("get-chats (with filter)", function () { return sdk.api.chats.getSome({ filter: { roomId: room.id } }); }, { onResult: function (c) { return (c === null || c === void 0 ? void 0 : c.length) === 2; } })];
1144
- case 6:
1166
+ case 13:
1145
1167
  _a.sent();
1146
1168
  return [4 /*yield*/, async_test("get-chats not allowed", function () { return sdk2.api.chats.getSome({ filter: { roomId: room.id } }); }, { shouldError: true, onError: function (e) { return e.message === 'You do not have permission to access this resource'; } })];
1147
- case 7:
1169
+ case 14:
1148
1170
  _a.sent();
1149
1171
  return [4 /*yield*/, async_test("get-chats admin", function () { return sdk.api.chats.getSome({ filter: { roomId: room.id } }); }, { onResult: function () { return true; } })
1150
1172
  // currently disabled endpoint altogether
@@ -1154,7 +1176,7 @@ var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function
1154
1176
  // { shouldError: true, onError: e => e.message === 'You do not have permission to access this resource' }
1155
1177
  // )
1156
1178
  ];
1157
- case 8:
1179
+ case 15:
1158
1180
  _a.sent();
1159
1181
  // currently disabled endpoint altogether
1160
1182
  // await async_test(
@@ -1170,7 +1192,7 @@ var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function
1170
1192
  // { shouldError: true, onError: e => e.message === 'Error parsing field updates: roomId is not valid for updates' }
1171
1193
  // )
1172
1194
  ];
1173
- case 9:
1195
+ case 16:
1174
1196
  // currently disabled endpoint altogether
1175
1197
  // await async_test(
1176
1198
  // `update-chat not allowed`,
@@ -1185,7 +1207,7 @@ var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function
1185
1207
  // { shouldError: true, onError: e => e.message === 'Error parsing field updates: roomId is not valid for updates' }
1186
1208
  // )
1187
1209
  return [4 /*yield*/, sdk.api.chat_rooms.deleteOne(room.id)];
1188
- case 10:
1210
+ case 17:
1189
1211
  // currently disabled endpoint altogether
1190
1212
  // await async_test(
1191
1213
  // `update-chat can't update roomId`,
@@ -1194,54 +1216,60 @@ var chat_tests = function () { return __awaiter(void 0, void 0, void 0, function
1194
1216
  // )
1195
1217
  _a.sent();
1196
1218
  return [4 /*yield*/, wait(undefined, 25)];
1197
- case 11:
1219
+ case 18:
1198
1220
  _a.sent();
1199
1221
  return [4 /*yield*/, async_test("get-chat (deleted as dependency of room 1)", function () { return sdk.api.chats.getOne(chat.id); }, { shouldError: true, onError: function (e) { return e.message === 'Could not find a record for the given id'; } })];
1200
- case 12:
1222
+ case 19:
1201
1223
  _a.sent();
1202
1224
  return [4 /*yield*/, async_test("get-chat (deleted as dependency of room 2)", function () { return sdk.api.chats.getOne(chat2.id); }, { shouldError: true, onError: function (e) { return e.message === 'Could not find a record for the given id'; } })];
1203
- case 13:
1225
+ case 20:
1204
1226
  _a.sent();
1205
1227
  return [4 /*yield*/, sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId, sdk2.userInfo.id] })];
1206
- case 14:
1228
+ case 21:
1207
1229
  sharedRoom = _a.sent();
1208
1230
  return [4 /*yield*/, sdk.api.chats.createOne({ roomId: sharedRoom.id, message: "Hello!", })];
1209
- case 15:
1231
+ case 22:
1210
1232
  sharedChat = _a.sent();
1211
1233
  return [4 /*yield*/, sdk2.api.chats.createOne({ roomId: sharedRoom.id, message: "Hello there!", })];
1212
- case 16:
1234
+ case 23:
1213
1235
  sharedChat2 = _a.sent();
1214
1236
  return [4 /*yield*/, async_test("get-chat (shared, user1)", function () { return sdk.api.chats.getOne(sharedChat.id); }, { onResult: function (r) { return r.id === sharedChat.id; } })];
1215
- case 17:
1237
+ case 24:
1216
1238
  _a.sent();
1217
1239
  return [4 /*yield*/, async_test("get-chat (shared, user2)", function () { return sdk2.api.chats.getOne(sharedChat.id); }, { onResult: function (r) { return r.id === sharedChat.id; } })];
1218
- case 18:
1240
+ case 25:
1219
1241
  _a.sent();
1220
1242
  return [4 /*yield*/, async_test("get-chats (shared, user1)", function () { return sdk.api.chats.getSome({ filter: { roomId: sharedRoom.id } }); }, { onResult: function (cs) { return cs.length === 2 && !!cs.find(function (c) { return c.id === sharedChat.id; }) && !!cs.find(function (c) { return c.id === sharedChat2.id; }); } })];
1221
- case 19:
1243
+ case 26:
1222
1244
  _a.sent();
1223
1245
  return [4 /*yield*/, async_test("get-chats (shared, user2)", function () { return sdk2.api.chats.getSome({ filter: { roomId: sharedRoom.id } }); }, { onResult: function (cs) { return cs.length === 2 && !!cs.find(function (c) { return c.id === sharedChat.id; }) && !!cs.find(function (c) { return c.id === sharedChat2.id; }); } })
1224
1246
  // test setNull dependency
1225
1247
  ];
1226
- case 20:
1248
+ case 27:
1227
1249
  _a.sent();
1228
1250
  return [4 /*yield*/, sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId] })];
1229
- case 21:
1251
+ case 28:
1230
1252
  roomNull = _a.sent();
1231
1253
  return [4 /*yield*/, sdk.api.chats.createOne({ roomId: roomNull.id, message: "Hello!" })];
1232
- case 22:
1254
+ case 29:
1233
1255
  chatNull = _a.sent();
1234
1256
  return [4 /*yield*/, sdk.api.chats.createOne({ roomId: roomNull.id, message: "Hello...", replyId: chatNull.id })];
1235
- case 23:
1257
+ case 30:
1236
1258
  chat2Null = _a.sent();
1237
1259
  return [4 /*yield*/, sdk.api.chats.deleteOne(chatNull.id)];
1238
- case 24:
1260
+ case 31:
1239
1261
  _a.sent();
1240
1262
  return [4 /*yield*/, wait(undefined, 250)];
1241
- case 25:
1263
+ case 32:
1242
1264
  _a.sent();
1243
1265
  return [4 /*yield*/, async_test("get-chat (setNull working)", function () { return sdk.api.chats.getOne(chat2Null.id); }, { onResult: function (c) { return c.replyId === null; } })];
1244
- case 26:
1266
+ case 33:
1267
+ _a.sent();
1268
+ return [4 /*yield*/, Promise.all([
1269
+ sdk.api.endusers.deleteOne(enduser.id),
1270
+ sdk.api.chat_rooms.deleteOne(enduserRoom.id),
1271
+ ])];
1272
+ case 34:
1245
1273
  _a.sent();
1246
1274
  return [2 /*return*/];
1247
1275
  }
@@ -1609,15 +1637,366 @@ var calendar_events_tests = function () { return __awaiter(void 0, void 0, void
1609
1637
  }
1610
1638
  });
1611
1639
  }); };
1640
+ var formEventTests = function () { return __awaiter(void 0, void 0, void 0, function () {
1641
+ var enduser, journey, form, field, triggerStep, acNoStep, acStep, testResponse, formResponse;
1642
+ return __generator(this, function (_a) {
1643
+ switch (_a.label) {
1644
+ case 0:
1645
+ log_header("Form Events");
1646
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'deletemeee@tellescope.com' })];
1647
+ case 1:
1648
+ enduser = _a.sent();
1649
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'test journey ' })];
1650
+ case 2:
1651
+ journey = _a.sent();
1652
+ return [4 /*yield*/, sdk.api.forms.createOne({
1653
+ title: 'test form',
1654
+ })];
1655
+ case 3:
1656
+ form = _a.sent();
1657
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
1658
+ formId: form.id,
1659
+ title: 'question',
1660
+ type: 'string',
1661
+ previousFields: [{ type: 'root', info: {} }]
1662
+ })];
1663
+ case 4:
1664
+ field = _a.sent();
1665
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
1666
+ journeyId: journey.id,
1667
+ event: { type: 'onJourneyStart', info: {} },
1668
+ // in practice, this would send a form, so that the next step(s) could handle the response
1669
+ // but we don't want to send emails in testing, and can still attach this Id to a form response to test a trigger
1670
+ action: {
1671
+ type: 'setEnduserStatus',
1672
+ info: { status: 'placeholder' },
1673
+ },
1674
+ })];
1675
+ case 5:
1676
+ triggerStep = _a.sent();
1677
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
1678
+ journeyId: journey.id,
1679
+ event: {
1680
+ type: 'formResponse',
1681
+ info: { automationStepId: triggerStep.id }
1682
+ },
1683
+ action: {
1684
+ type: 'setEnduserStatus',
1685
+ info: { status: 'placeholder' },
1686
+ },
1687
+ })];
1688
+ case 6:
1689
+ _a.sent();
1690
+ return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })];
1691
+ case 7:
1692
+ acNoStep = (_a.sent()).accessCode;
1693
+ return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })];
1694
+ case 8:
1695
+ acStep = (_a.sent()).accessCode;
1696
+ testResponse = {
1697
+ answer: {
1698
+ type: 'string',
1699
+ value: 'answer'
1700
+ },
1701
+ fieldId: field.id,
1702
+ fieldTitle: field.title,
1703
+ };
1704
+ return [4 /*yield*/, sdk.api.form_responses.submit_form_response({ accessCode: acNoStep, responses: [testResponse] })];
1705
+ case 9:
1706
+ formResponse = (_a.sent()).formResponse;
1707
+ assert(objects_equivalent(formResponse.responses, [testResponse]), 'bad form resonse returned', 'form response returned correctly');
1708
+ return [4 /*yield*/, sdk.api.form_responses.submit_form_response({ accessCode: acStep, automationStepId: triggerStep.id, responses: [testResponse] })];
1709
+ case 10:
1710
+ _a.sent();
1711
+ return [4 /*yield*/, wait(undefined, 250)]; // allow background creation with generous pause
1712
+ case 11:
1713
+ _a.sent(); // allow background creation with generous pause
1714
+ return [4 /*yield*/, async_test("Without automation stepId, form response handler is not triggered", function () { return sdk.api.automated_actions.getSome(); }, { onResult: function (steps) { return steps.length === 1; } /* NOT 2 or more */ })];
1715
+ case 12:
1716
+ _a.sent();
1717
+ return [4 /*yield*/, Promise.all([
1718
+ sdk.api.forms.deleteOne(form.id),
1719
+ sdk.api.journeys.deleteOne(journey.id),
1720
+ sdk.api.endusers.deleteOne(enduser.id)
1721
+ ])];
1722
+ case 13:
1723
+ _a.sent();
1724
+ return [2 /*return*/];
1725
+ }
1726
+ });
1727
+ }); };
1728
+ var ticketEventTests = function () { return __awaiter(void 0, void 0, void 0, function () {
1729
+ var testCloseReasons, enduser, enduserWithTeam, journey, nullJourney, root, nullRoot, createStep, ticket, ticketNull;
1730
+ var _a, _b;
1731
+ return __generator(this, function (_c) {
1732
+ switch (_c.label) {
1733
+ case 0:
1734
+ log_header("Ticket Events");
1735
+ testCloseReasons = ['Yes', 'No', 'Maybe'];
1736
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'deletemeee@tellescope.com' })];
1737
+ case 1:
1738
+ enduser = _c.sent();
1739
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'deleteme2@tellescope.com', assignedTo: [sdkNonAdmin.userInfo.id] })];
1740
+ case 2:
1741
+ enduserWithTeam = _c.sent();
1742
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'test journey with completion options' })];
1743
+ case 3:
1744
+ journey = _c.sent();
1745
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'test journey null' })];
1746
+ case 4:
1747
+ nullJourney = _c.sent();
1748
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
1749
+ journeyId: journey.id,
1750
+ event: { type: 'onJourneyStart', info: {} },
1751
+ action: {
1752
+ type: 'createTicket',
1753
+ info: {
1754
+ title: 'close reasons tests',
1755
+ assignmentStrategy: {
1756
+ type: 'care-team-random',
1757
+ info: {},
1758
+ },
1759
+ closeReasons: testCloseReasons,
1760
+ defaultAssignee: sdk.userInfo.id,
1761
+ },
1762
+ },
1763
+ })];
1764
+ case 5:
1765
+ root = _c.sent();
1766
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
1767
+ journeyId: nullJourney.id,
1768
+ event: { type: 'onJourneyStart', info: {} },
1769
+ action: {
1770
+ type: 'createTicket',
1771
+ info: {
1772
+ title: 'null test',
1773
+ assignmentStrategy: {
1774
+ type: 'care-team-random',
1775
+ info: {},
1776
+ },
1777
+ closeReasons: [],
1778
+ defaultAssignee: sdk.userInfo.id,
1779
+ },
1780
+ },
1781
+ })];
1782
+ case 6:
1783
+ nullRoot = _c.sent();
1784
+ createStep = function (journeyId, automationStepId, closedForReason) { return (sdk.api.automation_steps.createOne({
1785
+ journeyId: journeyId,
1786
+ event: { type: 'ticketCompleted', info: { automationStepId: automationStepId, closedForReason: closedForReason, } },
1787
+ action: { type: 'setEnduserStatus', info: { status: closedForReason !== null && closedForReason !== void 0 ? closedForReason : 'Null' }, },
1788
+ })); };
1789
+ return [4 /*yield*/, createStep(nullJourney.id, nullRoot.id)];
1790
+ case 7:
1791
+ _c.sent();
1792
+ return [4 /*yield*/, createStep(nullJourney.id, nullRoot.id, testCloseReasons[0])];
1793
+ case 8:
1794
+ _c.sent();
1795
+ return [4 /*yield*/, createStep(nullJourney.id, nullRoot.id, testCloseReasons[1])];
1796
+ case 9:
1797
+ _c.sent();
1798
+ return [4 /*yield*/, createStep(nullJourney.id, nullRoot.id, testCloseReasons[2])];
1799
+ case 10:
1800
+ _c.sent();
1801
+ return [4 /*yield*/, createStep(journey.id, root.id)];
1802
+ case 11:
1803
+ _c.sent();
1804
+ return [4 /*yield*/, createStep(journey.id, root.id, testCloseReasons[0])];
1805
+ case 12:
1806
+ _c.sent();
1807
+ return [4 /*yield*/, createStep(journey.id, root.id, testCloseReasons[1])];
1808
+ case 13:
1809
+ _c.sent();
1810
+ return [4 /*yield*/, createStep(journey.id, root.id, testCloseReasons[2])];
1811
+ case 14:
1812
+ _c.sent();
1813
+ return [4 /*yield*/, sdk.api.endusers.updateOne(enduser.id, { journeys: (_a = {}, _a[journey.id] = 'Added', _a) })];
1814
+ case 15:
1815
+ _c.sent();
1816
+ return [4 /*yield*/, sdk.api.endusers.updateOne(enduserWithTeam.id, { journeys: (_b = {}, _b[nullJourney.id] = 'Added (Null)', _b) })];
1817
+ case 16:
1818
+ _c.sent();
1819
+ return [4 /*yield*/, wait(undefined, 2000)]; // wait for tickets to be automatically created
1820
+ case 17:
1821
+ _c.sent(); // wait for tickets to be automatically created
1822
+ return [4 /*yield*/, async_test("Tickets automatically created", function () { return sdk.api.tickets.getSome(); }, { onResult: function (tickets) { return (tickets === null || tickets === void 0 ? void 0 : tickets.length) === 2; } })];
1823
+ case 18:
1824
+ _c.sent();
1825
+ return [4 /*yield*/, async_test("Ticket for enduser, default assignment, testCloseReasons", function () { return sdk.api.tickets.getSome({ filter: { enduserId: enduser.id } }); }, { onResult: function (tickets) {
1826
+ var _a;
1827
+ return (tickets.length === 1
1828
+ && ((_a = tickets[0].closeReasons) === null || _a === void 0 ? void 0 : _a.length) === 3
1829
+ && tickets[0].owner === sdk.userInfo.id);
1830
+ } })];
1831
+ case 19:
1832
+ _c.sent();
1833
+ return [4 /*yield*/, sdk.api.tickets.getOne({ enduserId: enduser.id })];
1834
+ case 20:
1835
+ ticket = _c.sent();
1836
+ return [4 /*yield*/, async_test("Ticket for enduser, care team assignment, no reasons", function () { return sdk.api.tickets.getSome({ filter: { enduserId: enduserWithTeam.id } }); }, { onResult: function (tickets) {
1837
+ var _a;
1838
+ return tickets.length === 1
1839
+ && ((_a = tickets[0].closeReasons) === null || _a === void 0 ? void 0 : _a.length) === 0
1840
+ && tickets[0].owner === sdkNonAdmin.userInfo.id;
1841
+ }
1842
+ })];
1843
+ case 21:
1844
+ _c.sent();
1845
+ return [4 /*yield*/, sdk.api.tickets.getOne({ enduserId: enduserWithTeam.id })];
1846
+ case 22:
1847
+ ticketNull = _c.sent();
1848
+ return [4 /*yield*/, sdk.api.tickets.updateOne(ticket.id, { closedForReason: 'Maybe', closedAt: new Date() })];
1849
+ case 23:
1850
+ _c.sent();
1851
+ return [4 /*yield*/, sdk.api.tickets.updateOne(ticketNull.id, { closedAt: new Date() })];
1852
+ case 24:
1853
+ _c.sent();
1854
+ return [4 /*yield*/, wait(undefined, 250)]; // wait for actions to be automatically created
1855
+ case 25:
1856
+ _c.sent(); // wait for actions to be automatically created
1857
+ return [4 /*yield*/, async_test("Automated actions for handle ticket created", function () { return sdk.api.automated_actions.getSome(); }, { onResult: (function (actions) { return (actions === null || actions === void 0 ? void 0 : actions.length) === 4 // ticket creations + ticket completions = 2 + 2
1858
+ && (!!actions.find(function (a) {
1859
+ return a.event.type === 'ticketCompleted'
1860
+ && a.enduserId === enduser.id
1861
+ && a.action.type === 'setEnduserStatus'
1862
+ && a.action.info.status === 'Maybe';
1863
+ } // maybe branch
1864
+ ))
1865
+ && (!!actions.find(function (a) {
1866
+ return a.event.type === 'ticketCompleted'
1867
+ && a.enduserId === enduserWithTeam.id
1868
+ && a.action.type === 'setEnduserStatus'
1869
+ && a.action.info.status === 'Null';
1870
+ } // null branch when completed without closedForReason
1871
+ )); }) })];
1872
+ case 26:
1873
+ _c.sent();
1874
+ return [4 /*yield*/, Promise.all([
1875
+ sdk.api.journeys.deleteOne(journey.id),
1876
+ sdk.api.journeys.deleteOne(nullJourney.id),
1877
+ sdk.api.endusers.deleteOne(enduser.id),
1878
+ sdk.api.endusers.deleteOne(enduserWithTeam.id),
1879
+ sdk.api.tickets.deleteOne(ticket.id),
1880
+ sdk.api.tickets.deleteOne(ticketNull.id),
1881
+ ])];
1882
+ case 27:
1883
+ _c.sent();
1884
+ return [2 /*return*/];
1885
+ }
1886
+ });
1887
+ }); };
1888
+ var removeFromJourneyTests = function () { return __awaiter(void 0, void 0, void 0, function () {
1889
+ var journey, journey2, enduser, enduser2, step, step2, createAction, numberOfActions, i;
1890
+ var _a;
1891
+ return __generator(this, function (_b) {
1892
+ switch (_b.label) {
1893
+ case 0:
1894
+ log_header("Remove from Journey");
1895
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'test journey' })];
1896
+ case 1:
1897
+ journey = _b.sent();
1898
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'other journey' })];
1899
+ case 2:
1900
+ journey2 = _b.sent();
1901
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'test@tellescope.com' })];
1902
+ case 3:
1903
+ enduser = _b.sent();
1904
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: 'test2@tellescope.com' })];
1905
+ case 4:
1906
+ enduser2 = _b.sent();
1907
+ return [4 /*yield*/, sdk.api.endusers.updateOne(enduser.id, { journeys: (_a = {}, _a[journey.id] = 'Added', _a[journey2.id] = 'Added2', _a) })];
1908
+ case 5:
1909
+ _b.sent();
1910
+ return [4 /*yield*/, (sdk.api.automation_steps.createOne({
1911
+ journeyId: journey.id,
1912
+ event: { type: 'onJourneyStart', info: {} },
1913
+ action: { type: 'setEnduserStatus', info: { status: 'Root' }, },
1914
+ }))];
1915
+ case 6:
1916
+ step = _b.sent();
1917
+ return [4 /*yield*/, (sdk.api.automation_steps.createOne({
1918
+ journeyId: journey2.id,
1919
+ event: { type: 'onJourneyStart', info: {} },
1920
+ action: { type: 'setEnduserStatus', info: { status: 'Root' }, },
1921
+ }))];
1922
+ case 7:
1923
+ step2 = _b.sent();
1924
+ createAction = function (journeyId, step, enduserId) { return (sdk.api.automated_actions.createOne({
1925
+ journeyId: journeyId,
1926
+ automationStepId: step.id,
1927
+ cancelConditions: [],
1928
+ enduserId: enduserId !== null && enduserId !== void 0 ? enduserId : enduser.id,
1929
+ processAfter: Date.now() + 1000000,
1930
+ status: 'active',
1931
+ event: { type: 'onJourneyStart', info: {} },
1932
+ action: { type: 'setEnduserStatus', info: { status: 'Test Status' }, },
1933
+ })); };
1934
+ numberOfActions = 4;
1935
+ i = 0;
1936
+ _b.label = 8;
1937
+ case 8:
1938
+ if (!(i < numberOfActions)) return [3 /*break*/, 13];
1939
+ return [4 /*yield*/, createAction(journey.id, step)];
1940
+ case 9:
1941
+ _b.sent();
1942
+ return [4 /*yield*/, createAction(journey2.id, step2)];
1943
+ case 10:
1944
+ _b.sent();
1945
+ return [4 /*yield*/, createAction(journey.id, step, enduser2.id)];
1946
+ case 11:
1947
+ _b.sent();
1948
+ _b.label = 12;
1949
+ case 12:
1950
+ i++;
1951
+ return [3 /*break*/, 8];
1952
+ case 13:
1953
+ // remove from journey, should set all statuses to cancelled
1954
+ return [4 /*yield*/, sdk.api.endusers.updateOne(enduser.id, { journeys: {} }, { replaceObjectFields: true })];
1955
+ case 14:
1956
+ // remove from journey, should set all statuses to cancelled
1957
+ _b.sent();
1958
+ return [4 /*yield*/, wait(undefined, 250)];
1959
+ case 15:
1960
+ _b.sent();
1961
+ return [4 /*yield*/, async_test("Automated actions for handle ticket created", function () { return sdk.api.automated_actions.getSome(); }, { onResult: (function (actions) { return (
1962
+ // enduser removed from multiple journeys
1963
+ actions.filter(function (a) { return a.status === 'cancelled'; }).length === numberOfActions * 2
1964
+ // other enduser is unaffected
1965
+ && actions.filter(function (a) { return a.status === 'active'; }).length === numberOfActions); }) })];
1966
+ case 16:
1967
+ _b.sent();
1968
+ return [4 /*yield*/, Promise.all([
1969
+ sdk.api.journeys.deleteOne(journey.id),
1970
+ sdk.api.journeys.deleteOne(journey2.id),
1971
+ sdk.api.endusers.deleteOne(enduser.id),
1972
+ sdk.api.endusers.deleteOne(enduser2.id),
1973
+ ])];
1974
+ case 17:
1975
+ _b.sent();
1976
+ return [2 /*return*/];
1977
+ }
1978
+ });
1979
+ }); };
1612
1980
  var automation_events_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
1613
1981
  return __generator(this, function (_a) {
1614
- log_header("Automation Events");
1615
- console.warn("Need new test coverage for automation stemps");
1616
- return [2 /*return*/];
1982
+ switch (_a.label) {
1983
+ case 0:
1984
+ log_header("Automation Events");
1985
+ return [4 /*yield*/, formEventTests()];
1986
+ case 1:
1987
+ _a.sent();
1988
+ return [4 /*yield*/, ticketEventTests()];
1989
+ case 2:
1990
+ _a.sent();
1991
+ return [4 /*yield*/, removeFromJourneyTests()];
1992
+ case 3:
1993
+ _a.sent();
1994
+ return [2 /*return*/];
1995
+ }
1617
1996
  });
1618
1997
  }); };
1619
1998
  var form_response_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
1620
- var stringResponse, stringIntakeField, stringTitle, enduser, form, accessCode, enduserWithUpdate, recordedResponse;
1999
+ var stringResponse, stringIntakeField, stringTitle, enduser, form, field, field2, accessCode, enduserWithUpdate, recordedResponse;
1621
2000
  var _a, _b, _c;
1622
2001
  return __generator(this, function (_d) {
1623
2002
  switch (_d.label) {
@@ -1631,45 +2010,85 @@ var form_response_tests = function () { return __awaiter(void 0, void 0, void 0,
1631
2010
  enduser = _d.sent();
1632
2011
  return [4 /*yield*/, sdk.api.forms.createOne({
1633
2012
  title: 'test form',
1634
- fields: [{
1635
- title: stringTitle,
1636
- description: 'Enter a string',
1637
- type: 'string',
1638
- isOptional: false,
1639
- intakeField: stringIntakeField
1640
- }]
1641
- })
2013
+ })];
2014
+ case 2:
2015
+ form = _d.sent();
2016
+ assert(form.numFields === 0, 'numFields bad init', 'num fields on init');
2017
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
2018
+ formId: form.id,
2019
+ title: stringTitle,
2020
+ description: 'Enter a string',
2021
+ type: 'string',
2022
+ isOptional: false,
2023
+ intakeField: stringIntakeField,
2024
+ previousFields: [{ type: 'root', info: {} }]
2025
+ })];
2026
+ case 3:
2027
+ field = _d.sent();
2028
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
2029
+ formId: form.id,
2030
+ title: stringTitle,
2031
+ description: 'Enter a string',
2032
+ type: 'string',
2033
+ isOptional: false,
2034
+ intakeField: stringIntakeField,
2035
+ previousFields: [{ type: 'root', info: {} }]
2036
+ })];
2037
+ case 4:
2038
+ field2 = _d.sent();
2039
+ return [4 /*yield*/, wait(undefined, 250)];
2040
+ case 5:
2041
+ _d.sent();
2042
+ return [4 /*yield*/, async_test("numFields incremented on new field", function () { return sdk.api.forms.getOne(form.id); }, { onResult: function (f) { return f.numFields === 2; } })];
2043
+ case 6:
2044
+ _d.sent();
2045
+ return [4 /*yield*/, sdk.api.form_fields.deleteOne(field2.id)];
2046
+ case 7:
2047
+ _d.sent();
2048
+ return [4 /*yield*/, wait(undefined, 250)];
2049
+ case 8:
2050
+ _d.sent();
2051
+ return [4 /*yield*/, async_test("numFields decremented after delete", function () { return sdk.api.forms.getOne(form.id); }, { onResult: function (f) { return f.numFields === 1; } })
1642
2052
  // await sdk.api.automation_steps.createOne({
1643
2053
  // event: { type: "formResponse", info: { formId: form.id } },
1644
2054
  // action: { type: 'sendWebhook', info: { message: 'test' } },
1645
2055
  // })
1646
2056
  ];
1647
- case 2:
1648
- form = _d.sent();
2057
+ case 9:
2058
+ _d.sent();
1649
2059
  return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })];
1650
- case 3:
2060
+ case 10:
1651
2061
  accessCode = (_d.sent()).accessCode;
1652
- return [4 /*yield*/, sdk.api.form_responses.submit_form_response({ accessCode: accessCode, responses: [stringResponse] })
2062
+ return [4 /*yield*/, sdk.api.form_responses.submit_form_response({ accessCode: accessCode, responses: [
2063
+ {
2064
+ fieldTitle: 'doesnot matter',
2065
+ fieldId: field.id,
2066
+ answer: {
2067
+ type: 'string',
2068
+ value: stringResponse,
2069
+ },
2070
+ }
2071
+ ] })
1653
2072
  // const [triggeredAutomation] = await sdk.api.automated_actions.getSome()
1654
2073
  ];
1655
- case 4:
2074
+ case 11:
1656
2075
  _d.sent();
1657
2076
  return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
1658
- case 5:
2077
+ case 12:
1659
2078
  enduserWithUpdate = _d.sent();
1660
2079
  return [4 /*yield*/, sdk.api.form_responses.getOne({ accessCode: accessCode })
1661
2080
  // assert(triggeredAutomation?.event?.type === 'formResponse', 'no form response event', 'form response event triggered')
1662
2081
  ];
1663
- case 6:
2082
+ case 13:
1664
2083
  recordedResponse = _d.sent();
1665
2084
  // assert(triggeredAutomation?.event?.type === 'formResponse', 'no form response event', 'form response event triggered')
1666
2085
  assert(((_a = enduserWithUpdate === null || enduserWithUpdate === void 0 ? void 0 : enduserWithUpdate.fields) === null || _a === void 0 ? void 0 : _a[stringIntakeField]) === stringResponse, 'no enduser update', 'enduser updated');
1667
- assert(((_b = recordedResponse === null || recordedResponse === void 0 ? void 0 : recordedResponse.responses) === null || _b === void 0 ? void 0 : _b.length) === 1 && ((_c = recordedResponse.responses[0]) === null || _c === void 0 ? void 0 : _c[stringTitle]) === stringResponse, 'response not recorded', 'response recorded');
2086
+ assert(((_b = recordedResponse === null || recordedResponse === void 0 ? void 0 : recordedResponse.responses) === null || _b === void 0 ? void 0 : _b.length) === 1 && ((_c = recordedResponse.responses[0]) === null || _c === void 0 ? void 0 : _c.answer.value) === stringResponse, 'response not recorded', 'response recorded');
1668
2087
  return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
1669
- case 7:
2088
+ case 14:
1670
2089
  _d.sent();
1671
2090
  return [4 /*yield*/, sdk.api.forms.deleteOne(form.id)];
1672
- case 8:
2091
+ case 15:
1673
2092
  _d.sent();
1674
2093
  return [2 /*return*/];
1675
2094
  }
@@ -2193,6 +2612,98 @@ var enduser_redaction_tests = function () { return __awaiter(void 0, void 0, voi
2193
2612
  }
2194
2613
  });
2195
2614
  }); };
2615
+ var public_form_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
2616
+ var journey, nonPublicForm, form, submitInfo, submitInfoNonPublic, field, testResponse, responseInfo, enduser;
2617
+ return __generator(this, function (_a) {
2618
+ switch (_a.label) {
2619
+ case 0:
2620
+ log_header("Public Form");
2621
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'test journey ' })];
2622
+ case 1:
2623
+ journey = _a.sent();
2624
+ return [4 /*yield*/, sdk.api.forms.createOne({
2625
+ title: 'test form',
2626
+ intakePhone: 'optional',
2627
+ })];
2628
+ case 2:
2629
+ nonPublicForm = _a.sent();
2630
+ return [4 /*yield*/, sdk.api.forms.createOne({
2631
+ title: 'test form',
2632
+ allowPublicURL: true,
2633
+ intakePhone: 'optional',
2634
+ })];
2635
+ case 3:
2636
+ form = _a.sent();
2637
+ submitInfo = {
2638
+ businessId: form.businessId,
2639
+ email: 'publicformtest@tellescope.com',
2640
+ formId: form.id,
2641
+ fname: 'sebastian',
2642
+ lname: 'coates',
2643
+ };
2644
+ submitInfoNonPublic = __assign(__assign({}, submitInfo), { formId: nonPublicForm.id });
2645
+ return [4 /*yield*/, async_test('non-public form blocked', function () { return enduserSDK.api.form_responses.session_for_public_form(submitInfoNonPublic); }, handleAnyError)];
2646
+ case 4:
2647
+ _a.sent();
2648
+ return [4 /*yield*/, async_test('no questions form blocked', function () { return enduserSDK.api.form_responses.session_for_public_form(submitInfo); }, handleAnyError)];
2649
+ case 5:
2650
+ _a.sent();
2651
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
2652
+ formId: form.id,
2653
+ title: 'question',
2654
+ type: 'string',
2655
+ previousFields: [{ type: 'root', info: {} }]
2656
+ })];
2657
+ case 6:
2658
+ field = _a.sent();
2659
+ testResponse = {
2660
+ answer: {
2661
+ type: 'string',
2662
+ value: 'answer'
2663
+ },
2664
+ fieldId: field.id,
2665
+ fieldTitle: field.title,
2666
+ };
2667
+ return [4 /*yield*/, enduserSDK.api.form_responses.session_for_public_form(submitInfo)
2668
+ // verify enduser is actually upserted
2669
+ ];
2670
+ case 7:
2671
+ responseInfo = _a.sent();
2672
+ return [4 /*yield*/, sdk.api.endusers.getOne({ email: 'publicformtest@tellescope.com' })
2673
+ // test case for existing enduser
2674
+ ];
2675
+ case 8:
2676
+ enduser = _a.sent();
2677
+ // test case for existing enduser
2678
+ return [4 /*yield*/, enduserSDK.api.form_responses.session_for_public_form(submitInfo)];
2679
+ case 9:
2680
+ // test case for existing enduser
2681
+ _a.sent();
2682
+ enduserSDK.setAuthToken(responseInfo.authToken);
2683
+ return [4 /*yield*/, enduserSDK.refresh_session()
2684
+ // assert((enduserSDK.userInfo as any).allowedPaths.length === 3, 'allowed paths not preserved', 'allowed paths preserved after refresh')
2685
+ ]; // should be allowed
2686
+ case 10:
2687
+ _a.sent(); // should be allowed
2688
+ // assert((enduserSDK.userInfo as any).allowedPaths.length === 3, 'allowed paths not preserved', 'allowed paths preserved after refresh')
2689
+ return [4 /*yield*/, async_test('enduser cannot use non-allowed path', function () { return enduserSDK.api.endusers.updateOne(enduserSDK.userInfo.id, { fields: { testFiedl: 'testValue' } }); }, handleAnyError)];
2690
+ case 11:
2691
+ // assert((enduserSDK.userInfo as any).allowedPaths.length === 3, 'allowed paths not preserved', 'allowed paths preserved after refresh')
2692
+ _a.sent();
2693
+ return [4 /*yield*/, async_test('enduser can submit public form', function () { return enduserSDK.api.form_responses.submit_form_response({ accessCode: responseInfo.accessCode, responses: [testResponse] }); }, passOnAnyResult)];
2694
+ case 12:
2695
+ _a.sent();
2696
+ return [4 /*yield*/, Promise.all([
2697
+ sdk.api.forms.deleteOne(form.id),
2698
+ sdk.api.journeys.deleteOne(journey.id),
2699
+ sdk.api.endusers.deleteOne(enduser.id),
2700
+ ])];
2701
+ case 13:
2702
+ _a.sent();
2703
+ return [2 /*return*/];
2704
+ }
2705
+ });
2706
+ }); };
2196
2707
  var NO_TEST = function () { };
2197
2708
  var tests = {
2198
2709
  chats: chat_tests,
@@ -2211,6 +2722,7 @@ var tests = {
2211
2722
  meetings: meetings_tests,
2212
2723
  notes: NO_TEST,
2213
2724
  forms: NO_TEST,
2725
+ form_fields: NO_TEST,
2214
2726
  form_responses: form_response_tests,
2215
2727
  calendar_events: calendar_events_tests,
2216
2728
  webhooks: NO_TEST,
@@ -2226,6 +2738,7 @@ var tests = {
2226
2738
  managed_content_records: NO_TEST,
2227
2739
  post_comments: NO_TEST,
2228
2740
  post_likes: NO_TEST,
2741
+ organizations: NO_TEST,
2229
2742
  };
2230
2743
  (function () { return __awaiter(void 0, void 0, void 0, function () {
2231
2744
  var err_1, n, _a, _b, _i, returnValidation, t, _c, _d, _e, err_2;
@@ -2236,7 +2749,7 @@ var tests = {
2236
2749
  log_header("API");
2237
2750
  _h.label = 1;
2238
2751
  case 1:
2239
- _h.trys.push([1, 15, , 16]);
2752
+ _h.trys.push([1, 16, , 17]);
2240
2753
  return [4 /*yield*/, Promise.all([
2241
2754
  sdk.authenticate(email, password),
2242
2755
  sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword),
@@ -2249,51 +2762,59 @@ var tests = {
2249
2762
  return [4 /*yield*/, multi_tenant_tests()]; // should come right after setup tests
2250
2763
  case 4:
2251
2764
  _h.sent(); // should come right after setup tests
2252
- return [4 /*yield*/, search_tests()];
2765
+ return [4 /*yield*/, public_form_tests()];
2253
2766
  case 5:
2254
2767
  _h.sent();
2255
- return [4 /*yield*/, badInputTests()];
2768
+ return [4 /*yield*/, search_tests()];
2256
2769
  case 6:
2257
2770
  _h.sent();
2258
- return [4 /*yield*/, filterTests()];
2771
+ return [4 /*yield*/, badInputTests()];
2259
2772
  case 7:
2260
2773
  _h.sent();
2261
- return [4 /*yield*/, updatesTests()];
2774
+ return [4 /*yield*/, filterTests()];
2262
2775
  case 8:
2263
2776
  _h.sent();
2264
- return [4 /*yield*/, threadKeyTests()];
2777
+ return [4 /*yield*/, updatesTests()];
2265
2778
  case 9:
2266
2779
  _h.sent();
2267
- return [4 /*yield*/, enduserAccessTests()];
2780
+ return [4 /*yield*/, threadKeyTests()];
2268
2781
  case 10:
2269
2782
  _h.sent();
2270
- return [4 /*yield*/, generateEnduserAuthTests()];
2783
+ return [4 /*yield*/, enduserAccessTests()];
2271
2784
  case 11:
2272
2785
  _h.sent();
2273
- return [4 /*yield*/, enduser_session_tests()];
2786
+ return [4 /*yield*/, generateEnduserAuthTests()];
2274
2787
  case 12:
2275
2788
  _h.sent();
2276
- return [4 /*yield*/, role_based_access_tests()];
2789
+ return [4 /*yield*/, enduser_session_tests()];
2277
2790
  case 13:
2278
2791
  _h.sent();
2279
- return [4 /*yield*/, enduser_redaction_tests()];
2792
+ return [4 /*yield*/, role_based_access_tests()];
2280
2793
  case 14:
2281
2794
  _h.sent();
2282
- return [3 /*break*/, 16];
2795
+ return [4 /*yield*/, enduser_redaction_tests()];
2283
2796
  case 15:
2797
+ _h.sent();
2798
+ return [3 /*break*/, 17];
2799
+ case 16:
2284
2800
  err_1 = _h.sent();
2285
2801
  console.error("Failed during custom test");
2286
- console.error(err_1);
2802
+ if (err_1.message && err_1.info) {
2803
+ console.error(err_1.message, JSON.stringify(err_1.info, null, 2));
2804
+ }
2805
+ else {
2806
+ console.error(err_1);
2807
+ }
2287
2808
  process.exit(1);
2288
- return [3 /*break*/, 16];
2289
- case 16:
2809
+ return [3 /*break*/, 17];
2810
+ case 17:
2290
2811
  _a = [];
2291
2812
  for (_b in schema)
2292
2813
  _a.push(_b);
2293
2814
  _i = 0;
2294
- _h.label = 17;
2295
- case 17:
2296
- if (!(_i < _a.length)) return [3 /*break*/, 20];
2815
+ _h.label = 18;
2816
+ case 18:
2817
+ if (!(_i < _a.length)) return [3 /*break*/, 21];
2297
2818
  n = _a[_i];
2298
2819
  returnValidation = (_g = (_f = schema[n].customActions) === null || _f === void 0 ? void 0 : _f.create) === null || _g === void 0 ? void 0 : _g.returns;
2299
2820
  return [4 /*yield*/, run_generated_tests({
@@ -2304,38 +2825,38 @@ var tests = {
2304
2825
  create: returnValidation // ModelFields<ClientModel>,
2305
2826
  }
2306
2827
  })];
2307
- case 18:
2308
- _h.sent();
2309
- _h.label = 19;
2310
2828
  case 19:
2311
- _i++;
2312
- return [3 /*break*/, 17];
2829
+ _h.sent();
2830
+ _h.label = 20;
2313
2831
  case 20:
2832
+ _i++;
2833
+ return [3 /*break*/, 18];
2834
+ case 21:
2314
2835
  _c = [];
2315
2836
  for (_d in tests)
2316
2837
  _c.push(_d);
2317
2838
  _e = 0;
2318
- _h.label = 21;
2319
- case 21:
2320
- if (!(_e < _c.length)) return [3 /*break*/, 26];
2321
- t = _c[_e];
2322
2839
  _h.label = 22;
2323
2840
  case 22:
2324
- _h.trys.push([22, 24, , 25]);
2325
- return [4 /*yield*/, tests[t]()];
2841
+ if (!(_e < _c.length)) return [3 /*break*/, 27];
2842
+ t = _c[_e];
2843
+ _h.label = 23;
2326
2844
  case 23:
2327
- _h.sent();
2328
- return [3 /*break*/, 25];
2845
+ _h.trys.push([23, 25, , 26]);
2846
+ return [4 /*yield*/, tests[t]()];
2329
2847
  case 24:
2848
+ _h.sent();
2849
+ return [3 /*break*/, 26];
2850
+ case 25:
2330
2851
  err_2 = _h.sent();
2331
2852
  console.error("Error running test:");
2332
2853
  console.error(err_2);
2333
2854
  process.exit(1);
2334
- return [3 /*break*/, 25];
2335
- case 25:
2336
- _e++;
2337
- return [3 /*break*/, 21];
2855
+ return [3 /*break*/, 26];
2338
2856
  case 26:
2857
+ _e++;
2858
+ return [3 /*break*/, 22];
2859
+ case 27:
2339
2860
  process.exit();
2340
2861
  return [2 /*return*/];
2341
2862
  }