@tellescope/sdk 1.67.6 → 1.67.7

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.
@@ -690,6 +690,7 @@ const run_generated_tests = async <N extends ModelName>({ queries, model, name,
690
690
  () => queries.createOne(instance),
691
691
  { onResult: r => !!(_id = r.id) && (name === 'api_keys' || !!r.creator) && validateReturnType(returns.create, r, defaultValidation) }
692
692
  )
693
+ await wait(undefined, 25)
693
694
  await async_test(
694
695
  `log-${singularName} create`,
695
696
  () => sdk.api.user_logs.getOne({ resourceId: _id, resource: name, action: 'create' }),
@@ -702,6 +703,7 @@ const run_generated_tests = async <N extends ModelName>({ queries, model, name,
702
703
  () => queries.updateOne(_id, updates, { replaceObjectFields: true }),
703
704
  { onResult: u => typeof u === 'object' && u.id === _id }
704
705
  )
706
+ await wait(undefined, 25)
705
707
  await async_test(
706
708
  `log-${singularName} update`,
707
709
  () => sdk.api.user_logs.getOne({ resourceId: _id, resource: name, action: 'update' }),
@@ -743,6 +745,7 @@ const run_generated_tests = async <N extends ModelName>({ queries, model, name,
743
745
  () => queries.deleteOne(_id),
744
746
  passOnVoid
745
747
  )
748
+ await wait(undefined, 25)
746
749
  await async_test(
747
750
  `get-${singularName} (verify delete)`,
748
751
  () => queries.getOne(_id),
@@ -1501,6 +1504,7 @@ const files_tests = async () => {
1501
1504
  const enduser = await sdk.api.endusers.createOne({ email })
1502
1505
  await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
1503
1506
  await enduserSDK.authenticate(email, password).catch(console.error)
1507
+ await sdkNonAdmin.authenticate(nonAdminEmail, nonAdminPassword) // to use new role, handle logout on role change
1504
1508
 
1505
1509
  const buff = buffer.Buffer.from('test file data')
1506
1510
 
@@ -1933,12 +1937,16 @@ const ticketEventTests = async () => {
1933
1937
 
1934
1938
  await sdk.api.endusers.updateOne(enduser.id, { journeys: { [journey.id]: 'Added' }})
1935
1939
  await sdk.api.endusers.updateOne(enduserWithTeam.id, { journeys: { [nullJourney.id]: 'Added (Null)' }})
1936
- await wait(undefined, 2250) // wait for tickets to be automatically created
1937
1940
 
1938
1941
  await async_test(
1939
1942
  `Tickets automatically created`,
1940
- () => sdk.api.tickets.getSome(),
1941
- { onResult: tickets => tickets?.length === 2 }
1943
+ () => pollForResults(
1944
+ sdk.api.tickets.getSome,
1945
+ tickets => tickets?.length === 2,
1946
+ 500,
1947
+ 15,
1948
+ ),
1949
+ passOnAnyResult
1942
1950
  )
1943
1951
 
1944
1952
  await async_test(
@@ -2050,11 +2058,15 @@ const removeFromJourneyTests = async () => {
2050
2058
  { onResult: e => e.journeys?.[journey.id] !== 'Delayed Step' }
2051
2059
  )
2052
2060
 
2053
- await wait(undefined, 4 * TEST_DELAY) // wait long enough for automation to process and delay to pass
2054
2061
  await async_test(
2055
2062
  `Sequenced action triggered`,
2056
- () => sdk.api.endusers.getOne(enduser.id),
2057
- { onResult: e => e.journeys?.[journey.id] === 'Delayed Step' }
2063
+ () => pollForResults(
2064
+ () => sdk.api.endusers.getOne(enduser.id),
2065
+ e => e.journeys?.[journey.id] === 'Delayed Step',
2066
+ TEST_DELAY,
2067
+ 15,
2068
+ ),
2069
+ passOnAnyResult
2058
2070
  )
2059
2071
 
2060
2072
  await Promise.all([
@@ -2238,11 +2250,15 @@ export const formUnsubmittedCancelConditionTest = async () => {
2238
2250
  })
2239
2251
 
2240
2252
  // allow fast followup to trigger
2241
- await wait(undefined, 4000) // allow background creation with generous pause
2242
2253
  await async_test(
2243
2254
  `formUnsubmitted event with short delay is triggered`,
2244
- () => sdk.api.endusers.getOne(enduser.id),
2245
- { onResult: e => e?.journeys?.[journey.id] === 'triggered again' }
2255
+ () => pollForResults(
2256
+ () => sdk.api.endusers.getOne(enduser.id),
2257
+ e => e?.journeys?.[journey.id] === 'triggered again',
2258
+ 1000,
2259
+ 10,
2260
+ ),
2261
+ passOnAnyResult
2246
2262
  )
2247
2263
 
2248
2264
  // trigger cancel conditions
@@ -2431,8 +2447,13 @@ export const formsUnsubmittedCancelConditionTest = async () => {
2431
2447
  )
2432
2448
  await async_test(
2433
2449
  `formResponses triggered after both forms submitted`,
2434
- () => sdk.api.endusers.getOne(enduser.id),
2435
- { onResult: e => e?.journeys?.[journey.id] === 'formsSubmitted' }
2450
+ () => pollForResults(
2451
+ () => sdk.api.endusers.getOne(enduser.id),
2452
+ e => e?.journeys?.[journey.id] === 'formsSubmitted',
2453
+ 500,
2454
+ 10,
2455
+ ),
2456
+ passOnAnyResult
2436
2457
  )
2437
2458
 
2438
2459
  await Promise.all([
@@ -2509,13 +2530,15 @@ export const formsUnsubmittedTest = async () => {
2509
2530
 
2510
2531
  const form_responses = await sdk.api.form_responses.getSome()
2511
2532
 
2512
- // allow fast followup to trigger
2513
- await wait(undefined, 5000) // allow background creation with generous pause
2514
-
2515
2533
  await async_test(
2516
2534
  `formsUnsubmitted handler worked`,
2517
- () => sdk.api.endusers.getOne(enduser.id),
2518
- { onResult: e => e?.journeys?.[journey.id] === 'triggered' }
2535
+ () => pollForResults(
2536
+ () => sdk.api.endusers.getOne(enduser.id),
2537
+ e => e?.journeys?.[journey.id] === 'triggered',
2538
+ 1000,
2539
+ 10
2540
+ ),
2541
+ passOnAnyResult,
2519
2542
  )
2520
2543
 
2521
2544
  // trigger cancel conditions
@@ -2723,27 +2746,37 @@ const addToJourneyTests = async () => {
2723
2746
  { onResult: e => e.journeys?.[journey.id] === '' || e.journeys?.[journey.id] === 'Root' }
2724
2747
  )
2725
2748
 
2726
- await wait(undefined, 4000) // allow onJourneyStart step to trigger
2749
+ // ensure that second step is generated before first is cancelled
2750
+ await pollForResults(
2751
+ sdk.api.automated_actions.getSome,
2752
+ es => es.length === 2,
2753
+ 100,
2754
+ 50,
2755
+ ),
2756
+
2727
2757
  await sdk.api.endusers.add_to_journey({ enduserIds: [enduser.id], journeyId: journey.id })
2728
2758
 
2759
+ await async_test(
2760
+ `Enduser correctly added and re-added`,
2761
+ () => pollForResults(
2762
+ sdk.api.automated_actions.getSome,
2763
+ es => (es.length === 4
2764
+ && es.filter(e => e.status === 'cancelled' && e.automationStepId === follow.id).length === 1 // one afterAction is cancelled
2765
+ && es.filter(e => e.status === 'active' && e.automationStepId === follow.id).length === 1 // one afterAction is still active
2766
+ && es.filter(e => e.status === 'finished' && e.automationStepId === root.id).length === 2 // two initial onJourneyStart
2767
+ ),
2768
+ 250,
2769
+ 40
2770
+ ),
2771
+ passOnAnyResult
2772
+ )
2773
+
2729
2774
  await async_test(
2730
2775
  `Enduser throttle journey add working`,
2731
2776
  () => sdk.api.endusers.add_to_journey({ enduserIds: [enduser.id], journeyId: journey.id, throttle: true }),
2732
2777
  handleAnyError
2733
2778
  )
2734
2779
 
2735
- await wait(undefined, 4000) // allow onJourneyStart step to trigger
2736
-
2737
- await async_test(
2738
- `Enduser correctly added and re-added`,
2739
- () => sdk.api.automated_actions.getSome(),
2740
- { onResult: es => es.length === 4
2741
- && es.filter(e => e.status === 'cancelled' && e.automationStepId === follow.id).length === 1 // one afterAction is cancelled
2742
- && es.filter(e => e.status === 'active' && e.automationStepId === follow.id).length === 1 // one afterAction is still active
2743
- && es.filter(e => e.status === 'finished' && e.automationStepId === root.id).length === 2 // two initial onJourneyStart
2744
- }
2745
- )
2746
-
2747
2780
  await Promise.all([
2748
2781
  sdk.api.journeys.deleteOne(journey.id),
2749
2782
  sdk.api.endusers.deleteOne(enduser.id),
@@ -4280,15 +4313,19 @@ const run_autoreply_test = async (title: string, { expectingAutoreply } : { expe
4280
4313
  )
4281
4314
 
4282
4315
  await enduserSDK.api.chats.createOne({ roomId: room.id, message: 'enduser' })
4283
- await wait (undefined, 50)
4284
4316
  await async_test(
4285
4317
  'Main test',
4286
- () => sdk.api.chats.getSome({ filter: { roomId: room.id }}),
4287
- { onResult: cs => (
4288
- expectingAutoreply
4289
- ? cs.length === 3
4290
- : cs.length === 2
4291
- ) }
4318
+ () => pollForResults(
4319
+ () => sdk.api.chats.getSome({ filter: { roomId: room.id }}),
4320
+ cs => (
4321
+ expectingAutoreply
4322
+ ? cs.length === 3
4323
+ : cs.length === 2
4324
+ ),
4325
+ 25,
4326
+ 10
4327
+ ),
4328
+ passOnAnyResult
4292
4329
  )
4293
4330
 
4294
4331
  await enduserSDK.api.chats.createOne({ roomId: room.id, message: 'enduser again' })
@@ -4605,11 +4642,15 @@ const wait_for_trigger_tests = async () => {
4605
4642
  ])
4606
4643
 
4607
4644
  // test trigger cleaned up on journey delete
4608
- await wait(undefined, 150)
4609
4645
  await async_test(
4610
- "Trigger did not fire while not journey",
4611
- () => sdk.api.automation_triggers.getOne(trigger.id),
4612
- handleAnyError
4646
+ "Trigger cleaned up by journey deletion",
4647
+ () => pollForResults(
4648
+ sdk.api.automation_triggers.getSome,
4649
+ results => !results.find(r => r.id === trigger.id),
4650
+ 100,
4651
+ 10,
4652
+ ),
4653
+ passOnAnyResult
4613
4654
  )
4614
4655
 
4615
4656
  // double-check that wait for trigger step triggers were deleted
@@ -4757,38 +4798,41 @@ const remove_from_journey_on_incoming_comms_tests = async () => {
4757
4798
 
4758
4799
  const room = await sdk.api.chat_rooms.createOne({ })
4759
4800
  await sdk.api.chats.createOne({ roomId: room.id, senderId: e1.id, message: 'cancel' })
4760
- await wait(undefined, 100)
4761
4801
 
4762
- console.log(jRemove.id, removeStep2.id, e1.id)
4763
4802
  await async_test(
4764
4803
  "Appropriate Automated Actions are cancelled on incoming message",
4765
- () => sdk.api.automated_actions.getSome(),
4766
- { onResult: actions => (
4767
- !!actions.find(a =>
4804
+ () => pollForResults(
4805
+ sdk.api.automated_actions.getSome,
4806
+ actions => (
4807
+ !!actions.find(a =>
4808
+ a.journeyId === jRemove.id
4809
+ && a.automationStepId === removeStep1.id
4810
+ && a.enduserId === e1.id
4811
+ && a.status === 'cancelled'
4812
+ )
4813
+ && !!actions.find(a =>
4768
4814
  a.journeyId === jRemove.id
4769
4815
  && a.automationStepId === removeStep1.id
4816
+ && a.enduserId === e2.id
4817
+ && a.status === 'active'
4818
+ )
4819
+ && !!actions.find(a =>
4820
+ a.journeyId === jDontRemove.id
4821
+ && a.automationStepId === dontRemoveStep1.id
4770
4822
  && a.enduserId === e1.id
4771
- && a.status === 'cancelled'
4823
+ && a.status === 'active'
4772
4824
  )
4773
- && !!actions.find(a =>
4774
- a.journeyId === jRemove.id
4775
- && a.automationStepId === removeStep1.id
4776
- && a.enduserId === e2.id
4777
- && a.status === 'active'
4778
- )
4779
- && !!actions.find(a =>
4780
- a.journeyId === jDontRemove.id
4781
- && a.automationStepId === dontRemoveStep1.id
4782
- && a.enduserId === e1.id
4783
- && a.status === 'active'
4784
- )
4785
- && !!actions.find(a =>
4786
- a.journeyId === jDontRemove.id
4787
- && a.automationStepId === dontRemoveStep1.id
4788
- && a.enduserId === e2.id
4789
- && a.status === 'active'
4790
- )
4791
- )}
4825
+ && !!actions.find(a =>
4826
+ a.journeyId === jDontRemove.id
4827
+ && a.automationStepId === dontRemoveStep1.id
4828
+ && a.enduserId === e2.id
4829
+ && a.status === 'active'
4830
+ )
4831
+ ),
4832
+ 25,
4833
+ 20,
4834
+ ),
4835
+ passOnAnyResult,
4792
4836
  )
4793
4837
 
4794
4838
  await sdk.api.journeys.handle_incoming_communication({ enduserId: e2.id })
@@ -4816,6 +4860,8 @@ const remove_from_journey_on_incoming_comms_tests = async () => {
4816
4860
  }
4817
4861
 
4818
4862
  const pdf_generation = async () => {
4863
+ log_header("pdf_generation Tests")
4864
+
4819
4865
  const e = await sdk.api.endusers.createOne({ fname: 'test' })
4820
4866
 
4821
4867
  // include lots of answers to ensure PDF height doesn't produce any cut-off
@@ -4850,7 +4896,6 @@ const pdf_generation = async () => {
4850
4896
 
4851
4897
  await Promise.all([
4852
4898
  sdk.api.endusers.deleteOne(e.id),
4853
- sdk.api.form_responses.deleteOne(fr.id),
4854
4899
  ])
4855
4900
  }
4856
4901
 
@@ -5033,12 +5078,15 @@ const nextReminderInMS_tests = async () => {
5033
5078
  }
5034
5079
 
5035
5080
  const pollForResults = async <T>(f: () => Promise<T>, evaluate: (r: T) => boolean, intervalInMS=500, iterations=20) => {
5081
+ let lastResult = undefined as any
5036
5082
  for (let i = 0; i < iterations; i++) {
5037
5083
  await wait(undefined, intervalInMS)
5038
5084
  const result = await f()
5085
+ lastResult = result
5039
5086
  if (evaluate(result)) return result
5040
5087
  }
5041
5088
 
5089
+ console.log(lastResult)
5042
5090
  throw new Error("failed pollForResults")
5043
5091
  }
5044
5092
 
Binary file