@tellescope/sdk 0.0.91 → 0.0.94

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.
@@ -46,7 +46,6 @@ import {
46
46
  url_safe_path,
47
47
  } from "@tellescope/utilities"
48
48
 
49
-
50
49
  const UniquenessViolationMessage = 'Uniqueness Violation'
51
50
 
52
51
  const host = process.env.TEST_URL || 'http://localhost:8080'
@@ -399,7 +398,7 @@ const verify_missing_defaults = async <N extends ModelName>({ queries, model, na
399
398
  await async_test(
400
399
  `${o} unavailable for ${name}`,
401
400
  () => queryForOperation[o](),
402
- { shouldError: true, onError: e => e.message === 'This action is not allowed' },
401
+ { shouldError: true, onError: e => e.message === 'This action is not allowed' || e.message === 'Inaccessible' },
403
402
  )
404
403
  }
405
404
  }
@@ -1406,7 +1405,7 @@ const automation_events_tests = async () => {
1406
1405
 
1407
1406
  await async_test(
1408
1407
  `enterState cannot match updateStateForJourney`,
1409
- () => sdk.api.event_automations.createOne({
1408
+ () => sdk.api.automation_steps.createOne({
1410
1409
  journeyId: journey.id,
1411
1410
  event: {
1412
1411
  type: "enterState",
@@ -1421,7 +1420,7 @@ const automation_events_tests = async () => {
1421
1420
  )
1422
1421
  await async_test(
1423
1422
  `leaveState cannot match updateStateForJourney`,
1424
- () => sdk.api.event_automations.createOne({
1423
+ () => sdk.api.automation_steps.createOne({
1425
1424
  journeyId: journey.id,
1426
1425
  event: {
1427
1426
  type: "leaveState",
@@ -1439,7 +1438,7 @@ const automation_events_tests = async () => {
1439
1438
  type: 'sendWebhook',
1440
1439
  info: { message: 'test' }
1441
1440
  }
1442
- await sdk.api.event_automations.createOne({
1441
+ await sdk.api.automation_steps.createOne({
1443
1442
  journeyId: journey.id,
1444
1443
  event: {
1445
1444
  type: "enterState",
@@ -1447,7 +1446,7 @@ const automation_events_tests = async () => {
1447
1446
  },
1448
1447
  action: testAction,
1449
1448
  })
1450
- await sdk.api.event_automations.createOne({
1449
+ await sdk.api.automation_steps.createOne({
1451
1450
  journeyId: journey.id,
1452
1451
  event: {
1453
1452
  type: "leaveState",
@@ -1455,7 +1454,7 @@ const automation_events_tests = async () => {
1455
1454
  },
1456
1455
  action: testAction,
1457
1456
  })
1458
- await sdk.api.event_automations.createOne({
1457
+ await sdk.api.automation_steps.createOne({
1459
1458
  journeyId: journey.id,
1460
1459
  event: {
1461
1460
  type: "enterState",
@@ -1464,7 +1463,7 @@ const automation_events_tests = async () => {
1464
1463
  action: testAction,
1465
1464
  })
1466
1465
 
1467
- await sdk.api.event_automations.createOne({
1466
+ await sdk.api.automation_steps.createOne({
1468
1467
  journeyId: journey.id,
1469
1468
  event: {
1470
1469
  type: "formResponse",
@@ -1481,7 +1480,7 @@ const automation_events_tests = async () => {
1481
1480
 
1482
1481
  await async_test(
1483
1482
  `Cannot insert duplicate event/action pair`,
1484
- () => sdk.api.event_automations.createOne({
1483
+ () => sdk.api.automation_steps.createOne({
1485
1484
  journeyId: journey.id,
1486
1485
  event: {
1487
1486
  type: "enterState",
@@ -1515,8 +1514,8 @@ const automation_events_tests = async () => {
1515
1514
 
1516
1515
  await async_test(
1517
1516
  `Automation events triggered correctly`,
1518
- () => sdk.api.automation_endusers.getSome({ filter: { enduserId: enduser.id }}),
1519
- { onResult: es => es && es.length === 4 && es.filter(a => a.automationId === "ONE_TIME").length === 4 }
1517
+ () => sdk.api.automated_actions.getSome({ filter: { enduserId: enduser.id }}),
1518
+ { onResult: es => es && es.length === 4 && es.filter(a => a.automationStepId === "ONE_TIME").length === 4 }
1520
1519
  )
1521
1520
 
1522
1521
  // cleanup
@@ -1544,7 +1543,7 @@ const form_response_tests = async () => {
1544
1543
  intakeField: stringIntakeField
1545
1544
  }]
1546
1545
  })
1547
- await sdk.api.event_automations.createOne({
1546
+ await sdk.api.automation_steps.createOne({
1548
1547
  event: { type: "formResponse", info: { formId: form.id } },
1549
1548
  action: { type: 'sendWebhook', info: { message: 'test' } },
1550
1549
  })
@@ -1552,7 +1551,7 @@ const form_response_tests = async () => {
1552
1551
  const { accessCode } = await sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })
1553
1552
  await sdk.api.form_responses.submit_form_response({ accessCode, responses: [stringResponse] })
1554
1553
 
1555
- const [triggeredAutomation] = await sdk.api.automation_endusers.getSome()
1554
+ const [triggeredAutomation] = await sdk.api.automated_actions.getSome()
1556
1555
  const enduserWithUpdate = await sdk.api.endusers.getOne(enduser.id)
1557
1556
  const recordedResponse = await sdk.api.form_responses.getOne({ accessCode })
1558
1557
 
@@ -1642,6 +1641,163 @@ const notifications_tests = async () => {
1642
1641
  ])
1643
1642
  }
1644
1643
 
1644
+ const handleAnyError = { shouldError: true, onError: () => true }
1645
+ const passOnAnyResult = { onResult: () => true }
1646
+
1647
+ const role_based_access_tests = async () => {
1648
+ log_header("Role Based Access Tests")
1649
+ const adminId = sdk.userInfo.id
1650
+ const nonAdminId = sdkNonAdmin.userInfo.id
1651
+
1652
+ const e = await sdk.api.endusers.createOne({ email: 'roletest@gmail.com' })
1653
+
1654
+ const adminTicket = await sdk.api.tickets.createOne({ title: 'ticket', enduserId: e.id, owner: adminId })
1655
+ const nonAdminTicket = await sdk.api.tickets.createOne({ title: 'ticket', enduserId: e.id, owner: nonAdminId })
1656
+ const nonAdminTicketNoEnduser = await sdk.api.tickets.createOne({ title: 'ticket', owner: nonAdminId })
1657
+ const ticketCreatedByNonAdmin = await sdkNonAdmin.api.tickets.createOne({ title: 'ticket' })
1658
+
1659
+ const email = await sdk.api.emails.createOne({ enduserId: e.id, logOnly: true, subject: 'blah', textContent: 'blah blah' })
1660
+ const sms = await sdk.api.sms_messages.createOne({ enduserId: e.id, logOnly: true, message: 'blah blah' })
1661
+ const calendarEvent = await sdk.api.calendar_events.createOne({
1662
+ attendees: [{ id: e.id, type: 'enduser' }],
1663
+ durationInMinutes: 50,
1664
+ startTimeInMS: 2000000,
1665
+ title: 'Access Test'
1666
+ })
1667
+
1668
+ const chatRoom = await sdk.api.chat_rooms.createOne({ enduserIds: [e.id ]})
1669
+ const chatMessage = await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'test chat access' })
1670
+ const chatMessage2 = await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'test chat access 2' })
1671
+
1672
+ // unassigned to enduser access tests
1673
+ await async_test(
1674
+ `Admin / creator can access enduser without being assigned`,
1675
+ () => sdk.api.endusers.getOne(e.id),
1676
+ { onResult: e => !!e },
1677
+ )
1678
+ await async_test(
1679
+ `Unassigned non-admin can't access enduser without being assigned`,
1680
+ () => sdkNonAdmin.api.endusers.getOne(e.id), handleAnyError,
1681
+ )
1682
+ await async_test(
1683
+ `non-admin for enduser ticket bad`,
1684
+ () => sdkNonAdmin.api.tickets.getOne(adminTicket.id), handleAnyError,
1685
+ )
1686
+ await async_test(
1687
+ `Non-admin for ticket`, () => sdkNonAdmin.api.tickets.getOne(nonAdminTicketNoEnduser.id), passOnAnyResult
1688
+ )
1689
+ await async_test(
1690
+ `Non-admin for enduser ticket`, () => sdkNonAdmin.api.tickets.getOne(nonAdminTicket.id), passOnAnyResult
1691
+ )
1692
+ await async_test(
1693
+ `Non-admin for own ticket`, () => sdkNonAdmin.api.tickets.getOne(ticketCreatedByNonAdmin.id), passOnAnyResult
1694
+ )
1695
+ await async_test(
1696
+ `Non-admin for tickets`, () => sdkNonAdmin.api.tickets.getSome(), { onResult: ts => ts.length === 3 }
1697
+ )
1698
+ await async_test(
1699
+ `non-admin for email bad`, () => sdkNonAdmin.api.emails.getOne(email.id), handleAnyError,
1700
+ )
1701
+ await async_test(
1702
+ `non-admin for sms bad`, () => sdkNonAdmin.api.sms_messages.getOne(sms.id), handleAnyError,
1703
+ )
1704
+ await async_test(
1705
+ `admin for calendar`, () => sdk.api.calendar_events.getOne(calendarEvent.id), passOnAnyResult,
1706
+ )
1707
+ await async_test(
1708
+ `non-admin for calendar bad`, () => sdkNonAdmin.api.calendar_events.getOne(calendarEvent.id), handleAnyError,
1709
+ )
1710
+ await async_test(
1711
+ `non-admin for chat room bad`, () => sdkNonAdmin.api.chat_rooms.getOne(chatRoom.id), handleAnyError,
1712
+ )
1713
+ await async_test(
1714
+ `non-admin for chat message bad`, () => sdkNonAdmin.api.chats.getOne(chatMessage.id), handleAnyError,
1715
+ )
1716
+ await async_test(
1717
+ `Non-admin for chats`, () => sdkNonAdmin.api.chats.getSome({ filter: { roomId: chatRoom.id } }), handleAnyError,
1718
+ )
1719
+
1720
+ // unassigned update / delete coverage
1721
+ await async_test(
1722
+ `non-admin for enduser ticket update bad`,
1723
+ () => sdkNonAdmin.api.tickets.updateOne(adminTicket.id, { title: 'updated' }), handleAnyError,
1724
+ )
1725
+ await async_test(
1726
+ `non-admin for enduser ticket delete bad`, () => sdkNonAdmin.api.tickets.deleteOne(adminTicket.id), handleAnyError,
1727
+ )
1728
+ await async_test(
1729
+ `non-admin can't delete tickets by default (even with access)`,
1730
+ () => sdkNonAdmin.api.tickets.deleteOne(nonAdminTicket.id), handleAnyError,
1731
+ )
1732
+
1733
+ // set assignees
1734
+ await sdk.api.endusers.updateOne(e.id, { assignedTo: [sdk.userInfo.id, sdkNonAdmin.userInfo.id]})
1735
+
1736
+ // assigned access tests
1737
+ await async_test(
1738
+ `Admin / creator can access enduser while assigned`, () => sdk.api.endusers.getOne(e.id), passOnAnyResult
1739
+ )
1740
+ await async_test(
1741
+ `Unassigned non-admin can access enduser while assigned`, () => sdkNonAdmin.api.endusers.getOne(e.id), passOnAnyResult
1742
+ )
1743
+ await async_test(
1744
+ `non-admin for enduser ticket`, () => sdkNonAdmin.api.tickets.getOne(adminTicket.id), passOnAnyResult,
1745
+ )
1746
+ await async_test(
1747
+ `Non-admin for ticket`, () => sdkNonAdmin.api.tickets.getOne(nonAdminTicketNoEnduser.id), passOnAnyResult
1748
+ )
1749
+ await async_test(
1750
+ `Non-admin for enduser ticket`, () => sdkNonAdmin.api.tickets.getOne(nonAdminTicket.id), passOnAnyResult
1751
+ )
1752
+ await async_test(
1753
+ `Non-admin for tickets`, () => sdkNonAdmin.api.tickets.getSome(), { onResult: ts => ts.length === 4 }
1754
+ )
1755
+ await async_test(
1756
+ `non-admin for email`, () => sdkNonAdmin.api.emails.getOne(email.id), passOnAnyResult,
1757
+ )
1758
+ await async_test(
1759
+ `non-admin for sms`, () => sdkNonAdmin.api.sms_messages.getOne(sms.id), passOnAnyResult,
1760
+ )
1761
+ await async_test(
1762
+ `non-admin for calendar`, () => sdkNonAdmin.api.calendar_events.getOne(calendarEvent.id), passOnAnyResult,
1763
+ )
1764
+ await async_test(
1765
+ `non-admin for chat room`, () => sdkNonAdmin.api.chat_rooms.getOne(chatRoom.id), passOnAnyResult,
1766
+ )
1767
+ await async_test(
1768
+ `non-admin for chat message`, () => sdkNonAdmin.api.chats.getOne(chatMessage.id), passOnAnyResult,
1769
+ )
1770
+ await async_test(
1771
+ `Non-admin for chats`, () => sdkNonAdmin.api.chats.getSome({ filter: { roomId: chatRoom.id } }),
1772
+ { onResult: cs => cs.length === 2 },
1773
+ )
1774
+
1775
+
1776
+ // update / delete coverage for assigned tickets
1777
+ await async_test(
1778
+ `non-admin assigned enduser ticket update find`,
1779
+ () => sdkNonAdmin.api.tickets.updateOne(adminTicket.id, { title: 'updated' }), passOnAnyResult,
1780
+ )
1781
+ await async_test(
1782
+ `non-admin for enduser ticket delete still bad`, () => sdkNonAdmin.api.tickets.deleteOne(adminTicket.id), handleAnyError,
1783
+ )
1784
+
1785
+ // cleanup
1786
+ await Promise.all([
1787
+ sdk.api.endusers.deleteOne(e.id),
1788
+ sdk.api.tickets.deleteOne(adminTicket.id),
1789
+ sdk.api.tickets.deleteOne(nonAdminTicket.id),
1790
+ sdk.api.tickets.deleteOne(nonAdminTicketNoEnduser.id),
1791
+ sdk.api.tickets.deleteOne(ticketCreatedByNonAdmin.id),
1792
+ sdk.api.emails.deleteOne(email.id),
1793
+ sdk.api.sms_messages.deleteOne(sms.id),
1794
+ sdk.api.calendar_events.deleteOne(calendarEvent.id),
1795
+ sdk.api.chat_rooms.deleteOne(chatRoom.id),
1796
+ sdk.api.chats.deleteOne(chatMessage.id),
1797
+ sdk.api.chats.deleteOne(chatMessage2.id),
1798
+ ])
1799
+ }
1800
+
1645
1801
  const NO_TEST = () => {}
1646
1802
  const tests: { [K in keyof ClientModelForName]: () => void } = {
1647
1803
  chats: chat_tests,
@@ -1662,10 +1818,10 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
1662
1818
  forms: NO_TEST,
1663
1819
  form_responses: form_response_tests,
1664
1820
  calendar_events: calendar_events_tests,
1665
- webhooks: NO_TEST, // tested separately
1666
- event_automations: automation_events_tests,
1821
+ webhooks: NO_TEST, // tested separately,
1822
+ automation_steps: automation_events_tests,
1667
1823
  sequence_automations: NO_TEST,
1668
- automation_endusers: NO_TEST,
1824
+ automated_actions: NO_TEST,
1669
1825
  user_logs: NO_TEST,
1670
1826
  user_notifications: notifications_tests,
1671
1827
  };
@@ -1688,6 +1844,7 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
1688
1844
  await enduserAccessTests()
1689
1845
  await generateEnduserAuthTests()
1690
1846
  await enduser_session_tests()
1847
+ await role_based_access_tests()
1691
1848
  } catch(err) {
1692
1849
  console.error("Failed during custom test")
1693
1850
  console.error(err)
@@ -198,22 +198,15 @@ const test_automation_webhooks = async () => {
198
198
  const journey = await sdk.api.journeys.createOne({
199
199
  title: "Automations Test",
200
200
  defaultState: state1,
201
- states: [
202
- { name: state1, priority: 'N/A' },
203
- { name: state2, priority: 'N/A' },
204
- ]
205
201
  })
206
202
 
207
203
  const testAction: AutomationAction = {
208
204
  type: 'sendWebhook',
209
205
  info: { message: testMessage }
210
206
  }
211
- await sdk.api.event_automations.createOne({
207
+ await sdk.api.automation_steps.createOne({
212
208
  journeyId: journey.id,
213
- event: {
214
- type: "enterState",
215
- info: { state: state1, journeyId: journey.id }
216
- },
209
+ event: { type: "onJourneyStart", info: {} },
217
210
  action: testAction,
218
211
  })
219
212