@tellescope/sdk 1.200.2 → 1.202.0

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.
@@ -7298,22 +7298,24 @@ export const formsort_tests = async () => {
7298
7298
 
7299
7299
  const form = await sdk.api.forms.createOne({ title: "FormSort" })
7300
7300
 
7301
- const postToFormsort = async ({ matchByName=false, ...o }: {
7301
+ const postToFormsort = async ({ matchByName=false, createNewEnduser=false, ...o }: {
7302
7302
  answers: { key: string, value: any }[],
7303
7303
  responder_uuid: string,
7304
7304
  finalized: boolean,
7305
7305
  matchByName?: boolean,
7306
+ createNewEnduser?: boolean,
7306
7307
  }) => {
7307
- await axios.post(`${host}/v1/webhooks/formsort/9d4f9dff00f60df2690a16da2cb848f289b447614ad9bef850e54af09a1fbf7a?formId=${form.id}&matchByName=${matchByName}`, o)
7308
+ await axios.post(`${host}/v1/webhooks/formsort/9d4f9dff00f60df2690a16da2cb848f289b447614ad9bef850e54af09a1fbf7a?formId=${form.id}&matchByName=${matchByName}&createNewEnduser=${createNewEnduser}`, o)
7308
7309
  }
7309
7310
 
7310
- const postToFormsortGeneric = async ({ matchByName=false, ...o }: {
7311
+ const postToFormsortGeneric = async ({ matchByName=false, createNewEnduser=false, ...o }: {
7311
7312
  answers: { key: string, value: any }[],
7312
7313
  responder_uuid: string,
7313
7314
  finalized: boolean,
7314
7315
  matchByName?: boolean,
7316
+ createNewEnduser?: boolean,
7315
7317
  }) => {
7316
- await axios.post(`${host}/v1/webhooks/form-ingestion/9d4f9dff00f60df2690a16da2cb848f289b447614ad9bef850e54af09a1fbf7a?formId=${form.id}&matchByName=${matchByName}`, o)
7318
+ await axios.post(`${host}/v1/webhooks/form-ingestion/9d4f9dff00f60df2690a16da2cb848f289b447614ad9bef850e54af09a1fbf7a?formId=${form.id}&matchByName=${matchByName}&createNewEnduser=${createNewEnduser}`, o)
7317
7319
  }
7318
7320
 
7319
7321
  const emailAnswer = { key: 'email', value: 'test@tellescope.com' }
@@ -7520,6 +7522,28 @@ export const formsort_tests = async () => {
7520
7522
  }
7521
7523
  )
7522
7524
 
7525
+ await postToFormsort({ answers: [emailAnswer], responder_uuid: "createNewEnduser", finalized: false, createNewEnduser: true })
7526
+ await async_test(`new enduser and form response created (1)`, sdk.api.form_responses.getSome, { onResult: r => r.length === 7 })
7527
+ await async_test(`new enduser and form response created (1)`, sdk.api.endusers.getSome, { onResult: r => r.length === 5 })
7528
+
7529
+ await postToFormsort({ answers: [emailAnswer], responder_uuid: "createNewEnduser", finalized: false, createNewEnduser: true })
7530
+ await async_test(`new enduser and form response created (2)`, sdk.api.form_responses.getSome, {
7531
+ onResult: r => r.length === 8 && r.filter(e => e.externalId === 'createNewEnduser').length === 2
7532
+ })
7533
+ await async_test(`new enduser and form response created (2)`, sdk.api.endusers.getSome, {
7534
+ onResult: r => r.length === 6 && r.filter(e => e.externalId === 'createNewEnduser').length === 2
7535
+ })
7536
+
7537
+ await postToFormsort({ answers: [emailAnswer], responder_uuid: "createNewEnduser", finalized: true, createNewEnduser: true })
7538
+ await async_test(`new enduser and form response created (3, finalized)`, sdk.api.form_responses.getSome, {
7539
+ onResult: r => r.length === 9 && r.filter(e => e.externalId === 'createNewEnduser').length === 3
7540
+ })
7541
+ await async_test(`new enduser and form response created (3, finalized)`, sdk.api.endusers.getSome, {
7542
+ onResult: r => r.length === 7
7543
+ && r.filter(e => e.externalId === 'createNewEnduser').length === 3
7544
+ && r.filter(e => e.externalId === 'createNewEnduser' && e.email === emailAnswer.value).length === 1 // email set on finalized
7545
+ })
7546
+
7523
7547
  // cleanup
7524
7548
  const endusers = await sdk.api.endusers.getSome()
7525
7549
  await Promise.all([
@@ -10428,6 +10452,7 @@ const get_templated_message_tests = async () => {
10428
10452
 
10429
10453
  const enduser = await sdk.api.endusers.createOne({ fname: "Main", fields: { CustomField: "Enduser" } })
10430
10454
  const related = await sdk.api.endusers.createOne({ lname: "Related", fields: { OtherCustomField: "Contact" } })
10455
+ const form = await sdk.api.forms.createOne({ title: 'test form for templated message' })
10431
10456
 
10432
10457
  await async_test(
10433
10458
  "Fields are templated correctly for enduser and relatedcontact",
@@ -10457,9 +10482,93 @@ const get_templated_message_tests = async () => {
10457
10482
  }
10458
10483
  )
10459
10484
 
10485
+ await async_test(
10486
+ "Unformatted link",
10487
+ () => sdk.api.templates.get_templated_message({
10488
+ enduserId: enduser.id,
10489
+ channel: 'Email',
10490
+ message: `https://www.tellescope.com`,
10491
+ html: `https://www.tellescope.com`,
10492
+ userId: sdk.userInfo.id,
10493
+ }),
10494
+ {
10495
+ onResult: r => (
10496
+ r.plaintext === 'https://www.tellescope.com'
10497
+ && r.html === 'https://www.tellescope.com'
10498
+ )
10499
+ }
10500
+ )
10501
+
10502
+ await async_test(
10503
+ "link format",
10504
+ () => sdk.api.templates.get_templated_message({
10505
+ enduserId: enduser.id,
10506
+ channel: 'Email',
10507
+ message: `{https://www.tellescope.com}[click here]`,
10508
+ html: `{https://www.tellescope.com}[click here]`,
10509
+ userId: sdk.userInfo.id,
10510
+ }),
10511
+ { onResult:
10512
+ r => (
10513
+ r.plaintext.includes('/r/') && r.plaintext.includes('click here')
10514
+ && r.html.includes('/r/') && r.html.includes('<a') && r.html.includes('click here') && r.html.includes("</a>")
10515
+ )
10516
+ }
10517
+ )
10518
+ await async_test(
10519
+ "plain $LINK_ONLY",
10520
+ () => sdk.api.templates.get_templated_message({
10521
+ enduserId: enduser.id,
10522
+ channel: 'Email',
10523
+ message: `{https://www.tellescope.com}[$LINK_ONLY]`,
10524
+ html: `{https://www.tellescope.com}[$LINK_ONLY]`,
10525
+ userId: sdk.userInfo.id,
10526
+ }),
10527
+ { onResult:
10528
+ r => (
10529
+ r.plaintext.includes('/r/') && !r.plaintext.includes('$LINK_ONLY')
10530
+ && r.html.includes('/r/') && !r.html.includes('$LINK_ONLY')
10531
+ )
10532
+ }
10533
+ )
10534
+
10535
+ await async_test(
10536
+ "form link",
10537
+ () => sdk.api.templates.get_templated_message({
10538
+ enduserId: enduser.id,
10539
+ channel: 'Email',
10540
+ message: `{{forms.${form.id}.link:click here}}`,
10541
+ html: `{{forms.${form.id}.link:click here}}`,
10542
+ userId: sdk.userInfo.id,
10543
+ }),
10544
+ { onResult:
10545
+ r => (
10546
+ r.plaintext.includes('/r/') && r.plaintext.includes('click here')
10547
+ && r.html.includes('/r/') && r.html.includes('<a') && r.html.includes('click here') && r.html.includes("</a>")
10548
+ )
10549
+ }
10550
+ )
10551
+ await async_test(
10552
+ "form $LINK_ONLY",
10553
+ () => sdk.api.templates.get_templated_message({
10554
+ enduserId: enduser.id,
10555
+ channel: 'Email',
10556
+ message: `{{forms.${form.id}.link:$LINK_ONLY}}`,
10557
+ html: `{{forms.${form.id}.link:$LINK_ONLY}}`,
10558
+ userId: sdk.userInfo.id,
10559
+ }),
10560
+ { onResult:
10561
+ r => (
10562
+ r.plaintext.includes('/r/') && !r.plaintext.includes('$LINK_ONLY')
10563
+ && r.html.includes('/r/') && !r.html.includes('$LINK_ONLY')
10564
+ )
10565
+ }
10566
+ )
10567
+
10460
10568
  await Promise.all([
10461
10569
  sdk.api.endusers.deleteOne(enduser.id),
10462
10570
  sdk.api.endusers.deleteOne(related.id),
10571
+ sdk.api.forms.deleteOne(form.id),
10463
10572
  ])
10464
10573
  }
10465
10574
 
@@ -10567,6 +10676,600 @@ const replace_enduser_template_values_tests = async () => {
10567
10676
  await sdk.api.endusers.deleteOne(enduser.id)
10568
10677
  }
10569
10678
 
10679
+ const inbox_loading_tests = async () => {
10680
+ log_header("Inbox Loading Tests")
10681
+ const e = await sdk.api.endusers.createOne({ fname: 'Test', lname: 'Testson' })
10682
+
10683
+ const email = await sdk.api.emails.createOne({
10684
+ logOnly: true,
10685
+ subject: 'Test Email',
10686
+ enduserId: e.id,
10687
+ textContent: 'This is a test email',
10688
+ inbound: true,
10689
+ userId: sdk.userInfo.id,
10690
+ })
10691
+ const sms = await sdk.api.sms_messages.createOne({
10692
+ logOnly: true,
10693
+ inbound: true,
10694
+ enduserId: e.id,
10695
+ message: 'This is a test SMS',
10696
+ userId: sdk.userInfo.id,
10697
+ })
10698
+ const groupMMS = await sdk.api.group_mms_conversations.createOne({
10699
+ enduserIds: [e.id],
10700
+ userIds: [sdk.userInfo.id],
10701
+ userStates: [],
10702
+ })
10703
+ const call = await sdk.api.phone_calls.createOne({ enduserId: e.id, inbound: true, userId: sdk.userInfo.id })
10704
+ const thread = await sdk.api.ticket_threads.createOne({ enduserId: e.id, subject: 'test thread' })
10705
+ const comment = await sdk.api.ticket_thread_comments.createOne({
10706
+ enduserId: e.id,
10707
+ html: '',
10708
+ inbound: false,
10709
+ plaintext: '',
10710
+ public: false,
10711
+ ticketThreadId: thread.id,
10712
+ userId: sdk.userInfo.id,
10713
+ })
10714
+ const room = await sdk.api.chat_rooms.createOne({ enduserIds: [e.id], userIds: [], title: 'Test Chat Room' })
10715
+
10716
+ await async_test(
10717
+ "Inbox loads emails",
10718
+ () => sdk.api.endusers.load_inbox_data({ }),
10719
+ { onResult: r => (
10720
+ r.chat_rooms.length === 1
10721
+ && r.emails.length === 1
10722
+ && r.sms_messages.length === 1
10723
+ && r.group_mms_conversations.length === 1
10724
+ && r.phone_calls.length === 1
10725
+ && r.ticket_thread_comments.length === 1
10726
+ && r.endusers.length === 1
10727
+ ) }
10728
+ )
10729
+
10730
+ await async_test(
10731
+ "Inbox loads emails (filter by self when no threads are assigned)",
10732
+ () => sdk.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10733
+ { onResult: r => (
10734
+ r.chat_rooms.length === 1
10735
+ && r.emails.length === 1
10736
+ && r.sms_messages.length === 1
10737
+ && r.group_mms_conversations.length === 1
10738
+ && r.phone_calls.length === 1
10739
+ && r.ticket_thread_comments.length === 1
10740
+ && r.endusers.length === 1
10741
+ ) }
10742
+ )
10743
+
10744
+ await async_test(
10745
+ "Inbox loads emails (filter by other when no threads are assigned)",
10746
+ () => sdk.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10747
+ { onResult: r => (
10748
+ r.chat_rooms.length === 1
10749
+ && r.emails.length === 1
10750
+ && r.sms_messages.length === 1
10751
+ && r.group_mms_conversations.length === 1
10752
+ && r.phone_calls.length === 1
10753
+ && r.ticket_thread_comments.length === 1
10754
+ && r.endusers.length === 1
10755
+ ) }
10756
+ )
10757
+
10758
+ await async_test(
10759
+ 'Non-admin cannot load inbox data without assignment',
10760
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ }),
10761
+ {
10762
+ onResult: r => (
10763
+ r.chat_rooms.length === 0
10764
+ && r.emails.length === 0
10765
+ && r.sms_messages.length === 0
10766
+ && r.group_mms_conversations.length === 0
10767
+ && r.phone_calls.length === 0
10768
+ && r.ticket_thread_comments.length === 0
10769
+ && r.endusers.length === 0
10770
+ )
10771
+ }
10772
+ )
10773
+
10774
+ await async_test(
10775
+ 'Non-admin cannot load inbox data without assignment (self as filter)',
10776
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10777
+ {
10778
+ onResult: r => (
10779
+ r.chat_rooms.length === 0
10780
+ && r.emails.length === 0
10781
+ && r.sms_messages.length === 0
10782
+ && r.group_mms_conversations.length === 0
10783
+ && r.phone_calls.length === 0
10784
+ && r.ticket_thread_comments.length === 0
10785
+ && r.endusers.length === 0
10786
+ )
10787
+ }
10788
+ )
10789
+
10790
+ await async_test(
10791
+ 'Non-admin cannot load inbox data without assignment (other user as filter)',
10792
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10793
+ {
10794
+ onResult: r => (
10795
+ r.chat_rooms.length === 0
10796
+ && r.emails.length === 0
10797
+ && r.sms_messages.length === 0
10798
+ && r.group_mms_conversations.length === 0
10799
+ && r.phone_calls.length === 0
10800
+ && r.ticket_thread_comments.length === 0
10801
+ && r.endusers.length === 0
10802
+ )
10803
+ }
10804
+ )
10805
+
10806
+ // assign to Enduser
10807
+ await sdk.api.endusers.updateOne(e.id, { assignedTo: [sdkNonAdmin.userInfo.id] }, { replaceObjectFields: true })
10808
+ await async_test(
10809
+ 'Non-admin can load inbox data with assignment',
10810
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ }),
10811
+ {
10812
+ onResult: r => (
10813
+ r.chat_rooms.length === 1
10814
+ && r.emails.length === 1
10815
+ && r.sms_messages.length === 1
10816
+ && r.group_mms_conversations.length === 1
10817
+ && r.phone_calls.length === 1
10818
+ && r.ticket_thread_comments.length === 1
10819
+ && r.endusers.length === 1
10820
+ )
10821
+ }
10822
+ )
10823
+ await async_test(
10824
+ 'Non-admin can load inbox data with assignment (self as filter)',
10825
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10826
+ {
10827
+ onResult: r => (
10828
+ r.chat_rooms.length === 1
10829
+ && r.emails.length === 1
10830
+ && r.sms_messages.length === 1
10831
+ && r.group_mms_conversations.length === 1
10832
+ && r.phone_calls.length === 1
10833
+ && r.ticket_thread_comments.length === 1
10834
+ && r.endusers.length === 1
10835
+ )
10836
+ }
10837
+ )
10838
+ await async_test(
10839
+ 'Non-admin can load inbox data with assignment (other user as filter, not assigned)',
10840
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10841
+ {
10842
+ onResult: r => (
10843
+ r.chat_rooms.length === 0
10844
+ && r.emails.length === 0
10845
+ && r.sms_messages.length === 0
10846
+ && r.group_mms_conversations.length === 0
10847
+ && r.phone_calls.length === 0
10848
+ && r.ticket_thread_comments.length === 0
10849
+ && r.endusers.length === 0
10850
+ )
10851
+ }
10852
+ )
10853
+ await sdk.api.endusers.updateOne(e.id, { assignedTo: [sdk.userInfo.id] }, { }) // add other assignment
10854
+ await async_test(
10855
+ 'Non-admin can load inbox data with assignment (other user as filter, assigned)',
10856
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10857
+ {
10858
+ onResult: r => (
10859
+ r.chat_rooms.length === 1
10860
+ && r.emails.length === 1
10861
+ && r.sms_messages.length === 1
10862
+ && r.group_mms_conversations.length === 1
10863
+ && r.phone_calls.length === 1
10864
+ && r.ticket_thread_comments.length === 1
10865
+ && r.endusers.length === 1
10866
+ )
10867
+ }
10868
+ )
10869
+
10870
+
10871
+ // assign admin to all threads
10872
+ await sdk.api.emails.updateOne(email.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10873
+ await sdk.api.sms_messages.updateOne(sms.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10874
+ await sdk.api.group_mms_conversations.updateOne(groupMMS.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10875
+ await sdk.api.phone_calls.updateOne(call.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10876
+ await sdk.api.ticket_threads.updateOne(thread.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10877
+ await sdk.api.ticket_thread_comments.updateOne(comment.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10878
+ await sdk.api.chat_rooms.updateOne(room.id, { assignedTo: [sdk.userInfo.id] }, { replaceObjectFields: true })
10879
+
10880
+ await async_test(
10881
+ 'admin doesnt load inbox data with assignedTo as other filter',
10882
+ () => sdk.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10883
+ {
10884
+ onResult: r => (
10885
+ r.chat_rooms.length === 0
10886
+ && r.emails.length === 0
10887
+ && r.sms_messages.length === 0
10888
+ && r.group_mms_conversations.length === 0
10889
+ && r.phone_calls.length === 0
10890
+ && r.ticket_thread_comments.length === 0
10891
+ && r.endusers.length === 0
10892
+ )
10893
+ }
10894
+ )
10895
+ await async_test(
10896
+ 'admin loads inbox data for other user as filter assignedTo',
10897
+ () => sdk.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10898
+ {
10899
+ onResult: r => (
10900
+ r.chat_rooms.length === 1
10901
+ && r.emails.length === 1
10902
+ && r.sms_messages.length === 1
10903
+ && r.group_mms_conversations.length === 1
10904
+ && r.phone_calls.length === 1
10905
+ && r.ticket_thread_comments.length === 1
10906
+ && r.endusers.length === 1
10907
+ )
10908
+ }
10909
+ )
10910
+ await async_test(
10911
+ 'admin loads inbox data with no user',
10912
+ () => sdk.api.endusers.load_inbox_data({ }),
10913
+ {
10914
+ onResult: r => (
10915
+ r.chat_rooms.length === 1
10916
+ && r.emails.length === 1
10917
+ && r.sms_messages.length === 1
10918
+ && r.group_mms_conversations.length === 1
10919
+ && r.phone_calls.length === 1
10920
+ && r.ticket_thread_comments.length === 1
10921
+ && r.endusers.length === 1
10922
+ )
10923
+ }
10924
+ )
10925
+
10926
+ await async_test(
10927
+ 'Non-admin cant load inbox data with assignedTo as other (self as filter)',
10928
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10929
+ {
10930
+ onResult: r => (
10931
+ r.chat_rooms.length === 0
10932
+ && r.emails.length === 0
10933
+ && r.sms_messages.length === 0
10934
+ && r.group_mms_conversations.length === 0
10935
+ && r.phone_calls.length === 0
10936
+ && r.ticket_thread_comments.length === 0
10937
+ && r.endusers.length === 0
10938
+ )
10939
+ }
10940
+ )
10941
+ await async_test(
10942
+ 'Non-admin can load inbox data for other user as filter, assignedTo',
10943
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10944
+ {
10945
+ onResult: r => (
10946
+ r.chat_rooms.length === 1
10947
+ && r.emails.length === 1
10948
+ && r.sms_messages.length === 1
10949
+ && r.group_mms_conversations.length === 1
10950
+ && r.phone_calls.length === 1
10951
+ && r.ticket_thread_comments.length === 1
10952
+ && r.endusers.length === 1
10953
+ )
10954
+ }
10955
+ )
10956
+ await async_test(
10957
+ 'Non-admin can load inbox data with no user',
10958
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ }),
10959
+ {
10960
+ onResult: r => (
10961
+ r.chat_rooms.length === 1
10962
+ && r.emails.length === 1
10963
+ && r.sms_messages.length === 1
10964
+ && r.group_mms_conversations.length === 1
10965
+ && r.phone_calls.length === 1
10966
+ && r.ticket_thread_comments.length === 1
10967
+ && r.endusers.length === 1
10968
+ )
10969
+ }
10970
+ )
10971
+
10972
+ // assign other user to all threads
10973
+ await sdk.api.emails.updateOne(email.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10974
+ await sdk.api.sms_messages.updateOne(sms.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10975
+ await sdk.api.group_mms_conversations.updateOne(groupMMS.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10976
+ await sdk.api.phone_calls.updateOne(call.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10977
+ await sdk.api.ticket_threads.updateOne(thread.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10978
+ await sdk.api.ticket_thread_comments.updateOne(comment.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10979
+ await sdk.api.chat_rooms.updateOne(room.id, { assignedTo: [sdkNonAdmin.userInfo.id] })
10980
+
10981
+ await async_test(
10982
+ '[both assigned] admin does load inbox data with assignedTo as other filter',
10983
+ () => sdk.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
10984
+ {
10985
+ onResult: r => (
10986
+ r.chat_rooms.length === 1
10987
+ && r.emails.length === 1
10988
+ && r.sms_messages.length === 1
10989
+ && r.group_mms_conversations.length === 1
10990
+ && r.phone_calls.length === 1
10991
+ && r.ticket_thread_comments.length === 1
10992
+ && r.endusers.length === 1
10993
+ )
10994
+ }
10995
+ )
10996
+ await async_test(
10997
+ '[both assigned] admin loads inbox data for other user as filter assignedTo',
10998
+ () => sdk.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
10999
+ {
11000
+ onResult: r => (
11001
+ r.chat_rooms.length === 1
11002
+ && r.emails.length === 1
11003
+ && r.sms_messages.length === 1
11004
+ && r.group_mms_conversations.length === 1
11005
+ && r.phone_calls.length === 1
11006
+ && r.ticket_thread_comments.length === 1
11007
+ && r.endusers.length === 1
11008
+ )
11009
+ }
11010
+ )
11011
+ await async_test(
11012
+ '[both assigned] admin loads inbox data with no user',
11013
+ () => sdk.api.endusers.load_inbox_data({ }),
11014
+ {
11015
+ onResult: r => (
11016
+ r.chat_rooms.length === 1
11017
+ && r.emails.length === 1
11018
+ && r.sms_messages.length === 1
11019
+ && r.group_mms_conversations.length === 1
11020
+ && r.phone_calls.length === 1
11021
+ && r.ticket_thread_comments.length === 1
11022
+ && r.endusers.length === 1
11023
+ )
11024
+ }
11025
+ )
11026
+
11027
+ await async_test(
11028
+ '[both assigned] Non-admin can load inbox data with assignedTo as other (self as filter)',
11029
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdkNonAdmin.userInfo.id }),
11030
+ {
11031
+ onResult: r => (
11032
+ r.chat_rooms.length === 1
11033
+ && r.emails.length === 1
11034
+ && r.sms_messages.length === 1
11035
+ && r.group_mms_conversations.length === 1
11036
+ && r.phone_calls.length === 1
11037
+ && r.ticket_thread_comments.length === 1
11038
+ && r.endusers.length === 1
11039
+ )
11040
+ }
11041
+ )
11042
+ await async_test(
11043
+ '[both assigned] Non-admin can load inbox data for other user as filter, assignedTo',
11044
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
11045
+ {
11046
+ onResult: r => (
11047
+ r.chat_rooms.length === 1
11048
+ && r.emails.length === 1
11049
+ && r.sms_messages.length === 1
11050
+ && r.group_mms_conversations.length === 1
11051
+ && r.phone_calls.length === 1
11052
+ && r.ticket_thread_comments.length === 1
11053
+ && r.endusers.length === 1
11054
+ )
11055
+ }
11056
+ )
11057
+ await async_test(
11058
+ '[both assigned] Non-admin can load inbox data with no user',
11059
+ () => sdkNonAdmin.api.endusers.load_inbox_data({ }),
11060
+ {
11061
+ onResult: r => (
11062
+ r.chat_rooms.length === 1
11063
+ && r.emails.length === 1
11064
+ && r.sms_messages.length === 1
11065
+ && r.group_mms_conversations.length === 1
11066
+ && r.phone_calls.length === 1
11067
+ && r.ticket_thread_comments.length === 1
11068
+ && r.endusers.length === 1
11069
+ )
11070
+ }
11071
+ )
11072
+
11073
+ const noAccessRole = await sdk.api.role_based_access_permissions.createOne({
11074
+ role: 'No Access',
11075
+ permissions: {
11076
+ emails: { read: null, create: null, update: null, delete: null },
11077
+ sms_messages: { read: null, create: null, update: null, delete: null },
11078
+ group_mms_conversations: { read: null, create: null, update: null, delete: null },
11079
+ phone_calls: { read: null, create: null, update: null, delete: null },
11080
+ ticket_threads: { read: null, create: null, update: null, delete: null },
11081
+ ticket_thread_comments: { read: null, create: null, update: null, delete: null },
11082
+ chat_rooms: { read: null, create: null, update: null, delete: null },
11083
+ // read must be default for endpoint to return non 403
11084
+ endusers: { read: 'Default', create: null, update: null, delete: null },
11085
+ },
11086
+ })
11087
+
11088
+ const roleTestUserEmail = 'inbox.role.test@tellescope.com'
11089
+ const roleTestUser = (
11090
+ await sdk.api.users.getOne({ email: roleTestUserEmail }).catch(() => null) // throws error on none found
11091
+ ) || (
11092
+ await sdk.api.users.createOne({ email: roleTestUserEmail })
11093
+ )
11094
+ // ensure role is set, in case GET returned a user without a role or with a different role
11095
+ await sdk.api.users.updateOne(roleTestUser.id, { roles: [noAccessRole.role] }, { replaceObjectFields: true })
11096
+
11097
+ // add to care team to ensure this doesn't grant unexpected access
11098
+ await sdk.api.endusers.updateOne(e.id, { assignedTo: [roleTestUser.id] })
11099
+ await wait(undefined, 2000) // role change triggers a logout
11100
+
11101
+ const sdkNoAccess = new Session({
11102
+ host,
11103
+ authToken: (await sdk.api.users.generate_auth_token({ id: roleTestUser.id })).authToken,
11104
+ })
11105
+ await async_test('test_authenticated (no access)', sdkNoAccess.test_authenticated, { expectedResult: 'Authenticated!' })
11106
+ await async_test('verify no-read on direct API call', sdkNoAccess.api.emails.getSome, handleAnyError) // ensures role is set up correctly
11107
+
11108
+ await async_test(
11109
+ "No access reads nothing",
11110
+ () => sdkNoAccess.api.endusers.load_inbox_data({ }),
11111
+ {
11112
+ onResult: r => (
11113
+ r.chat_rooms.length === 0
11114
+ && r.emails.length === 0
11115
+ && r.sms_messages.length === 0
11116
+ && r.group_mms_conversations.length === 0
11117
+ && r.phone_calls.length === 0
11118
+ && r.ticket_thread_comments.length === 0
11119
+ && r.endusers.length === 0
11120
+ )
11121
+ }
11122
+ )
11123
+ await async_test(
11124
+ "No access reads nothing (for self)",
11125
+ () => sdkNoAccess.api.endusers.load_inbox_data({ userId: roleTestUser.id }),
11126
+ {
11127
+ onResult: r => (
11128
+ r.chat_rooms.length === 0
11129
+ && r.emails.length === 0
11130
+ && r.sms_messages.length === 0
11131
+ && r.group_mms_conversations.length === 0
11132
+ && r.phone_calls.length === 0
11133
+ && r.ticket_thread_comments.length === 0
11134
+ && r.endusers.length === 0
11135
+ )
11136
+ }
11137
+ )
11138
+ await async_test(
11139
+ "No access reads nothing (for assigned admin)",
11140
+ () => sdkNoAccess.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
11141
+ {
11142
+ onResult: r => (
11143
+ r.chat_rooms.length === 0
11144
+ && r.emails.length === 0
11145
+ && r.sms_messages.length === 0
11146
+ && r.group_mms_conversations.length === 0
11147
+ && r.phone_calls.length === 0
11148
+ && r.ticket_thread_comments.length === 0
11149
+ && r.endusers.length === 0
11150
+ )
11151
+ }
11152
+ )
11153
+
11154
+ const defaultAccessRole = await sdk.api.role_based_access_permissions.createOne({
11155
+ role: 'Default Access',
11156
+ permissions: {
11157
+ emails: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11158
+ sms_messages: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11159
+ group_mms_conversations: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11160
+ phone_calls: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11161
+ ticket_threads: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11162
+ ticket_thread_comments: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11163
+ chat_rooms: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11164
+ endusers: { read: 'Default', create: 'Default', update: 'Default', delete: 'Default' },
11165
+ },
11166
+ })
11167
+ await sdk.api.users.updateOne(roleTestUser.id, { roles: [defaultAccessRole.role] }, { replaceObjectFields: true })
11168
+ await wait(undefined, 2000) // role change triggers a logout
11169
+ const sdkDefaultAccess = new Session({
11170
+ host,
11171
+ authToken: (await sdk.api.users.generate_auth_token({ id: roleTestUser.id })).authToken,
11172
+ })
11173
+
11174
+ await async_test('test_authenticated (default access)', sdkDefaultAccess.test_authenticated, { expectedResult: 'Authenticated!' })
11175
+
11176
+ await async_test(
11177
+ "Default access reads nothing",
11178
+ () => sdkDefaultAccess.api.endusers.load_inbox_data({ }),
11179
+ {
11180
+ onResult: r => (
11181
+ r.chat_rooms.length === 0
11182
+ && r.emails.length === 0
11183
+ && r.sms_messages.length === 0
11184
+ && r.group_mms_conversations.length === 0
11185
+ && r.phone_calls.length === 0
11186
+ && r.ticket_thread_comments.length === 0
11187
+ && r.endusers.length === 0
11188
+ )
11189
+ }
11190
+ )
11191
+ await async_test(
11192
+ "Default access reads nothing (for self)",
11193
+ () => sdkDefaultAccess.api.endusers.load_inbox_data({ userId: roleTestUser.id }),
11194
+ {
11195
+ onResult: r => (
11196
+ r.chat_rooms.length === 0
11197
+ && r.emails.length === 0
11198
+ && r.sms_messages.length === 0
11199
+ && r.group_mms_conversations.length === 0
11200
+ && r.phone_calls.length === 0
11201
+ && r.ticket_thread_comments.length === 0
11202
+ && r.endusers.length === 0
11203
+ )
11204
+ }
11205
+ )
11206
+ await async_test(
11207
+ "Default access reads nothing (for assigned admin)",
11208
+ () => sdkDefaultAccess.api.endusers.load_inbox_data({ userId: sdk.userInfo.id }),
11209
+ {
11210
+ onResult: r => (
11211
+ r.chat_rooms.length === 0
11212
+ && r.emails.length === 0
11213
+ && r.sms_messages.length === 0
11214
+ && r.group_mms_conversations.length === 0
11215
+ && r.phone_calls.length === 0
11216
+ && r.ticket_thread_comments.length === 0
11217
+ && r.endusers.length === 0
11218
+ )
11219
+ }
11220
+ )
11221
+
11222
+
11223
+ // assign default user to the specific messages by setting userId, userIds, etc.
11224
+ await sdk.api.emails.updateOne(email.id, { assignedTo: [], userId: roleTestUser.id }, { replaceObjectFields: true })
11225
+ await sdk.api.sms_messages.updateOne(sms.id, { assignedTo: [], userId: roleTestUser.id }, { replaceObjectFields: true })
11226
+ await sdk.api.group_mms_conversations.updateOne(groupMMS.id, { assignedTo: [], userIds: [roleTestUser.id] }, { replaceObjectFields: true })
11227
+ await sdk.api.phone_calls.updateOne(call.id, { assignedTo: [], userId: roleTestUser.id }, { replaceObjectFields: true })
11228
+ await sdk.api.ticket_thread_comments.updateOne(comment.id, {assignedTo: [], userId: roleTestUser.id }, { replaceObjectFields: true })
11229
+ // need to replace assignedTo for userIds to take precedent
11230
+ await sdk.api.chat_rooms.updateOne(room.id, { assignedTo: [], userIds: [roleTestUser.id] }, { replaceObjectFields: true})
11231
+
11232
+ await async_test(
11233
+ "Default access reads stuff when assigned",
11234
+ () => sdkDefaultAccess.api.endusers.load_inbox_data({ }),
11235
+ {
11236
+ onResult: r => (
11237
+ r.chat_rooms.length === 1
11238
+ && r.emails.length === 1
11239
+ && r.sms_messages.length === 1
11240
+ && r.group_mms_conversations.length === 1
11241
+ && r.phone_calls.length === 1
11242
+ && r.ticket_thread_comments.length === 1
11243
+ && r.endusers.length === 1
11244
+ )
11245
+ }
11246
+ )
11247
+ await async_test(
11248
+ "Default access reads stuff when assigned (for self)",
11249
+ () => sdkDefaultAccess.api.endusers.load_inbox_data({ userId: roleTestUser.id }),
11250
+ {
11251
+ onResult: r => (
11252
+ r.chat_rooms.length === 1
11253
+ && r.emails.length === 1
11254
+ && r.sms_messages.length === 1
11255
+ && r.group_mms_conversations.length === 1
11256
+ && r.phone_calls.length === 1
11257
+ && r.ticket_thread_comments.length === 1
11258
+ && r.endusers.length === 1
11259
+ )
11260
+ }
11261
+ )
11262
+
11263
+
11264
+ await Promise.all([
11265
+ sdk.api.endusers.deleteOne(e.id),
11266
+ sdk.api.chat_rooms.deleteOne(room.id),
11267
+ sdk.api.role_based_access_permissions.deleteOne(noAccessRole.id),
11268
+ sdk.api.role_based_access_permissions.deleteOne(defaultAccessRole.id),
11269
+ sdk.api.users.deleteOne(roleTestUser.id),
11270
+ ])
11271
+ }
11272
+
10570
11273
  (async () => {
10571
11274
  log_header("API")
10572
11275
 
@@ -10680,13 +11383,15 @@ const replace_enduser_template_values_tests = async () => {
10680
11383
  await replace_enduser_template_values_tests()
10681
11384
  await mfa_tests()
10682
11385
  await setup_tests()
11386
+ await formsort_tests()
11387
+ await inbox_loading_tests()
10683
11388
  await multi_tenant_tests() // should come right after setup tests
10684
11389
  await sync_tests_with_access_tags() // should come directly after setup to avoid extra sync values
10685
11390
  await sync_tests() // should come directly after setup to avoid extra sync values
11391
+ await get_templated_message_tests()
10686
11392
  await updatedAt_tests()
10687
11393
  await automation_trigger_tests()
10688
11394
  await file_source_tests()
10689
- await get_templated_message_tests()
10690
11395
  await enduser_access_tags_tests()
10691
11396
  await enduserAccessTests()
10692
11397
  await test_form_response_search()
@@ -10698,7 +11403,6 @@ const replace_enduser_template_values_tests = async () => {
10698
11403
  await calendar_event_care_team_tests()
10699
11404
  await merge_enduser_tests()
10700
11405
  await input_modifier_tests()
10701
- await formsort_tests()
10702
11406
  await switch_to_related_contacts_tests()
10703
11407
  await redaction_tests()
10704
11408
  await self_serve_appointment_booking_tests()