@tellescope/sdk 1.2.0 → 1.2.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.
@@ -10,6 +10,7 @@ import {
10
10
  } from "@tellescope/types-client"
11
11
  import {
12
12
  AutomationAction,
13
+ FormResponseValue,
13
14
  ModelName,
14
15
  } from "@tellescope/types-models"
15
16
 
@@ -1432,7 +1433,12 @@ const formEventTests = async () => {
1432
1433
  const journey = await sdk.api.journeys.createOne({ title: 'test journey '})
1433
1434
  const form = await sdk.api.forms.createOne({
1434
1435
  title: 'test form',
1435
- fields: [{ title: 'question', type: 'string' }],
1436
+ })
1437
+ const field = await sdk.api.form_fields.createOne({
1438
+ formId: form.id,
1439
+ title: 'question',
1440
+ type: 'string',
1441
+ previousFields: [{ type: 'root', info: {} }]
1436
1442
  })
1437
1443
 
1438
1444
  const triggerStep = await sdk.api.automation_steps.createOne({
@@ -1460,8 +1466,19 @@ const formEventTests = async () => {
1460
1466
  const { accessCode: acNoStep } = await sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })
1461
1467
  const { accessCode: acStep } = await sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })
1462
1468
 
1463
- await sdk.api.form_responses.submit_form_response({ accessCode: acNoStep, responses: ['answer'] })
1464
- await sdk.api.form_responses.submit_form_response({ accessCode: acStep, automationStepId: triggerStep.id, responses: ['answer'] })
1469
+ const testResponse: FormResponseValue = {
1470
+ answer: {
1471
+ type: 'string',
1472
+ value: 'answer'
1473
+ },
1474
+ fieldId: field.id,
1475
+ fieldTitle: field.title,
1476
+ }
1477
+
1478
+ const { formResponse } = await sdk.api.form_responses.submit_form_response({ accessCode: acNoStep, responses: [testResponse] })
1479
+ assert(objects_equivalent(formResponse.responses, [testResponse]), 'bad form resonse returned', 'form response returned correctly')
1480
+
1481
+ await sdk.api.form_responses.submit_form_response({ accessCode: acStep, automationStepId: triggerStep.id, responses: [testResponse] })
1465
1482
  await wait(undefined, 250) // allow background creation with generous pause
1466
1483
 
1467
1484
  await async_test(
@@ -1606,10 +1623,81 @@ const ticketEventTests = async () => {
1606
1623
  ])
1607
1624
  }
1608
1625
 
1626
+ const removeFromJourneyTests = async () => {
1627
+ log_header("Remove from Journey")
1628
+
1629
+ const journey = await sdk.api.journeys.createOne({ title: 'test journey'})
1630
+ const journey2 = await sdk.api.journeys.createOne({ title: 'other journey'})
1631
+
1632
+ const enduser = await sdk.api.endusers.createOne({ email: 'test@tellescope.com' })
1633
+ const enduser2 = await sdk.api.endusers.createOne({ email: 'test2@tellescope.com' })
1634
+ await sdk.api.endusers.updateOne(enduser.id, { journeys: { [journey.id]: 'Added', [journey2.id]: 'Added2' }})
1635
+
1636
+ const step = await (
1637
+ sdk.api.automation_steps.createOne({
1638
+ journeyId: journey.id,
1639
+ event: { type: 'onJourneyStart', info: { } },
1640
+ action: { type: 'setEnduserStatus', info: { status: 'Root' }, },
1641
+ })
1642
+ )
1643
+ const step2 = await (
1644
+ sdk.api.automation_steps.createOne({
1645
+ journeyId: journey2.id,
1646
+ event: { type: 'onJourneyStart', info: { } },
1647
+ action: { type: 'setEnduserStatus', info: { status: 'Root' }, },
1648
+ })
1649
+ )
1650
+
1651
+ const createAction = (journeyId: string, step: { id: string }, enduserId?: string) => (
1652
+ sdk.api.automated_actions.createOne({
1653
+ journeyId,
1654
+ automationStepId: step.id,
1655
+ cancelConditions: [],
1656
+ enduserId: enduserId ?? enduser.id,
1657
+ processAfter: Date.now() + 1000000, // add delay to make sure it doesn't happen
1658
+ status: 'active',
1659
+ event: { type: 'onJourneyStart', info: { } },
1660
+ action: { type: 'setEnduserStatus', info: { status: 'Test Status' }, },
1661
+ })
1662
+ )
1663
+
1664
+ const numberOfActions = 4
1665
+ for (let i = 0; i < numberOfActions; i++) {
1666
+ await createAction(journey.id, step);
1667
+ await createAction(journey2.id, step2);
1668
+ await createAction(journey.id, step, enduser2.id);
1669
+ }
1670
+
1671
+ // remove from journey, should set all statuses to cancelled
1672
+ await sdk.api.endusers.updateOne(enduser.id, { journeys: { } }, { replaceObjectFields: true })
1673
+ await wait(undefined, 250)
1674
+
1675
+ await async_test(
1676
+ `Automated actions for handle ticket created`,
1677
+ () => sdk.api.automated_actions.getSome(),
1678
+ { onResult: (actions => (
1679
+ // enduser removed from multiple journeys
1680
+ actions.filter(a => a.status === 'cancelled').length === numberOfActions * 2
1681
+
1682
+ // other enduser is unaffected
1683
+ && actions.filter(a => a.status === 'active').length === numberOfActions
1684
+ ))}
1685
+ )
1686
+
1687
+
1688
+ await Promise.all([
1689
+ sdk.api.journeys.deleteOne(journey.id),
1690
+ sdk.api.journeys.deleteOne(journey2.id),
1691
+ sdk.api.endusers.deleteOne(enduser.id),
1692
+ sdk.api.endusers.deleteOne(enduser2.id),
1693
+ ])
1694
+ }
1695
+
1609
1696
  const automation_events_tests = async () => {
1610
1697
  log_header("Automation Events")
1611
1698
  await formEventTests()
1612
1699
  await ticketEventTests()
1700
+ await removeFromJourneyTests()
1613
1701
 
1614
1702
  }
