@tellescope/sdk 0.0.31 → 0.0.35

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.
@@ -1,11 +1,12 @@
1
1
  require('source-map-support').install();
2
- import * as fs from "fs"
2
+ import crypto from "crypto"
3
3
  import * as buffer from "buffer" // only node >=15.7.0
4
4
 
5
5
  import {
6
6
  Enduser,
7
7
  ClientModelForName,
8
8
  ClientModelForName_required,
9
+ UserDisplayInfo,
9
10
  } from "@tellescope/types-client"
10
11
  import {
11
12
  Model as ClientModel,
@@ -105,6 +106,16 @@ const setup_tests = async () => {
105
106
  await sdk.authenticate(email, password)
106
107
  await async_test('test_authenticated (re-authenticated)', sdk.test_authenticated, { expectedResult: 'Authenticated!' })
107
108
 
109
+ const uInfo = sdk.userInfo
110
+ const originalAuthToken = sdk.authToken
111
+ await sdk.refresh_session()
112
+ assert(uInfo.id === sdk.userInfo.id, 'userInfo mismatch', 'userInfo id preserved after refresh')
113
+ assert(
114
+ !!originalAuthToken && !!sdk.authToken && sdk.authToken !== originalAuthToken,
115
+ 'same authToken after refresh',
116
+ 'authToken refresh'
117
+ )
118
+
108
119
  await async_test('reset_db', () => sdk.reset_db(), passOnVoid)
109
120
  }
110
121
 
@@ -839,13 +850,61 @@ const chat_room_tests = async () => {
839
850
  const sdk2 = new Session({ host })
840
851
  await sdk2.authenticate(email2, password2)
841
852
 
842
- const room = await sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId] })
853
+ const email='enduser@tellescope.com', password='enduserPassword!';
854
+ const enduser = await sdk.api.endusers.createOne({ email })
855
+ await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
856
+ await enduserSDK.authenticate(email, password).catch(console.error)
857
+
858
+ const room = await sdk.api.chat_rooms.createOne({ type: 'internal', userIds: [userId], enduserIds: [enduserSDK.userInfo.id] })
843
859
  await async_test(
844
860
  `get-chat-room (not a user)`,
845
861
  () => sdk2.api.chat_rooms.getOne(room.id),
846
862
  { shouldError: true, onError: e => e.message === "Could not find a record for the given id" }
847
863
  )
848
- await sdk.api.chat_rooms.deleteOne(room.id)
864
+ await async_test(
865
+ `user_display_info for room (not a user)`,
866
+ () => sdk2.api.chat_rooms.display_info({ id: room.id }),
867
+ { shouldError: true, onError: e => e.message === "Could not find a record for the given id" }
868
+ )
869
+
870
+ const verifyRoomDisplayInfo = (info: Indexable<UserDisplayInfo>) => {
871
+ if (!info) return false
872
+ if (typeof info !== 'object') return false
873
+ if (Object.keys(info).length !== 2) return false
874
+ if (!info[sdk.userInfo.id]) return false
875
+ if (!info[enduserSDK.userInfo.id]) return false
876
+ const [user, enduser] = [info[sdk.userInfo.id], info[enduserSDK.userInfo.id]]
877
+ if (!(
878
+ user.id === sdk.userInfo.id &&
879
+ user.fname === sdk.userInfo.fname &&
880
+ user.lname === sdk.userInfo.lname &&
881
+ user.avatar === sdk.userInfo.avatar &&
882
+ !!user.createdAt &&
883
+ !!user.lastActive &&
884
+ !!user.lastLogout
885
+ )) return false
886
+ if (!(
887
+ enduser.id === enduserSDK.userInfo.id &&
888
+ enduser.fname === enduserSDK.userInfo.fname &&
889
+ enduser.lname === enduserSDK.userInfo.lname &&
890
+ enduser.avatar === enduserSDK.userInfo.avatar &&
891
+ !!enduser.createdAt &&
892
+ !!enduser.lastActive &&
893
+ !!enduser.lastLogout
894
+ )) return false
895
+ return true
896
+ }
897
+ await async_test(
898
+ `user_display_info for room (for user)`,
899
+ () => sdk.api.chat_rooms.display_info({ id: room.id }),
900
+ { onResult: r => r.id === room.id && verifyRoomDisplayInfo(r.display_info) }
901
+ )
902
+ await async_test(
903
+ `user_display_info for room (for enduser)`,
904
+ () => enduserSDK.api.chat_rooms.display_info({ id: room.id }),
905
+ { onResult: r => r.id === room.id && verifyRoomDisplayInfo(r.display_info) }
906
+ )
907
+ await sdk.api.chat_rooms.deleteOne(room.id)
849
908
 
