@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.
- package/lib/cjs/enduser.d.ts +6 -1
- package/lib/cjs/enduser.d.ts.map +1 -1
- package/lib/cjs/enduser.js +4 -1
- package/lib/cjs/enduser.js.map +1 -1
- package/lib/cjs/sdk.d.ts +8 -3
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +3 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/session.d.ts.map +1 -1
- package/lib/cjs/session.js +1 -2
- package/lib/cjs/session.js.map +1 -1
- package/lib/cjs/tests/tests.js +152 -45
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/enduser.d.ts +7 -1
- package/lib/esm/enduser.d.ts.map +1 -1
- package/lib/esm/enduser.js +4 -1
- package/lib/esm/enduser.js.map +1 -1
- package/lib/esm/sdk.d.ts +8 -3
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +3 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/session.d.ts +1 -0
- package/lib/esm/session.d.ts.map +1 -1
- package/lib/esm/session.js +1 -2
- package/lib/esm/session.js.map +1 -1
- package/lib/esm/tests/tests.js +149 -45
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/enduser.ts +8 -1
- package/src/sdk.ts +11 -1
- package/src/session.ts +1 -2
- package/src/tests/tests.ts +113 -5
package/src/tests/tests.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
require('source-map-support').install();
|
|
2
|
-
import
|
|
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
|
|
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
|
|
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:
|
|
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,
|