@tellescope/sdk 1.255.13 → 1.255.15
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/sdk.d.ts +1 -0
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +1 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.d.ts +14 -0
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js +172 -0
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/formsort_header_auth.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/formsort_header_auth.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/formsort_header_auth.test.js +221 -0
- package/lib/cjs/tests/api_tests/formsort_header_auth.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js +179 -0
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.js +237 -0
- package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/send_message_model.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/send_message_model.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +148 -132
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/sdk.d.ts +1 -0
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +1 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.d.ts +14 -0
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.js +168 -0
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.js.map +1 -0
- package/lib/esm/tests/api_tests/formsort_header_auth.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/formsort_header_auth.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/formsort_header_auth.test.js +214 -0
- package/lib/esm/tests/api_tests/formsort_header_auth.test.js.map +1 -0
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js +175 -0
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -0
- package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.js +233 -0
- package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.js.map +1 -0
- package/lib/esm/tests/api_tests/send_message_model.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/send_message_model.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +148 -132
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/sdk.ts +4 -0
- package/src/tests/api_tests/calendar_event_references_update.test.ts +108 -0
- package/src/tests/api_tests/formsort_header_auth.test.ts +179 -0
- package/src/tests/api_tests/phone_calls_cold_transfer.test.ts +113 -0
- package/src/tests/api_tests/phone_tree_enduser_condition.test.ts +174 -0
- package/src/tests/tests.ts +8 -0
- package/test_generated.pdf +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
require('source-map-support').install();
|
|
38
|
+
import { Session, EnduserSession } from "../../sdk";
|
|
39
|
+
import { async_test, log_header, } from "@tellescope/testing";
|
|
40
|
+
import { setup_tests, authenticate_enduser_via_token } from "../setup";
|
|
41
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
42
|
+
var businessId = '60398b1131a295e64f084ff6';
|
|
43
|
+
/**
|
|
44
|
+
* CU-86e2dvrn9: calendar_events.references switched from updatesDisabled to
|
|
45
|
+
* enduserUpdatesDisabled (schema.ts), mirroring the Enduser references behavior:
|
|
46
|
+
* - staff / API-key sessions may update references (e.g. to set or clear
|
|
47
|
+
* external appointment IDs like stale Elation references)
|
|
48
|
+
* - enduser (patient) sessions remain blocked — required because endusers DO
|
|
49
|
+
* have update access on calendar_events they attend (for cancelling)
|
|
50
|
+
*/
|
|
51
|
+
export var calendar_event_references_update_tests = function (_a) {
|
|
52
|
+
var sdk = _a.sdk;
|
|
53
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
54
|
+
var enduserId, eventId, enduser, event_1, enduserSDK_1, staffReferences_1, _b, _c;
|
|
55
|
+
return __generator(this, function (_d) {
|
|
56
|
+
switch (_d.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
log_header("Calendar Event References Update (enduserUpdatesDisabled)");
|
|
59
|
+
_d.label = 1;
|
|
60
|
+
case 1:
|
|
61
|
+
_d.trys.push([1, , 10, 19]);
|
|
62
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({
|
|
63
|
+
email: "references-update-".concat(Date.now(), "@example.com"),
|
|
64
|
+
fname: 'References',
|
|
65
|
+
lname: 'UpdateTest',
|
|
66
|
+
})];
|
|
67
|
+
case 2:
|
|
68
|
+
enduser = _d.sent();
|
|
69
|
+
enduserId = enduser.id;
|
|
70
|
+
return [4 /*yield*/, sdk.api.calendar_events.createOne({
|
|
71
|
+
title: "References Update Test Event",
|
|
72
|
+
durationInMinutes: 30,
|
|
73
|
+
startTimeInMS: Date.now(),
|
|
74
|
+
attendees: [{ id: enduser.id, type: 'enduser' }],
|
|
75
|
+
})];
|
|
76
|
+
case 3:
|
|
77
|
+
event_1 = _d.sent();
|
|
78
|
+
eventId = event_1.id;
|
|
79
|
+
enduserSDK_1 = new EnduserSession({ host: host, businessId: businessId });
|
|
80
|
+
return [4 /*yield*/, authenticate_enduser_via_token(sdk, enduserSDK_1, { id: enduser.id })
|
|
81
|
+
// ---- Staff/API session can update references ----
|
|
82
|
+
];
|
|
83
|
+
case 4:
|
|
84
|
+
_d.sent();
|
|
85
|
+
staffReferences_1 = [{ type: 'Elation', id: 'elation-appointment-123' }];
|
|
86
|
+
return [4 /*yield*/, async_test('staff can update calendar_events.references', function () { return sdk.api.calendar_events.updateOne(event_1.id, { references: staffReferences_1 }); }, { onResult: function (e) { var _a; return ((_a = e.references) === null || _a === void 0 ? void 0 : _a.length) === 1 && e.references[0].type === 'Elation' && e.references[0].id === 'elation-appointment-123'; } })];
|
|
87
|
+
case 5:
|
|
88
|
+
_d.sent();
|
|
89
|
+
return [4 /*yield*/, async_test('staff references update persisted', function () { return sdk.api.calendar_events.getOne(event_1.id); }, { onResult: function (e) { var _a; return ((_a = e.references) === null || _a === void 0 ? void 0 : _a.length) === 1 && e.references[0].type === 'Elation' && e.references[0].id === 'elation-appointment-123'; } })
|
|
90
|
+
// ---- Enduser session (attendee with update access) is still blocked on references ----
|
|
91
|
+
];
|
|
92
|
+
case 6:
|
|
93
|
+
_d.sent();
|
|
94
|
+
// ---- Enduser session (attendee with update access) is still blocked on references ----
|
|
95
|
+
return [4 /*yield*/, async_test('enduser cannot update calendar_events.references', function () { return enduserSDK_1.api.calendar_events.updateOne(event_1.id, { references: [{ type: 'Attacker', id: 'attacker-reference' }] }); }, { shouldError: true, onError: function (e) { return e.message === "references cannot be updated by endusers"; } })];
|
|
96
|
+
case 7:
|
|
97
|
+
// ---- Enduser session (attendee with update access) is still blocked on references ----
|
|
98
|
+
_d.sent();
|
|
99
|
+
return [4 /*yield*/, async_test('rejected enduser references update did not persist', function () { return sdk.api.calendar_events.getOne(event_1.id); }, { onResult: function (e) { var _a; return ((_a = e.references) === null || _a === void 0 ? void 0 : _a.length) === 1 && e.references[0].type === 'Elation' && e.references[0].id === 'elation-appointment-123'; } })
|
|
100
|
+
// ---- Positive control: the guard is field-scoped — enduser can still cancel the event ----
|
|
101
|
+
];
|
|
102
|
+
case 8:
|
|
103
|
+
_d.sent();
|
|
104
|
+
// ---- Positive control: the guard is field-scoped — enduser can still cancel the event ----
|
|
105
|
+
return [4 /*yield*/, async_test('enduser can still perform allowed update (cancelledAt)', function () { return enduserSDK_1.api.calendar_events.updateOne(event_1.id, { cancelledAt: new Date() }); }, { onResult: function (e) { return !!e.cancelledAt; } })];
|
|
106
|
+
case 9:
|
|
107
|
+
// ---- Positive control: the guard is field-scoped — enduser can still cancel the event ----
|
|
108
|
+
_d.sent();
|
|
109
|
+
return [3 /*break*/, 19];
|
|
110
|
+
case 10:
|
|
111
|
+
if (!eventId) return [3 /*break*/, 14];
|
|
112
|
+
_d.label = 11;
|
|
113
|
+
case 11:
|
|
114
|
+
_d.trys.push([11, 13, , 14]);
|
|
115
|
+
return [4 /*yield*/, sdk.api.calendar_events.deleteOne(eventId)];
|
|
116
|
+
case 12:
|
|
117
|
+
_d.sent();
|
|
118
|
+
return [3 /*break*/, 14];
|
|
119
|
+
case 13:
|
|
120
|
+
_b = _d.sent();
|
|
121
|
+
return [3 /*break*/, 14];
|
|
122
|
+
case 14:
|
|
123
|
+
if (!enduserId) return [3 /*break*/, 18];
|
|
124
|
+
_d.label = 15;
|
|
125
|
+
case 15:
|
|
126
|
+
_d.trys.push([15, 17, , 18]);
|
|
127
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserId)];
|
|
128
|
+
case 16:
|
|
129
|
+
_d.sent();
|
|
130
|
+
return [3 /*break*/, 18];
|
|
131
|
+
case 17:
|
|
132
|
+
_c = _d.sent();
|
|
133
|
+
return [3 /*break*/, 18];
|
|
134
|
+
case 18: return [7 /*endfinally*/];
|
|
135
|
+
case 19: return [2 /*return*/];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
// Allow running this test file independently
|
|
141
|
+
if (require.main === module) {
|
|
142
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
143
|
+
var sdk_1 = new Session({ host: host });
|
|
144
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
145
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
146
|
+
return __generator(this, function (_a) {
|
|
147
|
+
switch (_a.label) {
|
|
148
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
149
|
+
case 1:
|
|
150
|
+
_a.sent();
|
|
151
|
+
return [4 /*yield*/, calendar_event_references_update_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
152
|
+
case 2:
|
|
153
|
+
_a.sent();
|
|
154
|
+
return [2 /*return*/];
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}); };
|
|
158
|
+
runTests()
|
|
159
|
+
.then(function () {
|
|
160
|
+
console.log("✅ Calendar event references update test suite completed successfully");
|
|
161
|
+
process.exit(0);
|
|
162
|
+
})
|
|
163
|
+
.catch(function (error) {
|
|
164
|
+
console.error("❌ Calendar event references update test suite failed:", error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=calendar_event_references_update.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar_event_references_update.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/calendar_event_references_update.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formsort_header_auth.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/formsort_header_auth.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,eAAO,MAAM,0BAA0B;SAAwC,OAAO;iBAAe,OAAO;mBA6I3G,CAAA"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
require('source-map-support').install();
|
|
38
|
+
import axios from "axios";
|
|
39
|
+
import { Session } from "../../sdk";
|
|
40
|
+
import { log_header, async_test, assert } from "@tellescope/testing";
|
|
41
|
+
import { setup_tests } from "../setup";
|
|
42
|
+
var host = process.env.API_URL || "http://localhost:8080";
|
|
43
|
+
// same seeded test API key used by formsort_tests (tests.ts)
|
|
44
|
+
var TEST_API_KEY = "9d4f9dff00f60df2690a16da2cb848f289b447614ad9bef850e54af09a1fbf7a";
|
|
45
|
+
// seeded second-tenant key (sdkOther in tests.ts) — valid, but for a different organization
|
|
46
|
+
var OTHER_TENANT_API_KEY = "ba745e25162bb95a795c5fa1af70df188d93c4d3aac9c48b34a5c8c9dd7b80f7";
|
|
47
|
+
var TEST_EMAIL = "formsort-header-auth@tellescope.com";
|
|
48
|
+
export var formsort_header_auth_tests = function (_a) {
|
|
49
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
50
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
51
|
+
var form, buildUrl, bodyFor, formResponseIds, headerAuthResult_1, pathAuthResult, bearerFallthroughResult, aliasResult, emptyValueResult, singleTokenResult, _i, formResponseIds_1, id, err_1, enduser, err_2, err_3;
|
|
52
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
53
|
+
return __generator(this, function (_q) {
|
|
54
|
+
switch (_q.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
log_header("FormSort Header Auth Tests");
|
|
57
|
+
return [4 /*yield*/, sdk.api.forms.createOne({ title: "FormSort Header Auth" })];
|
|
58
|
+
case 1:
|
|
59
|
+
form = _q.sent();
|
|
60
|
+
buildUrl = function (route, pathSegment) {
|
|
61
|
+
var url = new URL("".concat(host, "/v1/webhooks/").concat(route, "/").concat(pathSegment));
|
|
62
|
+
url.searchParams.set('formId', form.id);
|
|
63
|
+
url.searchParams.set('returnJSON', 'true');
|
|
64
|
+
return url.toString();
|
|
65
|
+
};
|
|
66
|
+
bodyFor = function (responder_uuid) { return ({
|
|
67
|
+
answers: [{ key: 'email', value: TEST_EMAIL }],
|
|
68
|
+
responder_uuid: responder_uuid,
|
|
69
|
+
finalized: true,
|
|
70
|
+
}); };
|
|
71
|
+
formResponseIds = [];
|
|
72
|
+
_q.label = 2;
|
|
73
|
+
case 2:
|
|
74
|
+
_q.trys.push([2, , 13, 27]);
|
|
75
|
+
return [4 /*yield*/, axios.post(buildUrl('formsort', 'key-in-header'), bodyFor("fha-1"), { headers: { Authorization: "API_KEY ".concat(TEST_API_KEY) } })];
|
|
76
|
+
case 3:
|
|
77
|
+
headerAuthResult_1 = _q.sent();
|
|
78
|
+
assert(headerAuthResult_1.status === 200 && !!((_b = headerAuthResult_1.data) === null || _b === void 0 ? void 0 : _b.formResponseId) && !!((_c = headerAuthResult_1.data) === null || _c === void 0 ? void 0 : _c.enduserId), "Header auth failed: ".concat(headerAuthResult_1.status, " ").concat(JSON.stringify(headerAuthResult_1.data)), "Valid API_KEY header authenticates");
|
|
79
|
+
if ((_d = headerAuthResult_1.data) === null || _d === void 0 ? void 0 : _d.formResponseId)
|
|
80
|
+
formResponseIds.push(headerAuthResult_1.data.formResponseId);
|
|
81
|
+
return [4 /*yield*/, async_test("Form response created via header auth is retrievable", function () { return sdk.api.form_responses.getOne(headerAuthResult_1.data.formResponseId); }, { onResult: function (fr) { return fr.formId === form.id && fr.source === 'Formsort' && !!fr.submittedAt; } })
|
|
82
|
+
// 2. Invalid key in header rejected, even with a valid key in the path (header takes precedence)
|
|
83
|
+
];
|
|
84
|
+
case 4:
|
|
85
|
+
_q.sent();
|
|
86
|
+
// 2. Invalid key in header rejected, even with a valid key in the path (header takes precedence)
|
|
87
|
+
return [4 /*yield*/, async_test("Invalid API_KEY header rejected despite valid key in path", function () { return axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-2"), { headers: { Authorization: "API_KEY not-a-real-key" } }); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })
|
|
88
|
+
// 3. Back-compat: valid key in path, no Authorization header
|
|
89
|
+
];
|
|
90
|
+
case 5:
|
|
91
|
+
// 2. Invalid key in header rejected, even with a valid key in the path (header takes precedence)
|
|
92
|
+
_q.sent();
|
|
93
|
+
return [4 /*yield*/, axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-3"))];
|
|
94
|
+
case 6:
|
|
95
|
+
pathAuthResult = _q.sent();
|
|
96
|
+
assert(pathAuthResult.status === 200 && !!((_e = pathAuthResult.data) === null || _e === void 0 ? void 0 : _e.formResponseId), "Path auth failed: ".concat(pathAuthResult.status, " ").concat(JSON.stringify(pathAuthResult.data)), "Path-segment API key still authenticates (no header)");
|
|
97
|
+
if ((_f = pathAuthResult.data) === null || _f === void 0 ? void 0 : _f.formResponseId)
|
|
98
|
+
formResponseIds.push(pathAuthResult.data.formResponseId);
|
|
99
|
+
return [4 /*yield*/, axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-4"), { headers: { Authorization: 'Bearer unrelated-token' } })];
|
|
100
|
+
case 7:
|
|
101
|
+
bearerFallthroughResult = _q.sent();
|
|
102
|
+
assert(bearerFallthroughResult.status === 200 && !!((_g = bearerFallthroughResult.data) === null || _g === void 0 ? void 0 : _g.formResponseId), "Bearer fallthrough failed: ".concat(bearerFallthroughResult.status, " ").concat(JSON.stringify(bearerFallthroughResult.data)), "Non-API_KEY Authorization scheme falls through to path key");
|
|
103
|
+
if ((_h = bearerFallthroughResult.data) === null || _h === void 0 ? void 0 : _h.formResponseId)
|
|
104
|
+
formResponseIds.push(bearerFallthroughResult.data.formResponseId);
|
|
105
|
+
// 5. No valid key in header or path
|
|
106
|
+
return [4 /*yield*/, async_test("No valid key anywhere rejected", function () { return axios.post(buildUrl('formsort', 'not-a-real-key'), bodyFor("fha-5")); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })
|
|
107
|
+
// 6. Alias route accepts header auth too
|
|
108
|
+
];
|
|
109
|
+
case 8:
|
|
110
|
+
// 5. No valid key in header or path
|
|
111
|
+
_q.sent();
|
|
112
|
+
return [4 /*yield*/, axios.post(buildUrl('form-ingestion', 'key-in-header'), bodyFor("fha-6"), { headers: { Authorization: "API_KEY ".concat(TEST_API_KEY) } })];
|
|
113
|
+
case 9:
|
|
114
|
+
aliasResult = _q.sent();
|
|
115
|
+
assert(aliasResult.status === 200 && !!((_j = aliasResult.data) === null || _j === void 0 ? void 0 : _j.formResponseId), "form-ingestion header auth failed: ".concat(aliasResult.status, " ").concat(JSON.stringify(aliasResult.data)), "form-ingestion alias accepts API_KEY header");
|
|
116
|
+
if ((_k = aliasResult.data) === null || _k === void 0 ? void 0 : _k.formResponseId)
|
|
117
|
+
formResponseIds.push(aliasResult.data.formResponseId);
|
|
118
|
+
return [4 /*yield*/, axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-7"), { headers: { Authorization: 'API_KEY' } })];
|
|
119
|
+
case 10:
|
|
120
|
+
emptyValueResult = _q.sent();
|
|
121
|
+
assert(emptyValueResult.status === 200 && !!((_l = emptyValueResult.data) === null || _l === void 0 ? void 0 : _l.formResponseId), "Empty-value header fallthrough failed: ".concat(emptyValueResult.status, " ").concat(JSON.stringify(emptyValueResult.data)), "API_KEY scheme without value falls through to path key");
|
|
122
|
+
if ((_m = emptyValueResult.data) === null || _m === void 0 ? void 0 : _m.formResponseId)
|
|
123
|
+
formResponseIds.push(emptyValueResult.data.formResponseId);
|
|
124
|
+
return [4 /*yield*/, axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-8"), { headers: { Authorization: 'some-opaque-token' } })];
|
|
125
|
+
case 11:
|
|
126
|
+
singleTokenResult = _q.sent();
|
|
127
|
+
assert(singleTokenResult.status === 200 && !!((_o = singleTokenResult.data) === null || _o === void 0 ? void 0 : _o.formResponseId), "Single-token header fallthrough failed: ".concat(singleTokenResult.status, " ").concat(JSON.stringify(singleTokenResult.data)), "Schemeless Authorization header falls through to path key");
|
|
128
|
+
if ((_p = singleTokenResult.data) === null || _p === void 0 ? void 0 : _p.formResponseId)
|
|
129
|
+
formResponseIds.push(singleTokenResult.data.formResponseId);
|
|
130
|
+
// 9. When header and path both hold VALID keys, the header key's organization scopes the request:
|
|
131
|
+
// the formId belongs to the primary tenant, so an other-tenant header key must fail form lookup (400),
|
|
132
|
+
// proving the path key's org is not used
|
|
133
|
+
return [4 /*yield*/, async_test("Valid other-tenant header key overrides valid path key (org scoping)", function () { return axios.post(buildUrl('formsort', TEST_API_KEY), bodyFor("fha-9"), { headers: { Authorization: "API_KEY ".concat(OTHER_TENANT_API_KEY) } }); }, { shouldError: true, onError: function (e) { var _a, _b; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 400 && ((_b = e.response) === null || _b === void 0 ? void 0 : _b.data) === 'formId Invalid'; } })];
|
|
134
|
+
case 12:
|
|
135
|
+
// 9. When header and path both hold VALID keys, the header key's organization scopes the request:
|
|
136
|
+
// the formId belongs to the primary tenant, so an other-tenant header key must fail form lookup (400),
|
|
137
|
+
// proving the path key's org is not used
|
|
138
|
+
_q.sent();
|
|
139
|
+
return [3 /*break*/, 27];
|
|
140
|
+
case 13:
|
|
141
|
+
_i = 0, formResponseIds_1 = formResponseIds;
|
|
142
|
+
_q.label = 14;
|
|
143
|
+
case 14:
|
|
144
|
+
if (!(_i < formResponseIds_1.length)) return [3 /*break*/, 19];
|
|
145
|
+
id = formResponseIds_1[_i];
|
|
146
|
+
_q.label = 15;
|
|
147
|
+
case 15:
|
|
148
|
+
_q.trys.push([15, 17, , 18]);
|
|
149
|
+
return [4 /*yield*/, sdk.api.form_responses.deleteOne(id)];
|
|
150
|
+
case 16:
|
|
151
|
+
_q.sent();
|
|
152
|
+
return [3 /*break*/, 18];
|
|
153
|
+
case 17:
|
|
154
|
+
err_1 = _q.sent();
|
|
155
|
+
return [3 /*break*/, 18];
|
|
156
|
+
case 18:
|
|
157
|
+
_i++;
|
|
158
|
+
return [3 /*break*/, 14];
|
|
159
|
+
case 19:
|
|
160
|
+
_q.trys.push([19, 22, , 23]);
|
|
161
|
+
return [4 /*yield*/, sdk.api.endusers.getOne({ email: TEST_EMAIL })];
|
|
162
|
+
case 20:
|
|
163
|
+
enduser = _q.sent();
|
|
164
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
|
|
165
|
+
case 21:
|
|
166
|
+
_q.sent();
|
|
167
|
+
return [3 /*break*/, 23];
|
|
168
|
+
case 22:
|
|
169
|
+
err_2 = _q.sent();
|
|
170
|
+
return [3 /*break*/, 23];
|
|
171
|
+
case 23:
|
|
172
|
+
_q.trys.push([23, 25, , 26]);
|
|
173
|
+
return [4 /*yield*/, sdk.api.forms.deleteOne(form.id)];
|
|
174
|
+
case 24:
|
|
175
|
+
_q.sent();
|
|
176
|
+
return [3 /*break*/, 26];
|
|
177
|
+
case 25:
|
|
178
|
+
err_3 = _q.sent();
|
|
179
|
+
return [3 /*break*/, 26];
|
|
180
|
+
case 26: return [7 /*endfinally*/];
|
|
181
|
+
case 27: return [2 /*return*/];
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
// Allow running this test file independently
|
|
187
|
+
if (require.main === module) {
|
|
188
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
189
|
+
var sdk_1 = new Session({ host: host });
|
|
190
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
191
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
192
|
+
return __generator(this, function (_a) {
|
|
193
|
+
switch (_a.label) {
|
|
194
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
195
|
+
case 1:
|
|
196
|
+
_a.sent();
|
|
197
|
+
return [4 /*yield*/, formsort_header_auth_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
198
|
+
case 2:
|
|
199
|
+
_a.sent();
|
|
200
|
+
return [2 /*return*/];
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}); };
|
|
204
|
+
runTests()
|
|
205
|
+
.then(function () {
|
|
206
|
+
console.log("✅ FormSort header auth tests completed successfully");
|
|
207
|
+
process.exit(0);
|
|
208
|
+
})
|
|
209
|
+
.catch(function (error) {
|
|
210
|
+
console.error("❌ FormSort header auth tests failed:", error);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=formsort_header_auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formsort_header_auth.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/formsort_header_auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone_calls_cold_transfer.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/phone_calls_cold_transfer.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,eAAO,MAAM,+BAA+B;SAAwC,OAAO;iBAAe,OAAO;mBA0EhH,CAAA"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
38
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
39
|
+
if (ar || !(i in from)) {
|
|
40
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
41
|
+
ar[i] = from[i];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
45
|
+
};
|
|
46
|
+
require('source-map-support').install();
|
|
47
|
+
import { Session } from "../../sdk";
|
|
48
|
+
import { async_test, handleAnyError, log_header, } from "@tellescope/testing";
|
|
49
|
+
import { setup_tests } from "../setup";
|
|
50
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
51
|
+
var NONEXISTENT_MONGO_ID = '60398b1131a295e64f084fff';
|
|
52
|
+
// Validation-path tests for the cold transfer endpoint. All assertions below hit
|
|
53
|
+
// validations that run before any Twilio access, so no Twilio config is needed.
|
|
54
|
+
export var phone_calls_cold_transfer_tests = function (_a) {
|
|
55
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
56
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
57
|
+
var enduser, targetUsers, inboundCall_1, outboundCall_1, disabledTargetUser_1;
|
|
58
|
+
return __generator(this, function (_b) {
|
|
59
|
+
switch (_b.label) {
|
|
60
|
+
case 0:
|
|
61
|
+
log_header("Phone Calls Cold Transfer Tests");
|
|
62
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'Cold', lname: 'Transfer' })];
|
|
63
|
+
case 1:
|
|
64
|
+
enduser = _b.sent();
|
|
65
|
+
targetUsers = [];
|
|
66
|
+
_b.label = 2;
|
|
67
|
+
case 2:
|
|
68
|
+
_b.trys.push([2, , 12, 14]);
|
|
69
|
+
return [4 /*yield*/, sdk.api.phone_calls.createOne({
|
|
70
|
+
enduserId: enduser.id,
|
|
71
|
+
inbound: true,
|
|
72
|
+
externalId: 'CAcoldtransfertestinbound000000001',
|
|
73
|
+
from: '+15550001111',
|
|
74
|
+
to: '+15550002222',
|
|
75
|
+
userId: sdk.userInfo.id,
|
|
76
|
+
})];
|
|
77
|
+
case 3:
|
|
78
|
+
inboundCall_1 = _b.sent();
|
|
79
|
+
return [4 /*yield*/, sdk.api.phone_calls.createOne({
|
|
80
|
+
enduserId: enduser.id,
|
|
81
|
+
inbound: false,
|
|
82
|
+
externalId: 'CAcoldtransfertestoutbound00000001',
|
|
83
|
+
from: '+15550002222',
|
|
84
|
+
to: '+15550001111',
|
|
85
|
+
userId: sdk.userInfo.id,
|
|
86
|
+
})
|
|
87
|
+
// throwaway target users (never modify existing users' roles)
|
|
88
|
+
];
|
|
89
|
+
case 4:
|
|
90
|
+
outboundCall_1 = _b.sent();
|
|
91
|
+
return [4 /*yield*/, sdk.api.users.createOne({
|
|
92
|
+
email: 'cold.transfer.disabled@tellescope.com',
|
|
93
|
+
verifiedEmail: true,
|
|
94
|
+
notificationEmailsDisabled: true,
|
|
95
|
+
disableIncomingPhoneCalls: true,
|
|
96
|
+
})];
|
|
97
|
+
case 5:
|
|
98
|
+
disabledTargetUser_1 = _b.sent();
|
|
99
|
+
targetUsers.push(disabledTargetUser_1);
|
|
100
|
+
return [4 /*yield*/, async_test("cold_transfer: cannot transfer to yourself", function () { return sdk.api.phone_calls.cold_transfer({ callSid: inboundCall_1.externalId, targetUserId: sdk.userInfo.id }); }, { shouldError: true, onError: function (e) { return e.message === "Cannot transfer a call to yourself"; } })];
|
|
101
|
+
case 6:
|
|
102
|
+
_b.sent();
|
|
103
|
+
return [4 /*yield*/, async_test("cold_transfer: bogus callSid rejected", function () { return sdk.api.phone_calls.cold_transfer({ callSid: 'CAdoesnotexist0000000000000000000', targetUserId: disabledTargetUser_1.id }); }, { shouldError: true, onError: function (e) { return e.message === "Call not found"; } })];
|
|
104
|
+
case 7:
|
|
105
|
+
_b.sent();
|
|
106
|
+
return [4 /*yield*/, async_test("cold_transfer: outbound calls rejected", function () { return sdk.api.phone_calls.cold_transfer({ callSid: outboundCall_1.externalId, targetUserId: disabledTargetUser_1.id }); }, { shouldError: true, onError: function (e) { return e.message === "Only inbound calls can be transferred"; } })
|
|
107
|
+
// conferenceId is not settable via the public API (only set internally by conference webhooks),
|
|
108
|
+
// so the "Conference calls cannot be transferred" branch is covered by manual E2E testing only
|
|
109
|
+
];
|
|
110
|
+
case 8:
|
|
111
|
+
_b.sent();
|
|
112
|
+
// conferenceId is not settable via the public API (only set internally by conference webhooks),
|
|
113
|
+
// so the "Conference calls cannot be transferred" branch is covered by manual E2E testing only
|
|
114
|
+
return [4 /*yield*/, async_test("cold_transfer: nonexistent target user rejected", function () { return sdk.api.phone_calls.cold_transfer({ callSid: inboundCall_1.externalId, targetUserId: NONEXISTENT_MONGO_ID }); }, { shouldError: true, onError: function (e) { return e.message === "Target user not found"; } })];
|
|
115
|
+
case 9:
|
|
116
|
+
// conferenceId is not settable via the public API (only set internally by conference webhooks),
|
|
117
|
+
// so the "Conference calls cannot be transferred" branch is covered by manual E2E testing only
|
|
118
|
+
_b.sent();
|
|
119
|
+
return [4 /*yield*/, async_test("cold_transfer: target user with incoming calls disabled rejected", function () { return sdk.api.phone_calls.cold_transfer({ callSid: inboundCall_1.externalId, targetUserId: disabledTargetUser_1.id }); }, { shouldError: true, onError: function (e) { return e.message === "Target user has incoming calls disabled"; } })
|
|
120
|
+
// non-admin either can't see the call (Call not found) or is stopped by a later
|
|
121
|
+
// validation (target has incoming calls disabled) — errors on every path
|
|
122
|
+
];
|
|
123
|
+
case 10:
|
|
124
|
+
_b.sent();
|
|
125
|
+
// non-admin either can't see the call (Call not found) or is stopped by a later
|
|
126
|
+
// validation (target has incoming calls disabled) — errors on every path
|
|
127
|
+
return [4 /*yield*/, async_test("cold_transfer: non-admin cannot transfer an inaccessible call", function () { return sdkNonAdmin.api.phone_calls.cold_transfer({ callSid: inboundCall_1.externalId, targetUserId: disabledTargetUser_1.id }); }, handleAnyError)];
|
|
128
|
+
case 11:
|
|
129
|
+
// non-admin either can't see the call (Call not found) or is stopped by a later
|
|
130
|
+
// validation (target has incoming calls disabled) — errors on every path
|
|
131
|
+
_b.sent();
|
|
132
|
+
return [3 /*break*/, 14];
|
|
133
|
+
case 12:
|
|
134
|
+
// deleting the enduser cascades deletion of its phone_calls records
|
|
135
|
+
return [4 /*yield*/, Promise.all(__spreadArray([
|
|
136
|
+
sdk.api.endusers.deleteOne(enduser.id)
|
|
137
|
+
], targetUsers.map(function (u) { return sdk.api.users.deleteOne(u.id); }), true)).catch(console.error)];
|
|
138
|
+
case 13:
|
|
139
|
+
// deleting the enduser cascades deletion of its phone_calls records
|
|
140
|
+
_b.sent();
|
|
141
|
+
return [7 /*endfinally*/];
|
|
142
|
+
case 14: return [2 /*return*/];
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
// Allow running this test file independently
|
|
148
|
+
if (require.main === module) {
|
|
149
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
150
|
+
var sdk_1 = new Session({ host: host });
|
|
151
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
152
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
153
|
+
return __generator(this, function (_a) {
|
|
154
|
+
switch (_a.label) {
|
|
155
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
156
|
+
case 1:
|
|
157
|
+
_a.sent();
|
|
158
|
+
return [4 /*yield*/, phone_calls_cold_transfer_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
159
|
+
case 2:
|
|
160
|
+
_a.sent();
|
|
161
|
+
return [2 /*return*/];
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}); };
|
|
165
|
+
runTests()
|
|
166
|
+
.then(function () {
|
|
167
|
+
console.log("✅ Phone calls cold transfer test suite completed successfully");
|
|
168
|
+
process.exit(0);
|
|
169
|
+
})
|
|
170
|
+
.catch(function (error) {
|
|
171
|
+
console.error("❌ Phone calls cold transfer test suite failed:", error);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=phone_calls_cold_transfer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone_calls_cold_transfer.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/phone_calls_cold_transfer.test.ts"],"names":[],"mappings":"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"}
|