1615
1703
 
@@ -1622,21 +1710,60 @@ const form_response_tests = async () => {
1622
1710
  const enduser = await sdk.api.endusers.createOne({ email: "formresponse@tellescope.com" })
1623
1711
  const form = await sdk.api.forms.createOne({
1624
1712
  title: 'test form',
1625
- fields: [{
1626
- title: stringTitle,
1627
- description: 'Enter a string',
1628
- type: 'string',
1629
- isOptional: false,
1630
- intakeField: stringIntakeField
1631
- }]
1632
1713
  })
1714
+ assert(form.numFields === 0, 'numFields bad init', 'num fields on init')
1715
+
1716
+ const field = await sdk.api.form_fields.createOne({
1717
+ formId: form.id,
1718
+ title: stringTitle,
1719
+ description: 'Enter a string',
1720
+ type: 'string',
1721
+ isOptional: false,
1722
+ intakeField: stringIntakeField,
1723
+ previousFields: [{ type: 'root', info: {} }]
1724
+ })
1725
+ const field2 = await sdk.api.form_fields.createOne({
1726
+ formId: form.id,
1727
+ title: stringTitle,
1728
+ description: 'Enter a string',
1729
+ type: 'string',
1730
+ isOptional: false,
1731
+ intakeField: stringIntakeField,
1732
+ previousFields: [{ type: 'root', info: {} }]
1733
+ })
1734
+ await wait(undefined, 250)
1735
+
1736
+ await async_test(
1737
+ `numFields incremented on new field`,
1738
+ () => sdk.api.forms.getOne(form.id),
1739
+ { onResult: f => f.numFields === 2},
1740
+ )
1741
+
1742
+ await sdk.api.form_fields.deleteOne(field2.id)
1743
+ await wait(undefined, 250)
1744
+ await async_test(
1745
+ `numFields decremented after delete`,
1746
+ () => sdk.api.forms.getOne(form.id),
1747
+ { onResult: f => f.numFields === 1},
1748
+ )
1749
+
1750
+
1633
1751
  // await sdk.api.automation_steps.createOne({
1634
1752
  // event: { type: "formResponse", info: { formId: form.id } },
1635
1753
  // action: { type: 'sendWebhook', info: { message: 'test' } },
1636
1754
  // })
1637
1755
 
1638
1756
  const { accessCode } = await sdk.api.form_responses.prepare_form_response({ formId: form.id, enduserId: enduser.id })
1639
- await sdk.api.form_responses.submit_form_response({ accessCode, responses: [stringResponse] })
1757
+ await sdk.api.form_responses.submit_form_response({ accessCode, responses: [
1758
+ {
1759
+ fieldTitle: 'doesnot matter',
1760
+ fieldId: field.id,
1761
+ answer: {
1762
+ type: 'string',
1763
+ value: stringResponse,
1764
+ },
1765
+ }
1766
+ ]})
1640
1767
 
1641
1768
  // const [triggeredAutomation] = await sdk.api.automated_actions.getSome()
1642
1769
  const enduserWithUpdate = await sdk.api.endusers.getOne(enduser.id)
@@ -1645,7 +1772,7 @@ const form_response_tests = async () => {
1645
1772
  // assert(triggeredAutomation?.event?.type === 'formResponse', 'no form response event', 'form response event triggered')
1646
1773
  assert(enduserWithUpdate?.fields?.[stringIntakeField] === stringResponse, 'no enduser update', 'enduser updated')
1647
1774
  assert(
1648
- recordedResponse?.responses?.length === 1 && recordedResponse.responses[0]?.[stringTitle] === stringResponse,
1775
+ recordedResponse?.responses?.length === 1 && recordedResponse.responses[0]?.answer.value === stringResponse,
1649
1776
  'response not recorded',
1650
1777
  'response recorded'
1651
1778
  )
@@ -2118,6 +2245,7 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
2118
2245
  meetings: meetings_tests,
2119
2246
  notes: NO_TEST,
2120
2247
  forms: NO_TEST,
2248
+ form_fields: NO_TEST,
2121
2249
  form_responses: form_response_tests,
2122
2250
  calendar_events: calendar_events_tests,
2123
2251
  webhooks: NO_TEST, // tested separately,
@@ -2133,6 +2261,7 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
2133
2261
  managed_content_records: NO_TEST,
2134
2262
  post_comments: NO_TEST,
2135
2263
  post_likes: NO_TEST,
2264
+ organizations: NO_TEST,
2136
2265
  };
2137
2266
 
2138
2267
  (async () => {
@@ -2155,9 +2284,13 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
2155
2284
  await enduser_session_tests()
2156
2285
  await role_based_access_tests()
2157
2286
  await enduser_redaction_tests()
2158
- } catch(err) {
2287
+ } catch(err: any) {
2159
2288
  console.error("Failed during custom test")
2160
- console.error(err)
2289
+ if (err.message && err.info) {
2290
+ console.error(err.message, JSON.stringify(err.info, null, 2))
2291
+ } else {
2292
+ console.error(err)
2293
+ }
2161
2294
  process.exit(1)
2162
2295
  }
2163
2296