@tellescope/sdk 1.136.1 → 1.138.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.
@@ -11,6 +11,7 @@ import {
11
11
  Ticket,
12
12
  VitalConfiguration,
13
13
  EnduserObservation,
14
+ FormResponse,
14
15
  } from "@tellescope/types-client"
15
16
  import {
16
17
  CompoundFilter,
@@ -6345,6 +6346,165 @@ export const formsort_tests = async () => {
6345
6346
  await async_test(`Email with name match`, sdk.api.form_responses.getSome, { onResult: r => r.length === 5 })
6346
6347
  await async_test(`Email with name match`, sdk.api.endusers.getSome, { onResult: r => r.length === 3 })
6347
6348
 
6349
+ const answersEmail = "formsortanswers@tellescope.com"
6350
+ const address = {
6351
+ address_1: 'Address 1',
6352
+ address_2: 'Address 2',
6353
+ city: 'City',
6354
+ state: 'State',
6355
+ postal_code: 'ZIP',
6356
+ }
6357
+ const answers = [
6358
+ { key: 'email', value: answersEmail },
6359
+ { key: 'phone', value: "+15555555555" },
6360
+ { key: 'fname', value: 'Fname' },
6361
+ { key: 'lname', value: 'Lname' },
6362
+ { key: 'gender', value: 'Male' },
6363
+ { key: 'defaultFromEmail', value: 'from@tellescope.com' },
6364
+ { key: 'useDefaultFromEmailInAutomations', value: true },
6365
+ { key: 'defaultFromPhone', value: '+15555555555' },
6366
+ { key: 'useDefaultFromPhoneInAutomations', value: true },
6367
+ { key: 'language', value: 'Spanish' },
6368
+ { key: 'timezone', value: 'US/Eastern' },
6369
+ { key: 'healthie_dietitian_id', value: 'test_id' },
6370
+ { key: 'height', value: 10 },
6371
+ { key: 'weight', value: 20 },
6372
+ { key: 'address', value: address },
6373
+ { key: 'dateOfBirth', value: '2000-12-20' },
6374
+ { key: 'insurance.payerId', value: 'insurance 1' },
6375
+ { key: 'insuranceSecondary.payerId', value: 'insurance 2' },
6376
+ { key: 'ts_enduser_custom', value: 'Custom' },
6377
+ { key: 'ts_enduser_custom2', value: 'Custom 2' },
6378
+ { key: 'multiple_choice', value: ['multiple choice'] },
6379
+ ]
6380
+ await sdk.api.endusers.createOne({ email: answersEmail })
6381
+ await postToFormsort({
6382
+ answers,
6383
+ responder_uuid: "6",
6384
+ finalized: false,
6385
+ matchByName: false,
6386
+ })
6387
+ let submissionEnduser = await sdk.api.endusers.getOne({ email: answersEmail })
6388
+
6389
+ const validateResponse = (fr: FormResponse, key: string, value: any): boolean => {
6390
+ const answer = fr.responses.find(r => r.externalId === key)?.answer?.value
6391
+
6392
+ if (typeof value === 'object') {
6393
+ return objects_equivalent(answer, value)
6394
+ }
6395
+
6396
+ return answer === value
6397
+ }
6398
+ // EXISTING ENDUSER FIELDS ARE CURRENTLY ONLY UPDATED ON SUBMISSION
6399
+ await async_test(
6400
+ `Answers and fields (unfinalized)`,
6401
+ () => sdk.api.form_responses.getOne({ externalId: '6' }),
6402
+ {
6403
+ onResult: r => {
6404
+ if (!r) { return false }
6405
+ if (r.submittedAt) { return false }
6406
+ if (!r.formsort?.length) { return false }
6407
+ if (!r.responses.length) { return false }
6408
+ if (r.responses.length !== answers.length) { return false }
6409
+
6410
+ if (!validateResponse(r, 'address', JSON.stringify(address, null, 2))) { return false }
6411
+ if (!validateResponse(r, 'email', answersEmail)) { return false }
6412
+ if (!validateResponse(r, 'phone', "+15555555555")) { return false }
6413
+ if (!validateResponse(r, 'fname', "Fname")) { return false }
6414
+ if (!validateResponse(r, 'lname', "Lname")) { return false }
6415
+ if (!validateResponse(r, 'gender', "Male")) { return false }
6416
+ if (!validateResponse(r, 'defaultFromEmail', "from@tellescope.com")) { return false }
6417
+ if (!validateResponse(r, 'useDefaultFromEmailInAutomations', "true")) { return false }
6418
+ if (!validateResponse(r, 'defaultFromPhone', "+15555555555")) { return false }
6419
+ if (!validateResponse(r, 'useDefaultFromPhoneInAutomations', "true")) { return false }
6420
+ if (!validateResponse(r, 'language', "Spanish")) { return false }
6421
+ if (!validateResponse(r, 'timezone', "US/Eastern")) { return false }
6422
+ if (!validateResponse(r, 'healthie_dietitian_id', "test_id")) { return false }
6423
+ if (!validateResponse(r, 'height', "10")) { return false }
6424
+ if (!validateResponse(r, 'weight', "20")) { return false }
6425
+ if (!validateResponse(r, 'dateOfBirth', "2000-12-20")) { return false }
6426
+ if (!validateResponse(r, 'insurance.payerId', "insurance 1")) { return false }
6427
+ if (!validateResponse(r, 'insuranceSecondary.payerId', "insurance 2")) { return false }
6428
+ if (!validateResponse(r, 'ts_enduser_custom', "Custom")) { return false }
6429
+ if (!validateResponse(r, 'ts_enduser_custom2', "Custom 2")) { return false }
6430
+ if (!validateResponse(r, 'multiple_choice', ['multiple choice'])) { return false }
6431
+
6432
+ return true
6433
+ }
6434
+ }
6435
+ )
6436
+
6437
+ await postToFormsort({
6438
+ answers,
6439
+ responder_uuid: "6",
6440
+ finalized: true,
6441
+ matchByName: false,
6442
+ })
6443
+ submissionEnduser = await sdk.api.endusers.getOne({ email: answersEmail })
6444
+ // EXISTING ENDUSER FIELDS ARE CURRENTLY ONLY UPDATED ON SUBMISSION
6445
+ await async_test(
6446
+ `Answers and fields (finalized)`,
6447
+ () => sdk.api.form_responses.getOne({ externalId: '6' }),
6448
+ {
6449
+ onResult: r => {
6450
+ if (!r) { return false }
6451
+ if (!r.submittedAt) { return false }
6452
+ if (!r.formsort?.length) { return false }
6453
+ if (!r.responses.length) { return false }
6454
+ if (r.responses.length !== answers.length) { return false }
6455
+
6456
+ if (!validateResponse(r, 'address', JSON.stringify(address, null, 2))) { return false }
6457
+ if (!validateResponse(r, 'email', answersEmail)) { return false }
6458
+ if (!validateResponse(r, 'phone', "+15555555555")) { return false }
6459
+ if (!validateResponse(r, 'fname', "Fname")) { return false }
6460
+ if (!validateResponse(r, 'lname', "Lname")) { return false }
6461
+ if (!validateResponse(r, 'gender', "Male")) { return false }
6462
+ if (!validateResponse(r, 'defaultFromEmail', "from@tellescope.com")) { return false }
6463
+ if (!validateResponse(r, 'useDefaultFromEmailInAutomations', "true")) { return false }
6464
+ if (!validateResponse(r, 'defaultFromPhone', "+15555555555")) { return false }
6465
+ if (!validateResponse(r, 'useDefaultFromPhoneInAutomations', "true")) { return false }
6466
+ if (!validateResponse(r, 'language', "Spanish")) { return false }
6467
+ if (!validateResponse(r, 'timezone', "US/Eastern")) { return false }
6468
+ if (!validateResponse(r, 'healthie_dietitian_id', "test_id")) { return false }
6469
+ if (!validateResponse(r, 'height', "10")) { return false }
6470
+ if (!validateResponse(r, 'weight', "20")) { return false }
6471
+ if (!validateResponse(r, 'dateOfBirth', "2000-12-20")) { return false }
6472
+ if (!validateResponse(r, 'insurance.payerId', "insurance 1")) { return false }
6473
+ if (!validateResponse(r, 'insuranceSecondary.payerId', "insurance 2")) { return false }
6474
+ if (!validateResponse(r, 'ts_enduser_custom', "Custom")) { return false }
6475
+ if (!validateResponse(r, 'ts_enduser_custom2', "Custom 2")) { return false }
6476
+ if (!validateResponse(r, 'multiple_choice', ['multiple choice'])) { return false }
6477
+
6478
+ if (submissionEnduser.email !== answersEmail) { return false }
6479
+ if (submissionEnduser.fname !== 'Fname') { return false }
6480
+ if (submissionEnduser.lname !== 'Lname') { return false }
6481
+ if (submissionEnduser.gender !== 'Male') { return false }
6482
+ if (submissionEnduser.phone !== '+15555555555') { return false }
6483
+ if (submissionEnduser.defaultFromEmail !== 'from@tellescope.com') { return false }
6484
+ if (submissionEnduser.useDefaultFromEmailInAutomations !== true) { return false }
6485
+ if (submissionEnduser.defaultFromPhone !== '+15555555555') { return false }
6486
+ if (submissionEnduser.useDefaultFromPhoneInAutomations !== true) { return false }
6487
+ if (submissionEnduser.language?.displayName !== "Spanish") { return false }
6488
+ if (submissionEnduser.timezone !== "US/Eastern") { return false }
6489
+ if (submissionEnduser.healthie_dietitian_id !== "test_id") { return false }
6490
+ if (submissionEnduser.height?.value !== 10) { return false }
6491
+ if (submissionEnduser.weight?.value !== 20) { return false }
6492
+ if (submissionEnduser.addressLineOne !== 'Address 1') { return false }
6493
+ if (submissionEnduser.addressLineTwo !== 'Address 2') { return false }
6494
+ if (submissionEnduser.city !== 'City') { return false }
6495
+ if (submissionEnduser.state !== 'State') { return false }
6496
+ if (submissionEnduser.zipCode !== 'ZIP') { return false }
6497
+ if (submissionEnduser.dateOfBirth !== '12-20-2000') { return false }
6498
+ if (submissionEnduser.insurance?.payerId !== 'insurance 1') { return false }
6499
+ if (submissionEnduser.insuranceSecondary?.payerId !== 'insurance 2') { return false }
6500
+ if (submissionEnduser.fields?.custom !== 'Custom') { return false }
6501
+ if (submissionEnduser.fields?.custom2 !== 'Custom 2') { return false }
6502
+
6503
+ return true
6504
+ }
6505
+ }
6506
+ )
6507
+
6348
6508
  // cleanup
6349
6509
  const endusers = await sdk.api.endusers.getSome()
6350
6510
  const formResponses = await sdk.api.form_responses.getSome()
@@ -6357,6 +6517,7 @@ export const formsort_tests = async () => {
6357
6517
 
6358
6518
  const NO_TEST = () => {}
6359
6519
  const tests: { [K in keyof ClientModelForName]: () => void } = {
6520
+ call_hold_queues: NO_TEST,
6360
6521
  fax_logs: NO_TEST,
6361
6522
  form_groups: NO_TEST,
6362
6523
  webhook_logs: NO_TEST,
@@ -8666,6 +8827,44 @@ const uniqueness_tests = async () => {
8666
8827
  ])
8667
8828
  }
8668
8829
 
8830
+ const input_modifier_tests = async () => {
8831
+ log_header("Input Modifiers")
8832
+ const e = await sdk.api.endusers.createOne({})
8833
+
8834
+ await async_test(
8835
+ "Regular string",
8836
+ () => sdk.api.form_responses.createOne({
8837
+ enduserId: e.id,
8838
+ formId: PLACEHOLDER_ID,
8839
+ formTitle: "input modifiers",
8840
+ responses: [{
8841
+ fieldTitle: '',
8842
+ fieldId: '',
8843
+ answer: { type: 'string', value: 'hello' }
8844
+ }]
8845
+ }),
8846
+ { onResult: r => r.responses[0].answer.value === 'hello' }
8847
+ )
8848
+ await async_test(
8849
+ "Number coerce to string",
8850
+ () => sdk.api.form_responses.createOne({
8851
+ enduserId: e.id,
8852
+ formId: PLACEHOLDER_ID,
8853
+ formTitle: "input modifiers",
8854
+ responses: [{
8855
+ fieldTitle: '',
8856
+ fieldId: '',
8857
+ answer: { type: 'string', value: 55 as any }
8858
+ }]
8859
+ }),
8860
+ { onResult: r => r.responses[0].answer.value === '55' }
8861
+ )
8862
+
8863
+ await Promise.all([
8864
+ sdk.api.endusers.deleteOne(e.id),
8865
+ ])
8866
+ }
8867
+
8669
8868
  (async () => {
8670
8869
  log_header("API")
8671
8870
 
@@ -8780,6 +8979,7 @@ const uniqueness_tests = async () => {
8780
8979
  await setup_tests()
8781
8980
  await multi_tenant_tests() // should come right after setup tests
8782
8981
  await sync_tests() // should come directly after setup to avoid extra sync values
8982
+ await input_modifier_tests()
8783
8983
  await formsort_tests()
8784
8984
  await switch_to_related_contacts_tests()
8785
8985
  await uniqueness_tests()
Binary file