850
909
 
851
910
  const emptyRoom = await sdk.api.chat_rooms.createOne({ })
@@ -870,6 +929,8 @@ const chat_room_tests = async () => {
870
929
  { onResult: r => r.id === emptyRoom.id }
871
930
  )
872
931
  await sdk.api.chat_rooms.deleteOne(emptyRoom.id)
932
+
933
+ await sdk.api.endusers.deleteOne(enduser.id)
873
934
  }
874
935
 
875
936
  const chat_tests = async() => {
@@ -980,6 +1041,18 @@ const enduserAccessTests = async () => {
980
1041
  await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
981
1042
  await enduserSDK.authenticate(email, password).catch(console.error)
982
1043
 
1044
+ await wait(undefined, 1000) // wait so that refresh_session generates a new authToken (different timestamp)
1045
+
1046
+ const uInfo = enduserSDK.userInfo
1047
+ const originalAuthToken = enduserSDK.authToken
1048
+ await enduserSDK.refresh_session()
1049
+ assert(uInfo.id === enduserSDK.userInfo.id, 'userInfo mismatch', 'userInfo id preserved after refresh')
1050
+ assert(
1051
+ !!originalAuthToken && !!enduserSDK.authToken && enduserSDK.authToken !== originalAuthToken,
1052
+ 'same authToken after refresh',
1053
+ 'authToken refresh'
1054
+ )
1055
+
983
1056
  await async_test(
984
1057
  `no-enduser-access for different businessId`,
985
1058
  () => enduserSDKDifferentBusinessId.authenticate(email, password),
@@ -991,6 +1064,7 @@ const enduserAccessTests = async () => {
991
1064
  const model = schema[n as keyof typeof schema]
992
1065
  if (n === 'webhooks') continue // no default endpoints implemented
993
1066
 
1067
+ //@ts-ignore
994
1068
  if (!model?.enduserActions?.read && (model.defaultActions.read || model.customActions.read)) {
995
1069
  await async_test(
996
1070
  `no-enduser-access getOne (${endpoint})`,
@@ -998,6 +1072,7 @@ const enduserAccessTests = async () => {
998
1072
  { shouldError: true, onError: (e: any) => e === 'Unauthenticated' || e?.message === 'This action is not allowed' }
999
1073
  )
1000
1074
  }
1075
+ //@ts-ignore
1001
1076
  if (!model.enduserActions?.readMany && (model.defaultActions.readMany || model.customActions.readMany)) {
1002
1077
  await async_test(
1003
1078
  `no-enduser-access getSome (${endpoint})`,
@@ -1005,6 +1080,7 @@ const enduserAccessTests = async () => {
1005
1080
  { shouldError: true, onError: (e: any) => e === 'Unauthenticated' || e?.message === 'This action is not allowed' }
1006
1081
  )
1007
1082
  }
1083
+ //@ts-ignore
1008
1084
  if (!model.enduserActions?.create && (model.defaultActions.create || model.customActions.create)) {
1009
1085
  await async_test(
1010
1086
  `no-enduser-access createOne (${endpoint})`,
@@ -1012,6 +1088,7 @@ const enduserAccessTests = async () => {
1012
1088
  { shouldError: true, onError: (e: any) => e === 'Unauthenticated' || e?.message === 'This action is not allowed' }
1013
1089
  )
1014
1090
  }
1091
+ //@ts-ignore
1015
1092
  if (!model.enduserActions?.createMany && (model.defaultActions.createMany || model.customActions.createMany)) {
1016
1093
  await async_test(
1017
1094
  `no-enduser-access createMany (${endpoint})`,
@@ -1019,6 +1096,7 @@ const enduserAccessTests = async () => {
1019
1096
  { shouldError: true, onError: (e: any) => e === 'Unauthenticated' || e?.message === 'This action is not allowed' }
1020
1097
  )
1021
1098
  }
1099
+ //@ts-ignore
1022
1100
  if (!model.enduserActions?.update && (model.defaultActions.update || model.customActions.update)) {
1023
1101
  await async_test(
1024
1102
  `no-enduser-access update (${endpoint})`,
@@ -1026,6 +1104,7 @@ const enduserAccessTests = async () => {
1026
1104
  { shouldError: true, onError: (e: any) => e === 'Unauthenticated' || e?.message === 'This action is not allowed' }
1027
1105
  )
1028
1106
  }
1107
+ //@ts-ignore
1029
1108
  if (!model.enduserActions?.delete && (model.defaultActions.delete || model.customActions.delete)) {
1030
1109
  await async_test(
1031
1110
  `no-enduser-access delete (${endpoint})`,
@@ -1076,6 +1155,10 @@ const enduserAccessTests = async () => {
1076
1155
  }
1077
1156
 
1078
1157
  const files_tests = async () => {
1158
+ const enduser = await sdk.api.endusers.createOne({ email })
1159
+ await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
1160
+ await enduserSDK.authenticate(email, password).catch(console.error)
1161
+
1079
1162
  const buff = buffer.Buffer.from('test file data')
1080
1163
 
1081
1164
  const { presignedUpload, file } = await sdk.api.files.prepare_file_upload({
@@ -1090,6 +1173,11 @@ const files_tests = async () => {
1090
1173
 
1091
1174
  const { downloadURL: cachedURL } = await sdk.api.files.file_download_URL({ secureName: file.secureName })
1092
1175
  assert(downloadURL === cachedURL, 'cache download url failed', 'download url cache')
1176
+
1177
+ const { downloadURL: urlForEnduser } = await enduserSDK.api.files.file_download_URL({ secureName: file.secureName })
1178
+ assert(downloadURL === urlForEnduser, 'failed to get download url for enduser', 'download url for enduser')
1179
+
1180
+ await sdk.api.endusers.deleteOne(enduser.id)
1093
1181
  }
1094
1182
 
1095
1183
  const enduser_session_tests = async () => {
@@ -1108,12 +1196,20 @@ const enduser_session_tests = async () => {
1108
1196
 
1109
1197
  const users_tests = async () => {
1110
1198
  log_header("Users Tests")
1199
+ const randomFieldValue = crypto.randomBytes(32).toString('hex').toUpperCase() // uppercase so name parsing doesn't cause case change
1200
+ const randomFieldNumber = Math.random()
1201
+
1111
1202
  /* Update user tests */
1112
1203
  await async_test(
1113
1204
  `update user (non-admin, other user)`,
1114
- () => sdkNonAdmin.api.users.updateOne(sdk.userInfo.id, { fname: 'Failure' }),
1205
+ () => sdkNonAdmin.api.users.updateOne(sdk.userInfo.id, { fname: randomFieldValue }),
1115
1206
  { shouldError: true, onError: e => e.message === "Only admin users can update others' profiles" }
1116
1207
  )
1208
+ await async_test(
1209
+ `verify no update`,
1210
+ () => sdk.api.users.getOne(sdk.userInfo.id),
1211
+ { onResult: u => u.fname !== randomFieldValue }
1212
+ )
1117
1213
  await async_test(
1118
1214
  `update user (non-admin, self)`,
1119
1215
  () => sdkNonAdmin.api.users.updateOne(sdkNonAdmin.userInfo.id, { fname: 'Updated' }),
@@ -1142,6 +1238,18 @@ const users_tests = async () => {
1142
1238
  { onResult: u => u.id === sdkNonAdmin.userInfo.id && u.fname === "Non" }
1143
1239
  )
1144
1240
 
1241
+ await async_test(
1242
+ `update user (custom fields)`,
1243
+ () => sdk.api.users.updateOne(sdk.userInfo.id, { fields: { f1: randomFieldValue, f2: randomFieldNumber, f3: { object: randomFieldValue } } }), // change back
1244
+ { onResult: u => u.id === sdk.userInfo.id && u.fields?.f1 === randomFieldValue && u.fields?.f2 === randomFieldNumber && (u.fields?.f3 as any).object == randomFieldValue }
1245
+ )
1246
+ // sdkNonAdmin.userInfo.fname = 'Non' // update back in sdk instance as well
1247
+
1248
+ await async_test(
1249
+ `verify user update (custom fields)`,
1250
+ () => sdk.api.users.getOne(sdk.userInfo.id),
1251
+ { onResult: u => u.id === sdk.userInfo.id && u.fields?.f1 === randomFieldValue && u.fields?.f2 === randomFieldNumber && (u.fields?.f3 as any).object == randomFieldValue }
1252
+ )
1145
1253
  }
1146
1254
 
1147
1255
  const tests: { [K in keyof ClientModelForName]: () => void } = {
@@ -1189,7 +1297,7 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
1189
1297
 
1190
1298
  let n: keyof typeof schema;
1191
1299
  for (n in schema) {
1192
- const returnValidation = schema[n].customActions?.create?.returns
1300
+ const returnValidation = (schema[n].customActions as any)?.create?.returns
1193
1301
 
1194
1302
  await run_generated_tests({
1195
1303
  queries: sdk.api[n] as any,