@tellescope/sdk 1.4.0 → 1.4.3

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.
@@ -21,10 +21,11 @@ import {
21
21
  } from "@tellescope/types-utilities"
22
22
 
23
23
  import {
24
- fieldsToValidation,
25
- mongoIdValidator,
24
+ fieldsToValidationOld,
26
25
 
27
26
  InputValidation,
27
+ InputValidationOld,
28
+ mongoIdStringRequired,
28
29
  } from "@tellescope/validation"
29
30
 
30
31
  import { Session, APIQuery, EnduserSession } from "../sdk"
@@ -470,9 +471,9 @@ const verify_missing_defaults = async <N extends ModelName>({ queries, model, na
470
471
  // }
471
472
  // const isMongoId = validator_to_boolean(mongoIdValidator())
472
473
 
473
- type DefaultValidation = InputValidation<{ _default: boolean, id: string }>
474
+ type DefaultValidation = InputValidationOld<{ _default: boolean, id: string }>
474
475
  const validateReturnType = <N extends ModelName, T=ClientModelForName[N]>(fs: ModelFields<T> | undefined, r: T, d: DefaultValidation) => {
475
- const validation = fieldsToValidation(fs ?? {} as Indexable)
476
+ const validation = fieldsToValidationOld(fs ?? {} as Indexable)
476
477
 
477
478
  try {
478
479
  for (const f in r) {
@@ -508,7 +509,7 @@ const run_generated_tests = async <N extends ModelName>({ queries, model, name,
508
509
 
509
510
  // only validate id for general objects, for now
510
511
  const defaultValidation: DefaultValidation = {
511
- id: mongoIdValidator(), _default: (x: any) => x
512
+ id: mongoIdStringRequired.validate(), _default: x => x,
512
513
  }
513
514
 
514
515
 
@@ -822,22 +823,23 @@ const journey_tests = async (queries=sdk.api.journeys) => {
822
823
  { onResult: j => objects_equivalent(j.states, [{ name: 'First', priority: "N/A" }, { name: 'Added', priority: "N/A" }])}
823
824
  )
824
825
 
825
- await async_test(
826
- `journey-updateState`,
827
- () => queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' }}),
828
- passOnVoid,
829
- )
830
- await wait(undefined, 25) // wait for side effects to update endusers
831
- await async_test(
832
- `journey-updateState verify propagation to enduser 1`,
833
- () => sdk.api.endusers.getOne(e1.id),
834
- { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated' })},
835
- )
836
- await async_test(
837
- `journey-updateState verify propagation to enduser 2`,
838
- () => sdk.api.endusers.getOne(e2.id),
839
- { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated', [journey2.id]: 'New' })},
840
- )
826
+ // removed
827
+ // await async_test(
828
+ // `journey-updateState`,
829
+ // () => queries.update_state({ id: journey.id, name: 'Added', updates: { name: 'Updated', priority: 'N/A' }}),
830
+ // passOnVoid,
831
+ // )
832
+ // await wait(undefined, 25) // wait for side effects to update endusers
833
+ // await async_test(
834
+ // `journey-updateState verify propagation to enduser 1`,
835
+ // () => sdk.api.endusers.getOne(e1.id),
836
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated' })},
837
+ // )
838
+ // await async_test(
839
+ // `journey-updateState verify propagation to enduser 2`,
840
+ // () => sdk.api.endusers.getOne(e2.id),
841
+ // { onResult: e => objects_equivalent(e.journeys, { [journey.id]: 'Updated', [journey2.id]: 'New' })},
842
+ // )
841
843
 
842
844
 
843
845
  await queries.deleteOne(journey.id)
@@ -1319,6 +1321,7 @@ const enduserAccessTests = async () => {
1319
1321
  }
1320
1322
 
1321
1323
  const files_tests = async () => {
1324
+ log_header("Files")
1322
1325
  const enduser = await sdk.api.endusers.createOne({ email })
1323
1326
  await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
1324
1327
  await enduserSDK.authenticate(email, password).catch(console.error)
@@ -1334,11 +1337,16 @@ const files_tests = async () => {
1334
1337
  )
1335
1338
 
1336
1339
  const { presignedUpload, file } = await sdk.api.files.prepare_file_upload({
1337
- name: 'Test File', size: buff.byteLength, type: 'text/plain'
1340
+ name: 'Test Private', size: buff.byteLength, type: 'text/plain', enduserId: enduser.id,
1341
+ })
1342
+
1343
+ const { presignedUpload: presignedNonEnduser, file: fileNonEnduser } = await sdk.api.files.prepare_file_upload({
1344
+ name: 'Test Private (no enduser)', size: buff.byteLength, type: 'text/plain',
1338
1345
  })
1339
1346
 
1340
- const { presignedUpload: presigned2, file: publicFile } = await sdk.api.files.prepare_file_upload({
1341
- name: 'Test File', size: buff.byteLength, type: 'text/plain',
1347
+ const { presignedUpload: presigned2 } = await sdk.api.files.prepare_file_upload({
1348
+ name: 'Test Public', size: buff.byteLength, type: 'text/plain',
1349
+ enduserId: enduser.id,
1342
1350
  publicRead: true,
1343
1351
  publicName: 'public',
1344
1352
  })
@@ -1348,12 +1356,23 @@ const files_tests = async () => {
1348
1356
  presignedUpload,
1349
1357
  buff
1350
1358
  )
1359
+ await sdk.UPLOAD(
1360
+ // @ts-ignore
1361
+ presignedNonEnduser,
1362
+ buff
1363
+ )
1351
1364
  await sdk.UPLOAD(
1352
1365
  // @ts-ignore
1353
1366
  presigned2,
1354
1367
  buff
1355
1368
  )
1356
1369
 
1370
+ await async_test(
1371
+ `Files associated with enduser on prepare_file_upload`,
1372
+ () => sdkNonAdmin.api.files.getSome({ filter: { enduserId: enduser.id } }),
1373
+ { onResult: fs => fs.length === 2 }
1374
+ )
1375
+
1357
1376
  const { downloadURL } = await sdk.api.files.file_download_URL({ secureName: file.secureName })
1358
1377
  const downloaded: string = await sdk.DOWNLOAD(downloadURL)
1359
1378
 
@@ -1367,8 +1386,23 @@ const files_tests = async () => {
1367
1386
 
1368
1387
  await Promise.all([
1369
1388
  sdk.api.endusers.deleteOne(enduser.id),
1370
- sdk.api.files.deleteOne(file.id),
1371
- sdk.api.files.deleteOne(publicFile.id),
1389
+ ])
1390
+
1391
+ await wait(undefined, 1250) // wait for files to be deleted as side effect
1392
+ await async_test(
1393
+ `Files cleaned up as side effect of deleting enduser`,
1394
+ () => sdkNonAdmin.api.files.getSome({ filter: { enduserId: enduser.id } }),
1395
+ { onResult: fs => fs.length === 0 }
1396
+ )
1397
+ await async_test(
1398
+ `Non-enduser file is left`,
1399
+ () => sdkNonAdmin.api.files.getSome(),
1400
+ { onResult: fs => fs.length > 0 }
1401
+ )
1402
+
1403
+ // cleanup other file
1404
+ await Promise.all([
1405
+ sdk.api.files.deleteOne(fileNonEnduser.id),
1372
1406
  ])
1373
1407
  }
1374
1408
 
@@ -2948,7 +2982,7 @@ export const self_serve_appointment_booking_tests = async () => {
2948
2982
  await sdk.api.users.updateOne(sdk.userInfo.id, {
2949
2983
  weeklyAvailabilities: [
2950
2984
  {
2951
- dayOfWeekStartingSundayIndexedByZero: 0,
2985
+ dayOfWeekStartingSundayIndexedByZero: 0, // sunday
2952
2986
  startTimeInMinutes: 60 * 12, // noon,
2953
2987
  endTimeInMinutes: 60 * 13, // 1pm,
2954
2988
  },
@@ -2962,7 +2996,7 @@ export const self_serve_appointment_booking_tests = async () => {
2962
2996
  await sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, {
2963
2997
  weeklyAvailabilities: [
2964
2998
  {
2965
- dayOfWeekStartingSundayIndexedByZero: 0,
2999
+ dayOfWeekStartingSundayIndexedByZero: 0, // sunday
2966
3000
  startTimeInMinutes: 60 * 12, // noon,
2967
3001
  endTimeInMinutes: 60 * 13, // 1pm,
2968
3002
  },
@@ -2991,7 +3025,21 @@ export const self_serve_appointment_booking_tests = async () => {
2991
3025
  from: new Date(),
2992
3026
  restrictedByState: false,
2993
3027
  }),
2994
- { onResult: r => r.availabilityBlocks.length === 4 }, // 2 providers with 1 hour availability for 30 minute meetings
3028
+ { onResult: r => {
3029
+ if (r.availabilityBlocks.length !== 4) return false // 2 providers with 1 hour availability for 30 minute meetings
3030
+
3031
+ const user1block1_ET = r.availabilityBlocks.find(b => b.userId === sdk.userInfo.id)
3032
+ const user2block1_PT = r.availabilityBlocks.find(b => b.userId === sdkNonAdmin.userInfo.id)
3033
+
3034
+ if (!(user1block1_ET && user2block1_PT)) return false // should be slots for both users
3035
+
3036
+ if (user2block1_PT.startTimeInMS - user1block1_ET.startTimeInMS !== 1000 * 60 * 60 * 3) {
3037
+ console.log(user1block1_ET.startTimeInMS, user2block1_PT.startTimeInMS, user1block1_ET.startTimeInMS - user2block1_PT.startTimeInMS)
3038
+ return false // difference should be three hours, since same availability in different timezones
3039
+ }
3040
+
3041
+ return true
3042
+ }},
2995
3043
  )
2996
3044
 
2997
3045
  const nySlots = await enduserSDK.api.calendar_events.get_appointment_availability({
@@ -3062,9 +3110,11 @@ export const self_serve_appointment_booking_tests = async () => {
3062
3110
 
3063
3111
  const NO_TEST = () => {}
3064
3112
  const tests: { [K in keyof ClientModelForName]: () => void } = {
3113
+ chat_rooms: chat_room_tests,
3114
+ automation_steps: automation_events_tests,
3115
+ files: files_tests,
3065
3116
  enduser_tasks: NO_TEST,
3066
3117
  care_plans: NO_TEST,
3067
- automation_steps: automation_events_tests,
3068
3118
  portal_customizations: NO_TEST,
3069
3119
  calendar_event_templates: NO_TEST,
3070
3120
  databases: databases_tests,
@@ -3079,10 +3129,8 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
3079
3129
  tasks: tasks_tests,
3080
3130
  emails: email_tests,
3081
3131
  sms_messages: sms_tests,
3082
- chat_rooms: chat_room_tests,
3083
3132
  users: users_tests,
3084
3133
  templates: NO_TEST,
3085
- files: files_tests,
3086
3134
  tickets: NO_TEST,
3087
3135
  meetings: meetings_tests,
3088
3136
  notes: NO_TEST,