@tellescope/sdk 1.256.2 → 1.256.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.
Files changed (61) hide show
  1. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.d.ts +6 -0
  2. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.d.ts.map +1 -0
  3. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.js +298 -0
  4. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.js.map +1 -0
  5. package/lib/cjs/tests/api_tests/phone_calls_move_enduser.test.d.ts +6 -0
  6. package/lib/cjs/tests/api_tests/phone_calls_move_enduser.test.d.ts.map +1 -0
  7. package/lib/cjs/tests/api_tests/phone_calls_move_enduser.test.js +274 -0
  8. package/lib/cjs/tests/api_tests/phone_calls_move_enduser.test.js.map +1 -0
  9. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.d.ts +18 -0
  10. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.js +964 -0
  12. package/lib/cjs/tests/api_tests/stripe_webhook_triggers.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/welle_partner_token.test.d.ts +6 -0
  14. package/lib/cjs/tests/api_tests/welle_partner_token.test.d.ts.map +1 -0
  15. package/lib/cjs/tests/api_tests/welle_partner_token.test.js +313 -0
  16. package/lib/cjs/tests/api_tests/welle_partner_token.test.js.map +1 -0
  17. package/lib/cjs/tests/stripe_webhook_helpers.d.ts +204 -0
  18. package/lib/cjs/tests/stripe_webhook_helpers.d.ts.map +1 -0
  19. package/lib/cjs/tests/stripe_webhook_helpers.js +286 -0
  20. package/lib/cjs/tests/stripe_webhook_helpers.js.map +1 -0
  21. package/lib/cjs/tests/tests.d.ts.map +1 -1
  22. package/lib/cjs/tests/tests.js +192 -180
  23. package/lib/cjs/tests/tests.js.map +1 -1
  24. package/lib/cjs/tests/unit_tests/translation.test.d.ts +3 -0
  25. package/lib/cjs/tests/unit_tests/translation.test.d.ts.map +1 -0
  26. package/lib/cjs/tests/unit_tests/translation.test.js.map +1 -0
  27. package/lib/esm/tests/api_tests/metriport_push_form_response.test.d.ts +6 -0
  28. package/lib/esm/tests/api_tests/metriport_push_form_response.test.d.ts.map +1 -0
  29. package/lib/esm/tests/api_tests/metriport_push_form_response.test.js +294 -0
  30. package/lib/esm/tests/api_tests/metriport_push_form_response.test.js.map +1 -0
  31. package/lib/esm/tests/api_tests/phone_calls_move_enduser.test.d.ts +6 -0
  32. package/lib/esm/tests/api_tests/phone_calls_move_enduser.test.d.ts.map +1 -0
  33. package/lib/esm/tests/api_tests/phone_calls_move_enduser.test.js +270 -0
  34. package/lib/esm/tests/api_tests/phone_calls_move_enduser.test.js.map +1 -0
  35. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.d.ts +18 -0
  36. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.d.ts.map +1 -0
  37. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.js +960 -0
  38. package/lib/esm/tests/api_tests/stripe_webhook_triggers.test.js.map +1 -0
  39. package/lib/esm/tests/api_tests/welle_partner_token.test.d.ts +6 -0
  40. package/lib/esm/tests/api_tests/welle_partner_token.test.d.ts.map +1 -0
  41. package/lib/esm/tests/api_tests/welle_partner_token.test.js +309 -0
  42. package/lib/esm/tests/api_tests/welle_partner_token.test.js.map +1 -0
  43. package/lib/esm/tests/stripe_webhook_helpers.d.ts +204 -0
  44. package/lib/esm/tests/stripe_webhook_helpers.d.ts.map +1 -0
  45. package/lib/esm/tests/stripe_webhook_helpers.js +267 -0
  46. package/lib/esm/tests/stripe_webhook_helpers.js.map +1 -0
  47. package/lib/esm/tests/tests.d.ts.map +1 -1
  48. package/lib/esm/tests/tests.js +192 -180
  49. package/lib/esm/tests/tests.js.map +1 -1
  50. package/lib/esm/tests/unit_tests/translation.test.d.ts +3 -0
  51. package/lib/esm/tests/unit_tests/translation.test.d.ts.map +1 -0
  52. package/lib/esm/tests/unit_tests/translation.test.js +52 -0
  53. package/lib/esm/tests/unit_tests/translation.test.js.map +1 -0
  54. package/lib/tsconfig.tsbuildinfo +1 -1
  55. package/package.json +10 -10
  56. package/src/tests/api_tests/metriport_push_form_response.test.ts +226 -0
  57. package/src/tests/api_tests/stripe_webhook_triggers.test.ts +676 -0
  58. package/src/tests/api_tests/welle_partner_token.test.ts +249 -0
  59. package/src/tests/stripe_webhook_helpers.ts +240 -0
  60. package/src/tests/tests.ts +6 -0
  61. package/test_generated.pdf +0 -0
@@ -0,0 +1,6 @@
1
+ import { Session } from "../../sdk";
2
+ export declare const metriport_push_form_response_tests: ({ sdk, sdkNonAdmin }: {
3
+ sdk: Session;
4
+ sdkNonAdmin: Session;
5
+ }) => Promise<void>;
6
+ //# sourceMappingURL=metriport_push_form_response.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metriport_push_form_response.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/metriport_push_form_response.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBnC,eAAO,MAAM,kCAAkC;SAAuC,OAAO;iBAAe,OAAO;mBA0LlH,CAAA"}
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.metriport_push_form_response_tests = void 0;
40
+ require('source-map-support').install();
41
+ var sdk_1 = require("../../sdk");
42
+ var testing_1 = require("@tellescope/testing");
43
+ var setup_1 = require("../setup");
44
+ var constants_1 = require("@tellescope/constants");
45
+ var host = process.env.API_URL || 'http://localhost:8080';
46
+ // metriportPushFormResponse journey action (CU-86e2cucba).
47
+ //
48
+ // Fast / no-upload: this exercises validation and the guard branches that reject before any
49
+ // Metriport HTTP call. A real upload needs a Metriport sandbox API key plus a patient already
50
+ // synced to a facility, so the happy path is verified manually (see the task plan).
51
+ var metriport_push_form_response_tests = function (_a) {
52
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
53
+ return __awaiter(void 0, void 0, void 0, function () {
54
+ var enduserId, otherEnduserId, formId, journeyId, createdIntegrationId, journey_1, form_1, field, enduser_1, step_1, contextOnlyStep, _b, accessCode, response, formResponseId_1, processStep, metriportIntegrationExists, existing, _c, noIntegrationResult, created, unsyncedResult, otherEnduser, crossPatientAction, crossPatientResult, untouched, stamped, idempotentResult;
55
+ var _d, _e;
56
+ return __generator(this, function (_f) {
57
+ switch (_f.label) {
58
+ case 0:
59
+ (0, testing_1.log_header)("Metriport Push Form Response Tests");
60
+ _f.label = 1;
61
+ case 1:
62
+ _f.trys.push([1, , 28, 39]);
63
+ return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'Metriport Push Form Response Journey' })];
64
+ case 2:
65
+ journey_1 = _f.sent();
66
+ journeyId = journey_1.id;
67
+ return [4 /*yield*/, sdk.api.forms.createOne({ title: 'Metriport Push Form Response Form' })];
68
+ case 3:
69
+ form_1 = _f.sent();
70
+ formId = form_1.id;
71
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
72
+ formId: form_1.id, type: 'string', title: 'Chief Complaint', previousFields: [{ type: 'root', info: {} }],
73
+ })];
74
+ case 4:
75
+ field = _f.sent();
76
+ return [4 /*yield*/, sdk.api.endusers.createOne({
77
+ fname: 'metriport-push',
78
+ lname: 'test',
79
+ email: "metriport_push_".concat(Date.now(), "@test.tellescope.com"),
80
+ })];
81
+ case 5:
82
+ enduser_1 = _f.sent();
83
+ enduserId = enduser_1.id;
84
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
85
+ journeyId: journey_1.id,
86
+ events: [{ type: 'onJourneyStart', info: {} }],
87
+ action: { type: 'metriportPushFormResponse', info: { formId: form_1.id, integrationTitle: '' } },
88
+ })];
89
+ case 6:
90
+ step_1 = _f.sent();
91
+ (0, testing_1.assert)(step_1.action.type === 'metriportPushFormResponse' && step_1.action.info.formId === form_1.id, 'metriportPushFormResponse step round-trip failed', 'metriportPushFormResponse step round-trips');
92
+ return [4 /*yield*/, sdk.api.automation_steps.createOne({
93
+ journeyId: journey_1.id,
94
+ events: [{ type: 'onJourneyStart', info: {} }],
95
+ action: { type: 'metriportPushFormResponse', info: {} },
96
+ })];
97
+ case 7:
98
+ contextOnlyStep = _f.sent();
99
+ (0, testing_1.assert)(contextOnlyStep.action.type === 'metriportPushFormResponse', 'metriportPushFormResponse step without info was rejected', 'metriportPushFormResponse info is optional');
100
+ return [4 /*yield*/, (0, testing_1.async_test)('metriportPushFormResponse with a malformed formId is rejected', function () { return sdk.api.automation_steps.createOne({
101
+ journeyId: journey_1.id,
102
+ events: [{ type: 'onJourneyStart', info: {} }],
103
+ action: { type: 'metriportPushFormResponse', info: { formId: 'not-a-mongo-id' } },
104
+ }); }, { shouldError: true, onError: function () { return true; } })
105
+ /*************** runtime ***************/
106
+ ];
107
+ case 8:
108
+ _f.sent();
109
+ return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({
110
+ enduserId: enduser_1.id, formId: form_1.id,
111
+ })];
112
+ case 9:
113
+ _b = _f.sent(), accessCode = _b.accessCode, response = _b.response;
114
+ return [4 /*yield*/, sdk.api.form_responses.submit_form_response({
115
+ accessCode: accessCode,
116
+ responses: [{ fieldId: field.id, fieldTitle: 'Chief Complaint', answer: { type: 'string', value: 'Headache' } }],
117
+ })];
118
+ case 10:
119
+ _f.sent();
120
+ formResponseId_1 = response.id;
121
+ processStep = function () { return __awaiter(void 0, void 0, void 0, function () {
122
+ var automatedAction;
123
+ return __generator(this, function (_a) {
124
+ switch (_a.label) {
125
+ case 0: return [4 /*yield*/, sdk.api.automated_actions.createOne({
126
+ enduserId: enduser_1.id,
127
+ journeyId: journey_1.id,
128
+ automationStepId: step_1.id,
129
+ event: { type: 'onJourneyStart', info: {} },
130
+ action: { type: 'metriportPushFormResponse', info: { formId: form_1.id } },
131
+ journeyContext: { formResponseId: formResponseId_1 },
132
+ status: 'active',
133
+ processAfter: Date.now(),
134
+ })];
135
+ case 1:
136
+ automatedAction = _a.sent();
137
+ return [2 /*return*/, sdk.api.automated_actions.process({ automatedActionId: automatedAction.id })];
138
+ }
139
+ });
140
+ }); };
141
+ metriportIntegrationExists = false;
142
+ _f.label = 11;
143
+ case 11:
144
+ _f.trys.push([11, 13, , 14]);
145
+ return [4 /*yield*/, sdk.api.integrations.load_redacted({})];
146
+ case 12:
147
+ existing = _f.sent();
148
+ metriportIntegrationExists = !!existing.integrations.find(function (i) { return i.title === constants_1.METRIPORT_TITLE; });
149
+ return [3 /*break*/, 14];
150
+ case 13:
151
+ _c = _f.sent();
152
+ return [3 /*break*/, 14];
153
+ case 14:
154
+ if (!!metriportIntegrationExists) return [3 /*break*/, 17];
155
+ return [4 /*yield*/, processStep()];
156
+ case 15:
157
+ noIntegrationResult = _f.sent();
158
+ (0, testing_1.assert)(!noIntegrationResult.success
159
+ && !noIntegrationResult.unimplemented
160
+ && noIntegrationResult.error === 'Metriport integration not found', "expected 'Metriport integration not found', got: ".concat(JSON.stringify(noIntegrationResult)), 'metriportPushFormResponse is wired into automated_actions.process (no integration)');
161
+ return [4 /*yield*/, sdk.api.integrations.createOne({
162
+ title: constants_1.METRIPORT_TITLE,
163
+ authentication: {
164
+ type: 'apiKey',
165
+ info: { access_token: 'test-metriport-api-key', refresh_token: 'unused', scope: '', token_type: 'Bearer', expiry_date: new Date().getTime() },
166
+ },
167
+ })];
168
+ case 16:
169
+ created = _f.sent();
170
+ createdIntegrationId = created.id;
171
+ _f.label = 17;
172
+ case 17: return [4 /*yield*/, processStep()];
173
+ case 18:
174
+ unsyncedResult = _f.sent();
175
+ (0, testing_1.assert)(!unsyncedResult.success
176
+ && !unsyncedResult.unimplemented
177
+ && /not synced to Metriport/i.test(unsyncedResult.error || ''), "expected a 'Patient is not synced to Metriport' error, got: ".concat(JSON.stringify(unsyncedResult)), 'metriportPushFormResponse rejects a patient not synced to Metriport');
178
+ return [4 /*yield*/, sdk.api.endusers.createOne({
179
+ fname: 'metriport-push-other',
180
+ lname: 'test',
181
+ email: "metriport_push_other_".concat(Date.now(), "@test.tellescope.com"),
182
+ })];
183
+ case 19:
184
+ otherEnduser = _f.sent();
185
+ otherEnduserId = otherEnduser.id;
186
+ return [4 /*yield*/, sdk.api.automated_actions.createOne({
187
+ enduserId: otherEnduser.id,
188
+ journeyId: journey_1.id,
189
+ automationStepId: step_1.id,
190
+ event: { type: 'onJourneyStart', info: {} },
191
+ action: { type: 'metriportPushFormResponse', info: { formId: form_1.id } },
192
+ journeyContext: { formResponseId: formResponseId_1 },
193
+ status: 'active',
194
+ processAfter: Date.now(),
195
+ })];
196
+ case 20:
197
+ crossPatientAction = _f.sent();
198
+ return [4 /*yield*/, sdk.api.automated_actions.process({ automatedActionId: crossPatientAction.id })];
199
+ case 21:
200
+ crossPatientResult = _f.sent();
201
+ (0, testing_1.assert)(!crossPatientResult.success
202
+ && !crossPatientResult.unimplemented
203
+ && crossPatientResult.error === 'Form response does not belong to this patient', "expected a cross-patient ownership rejection, got: ".concat(JSON.stringify(crossPatientResult)), 'metriportPushFormResponse rejects a form response owned by a different patient');
204
+ return [4 /*yield*/, sdk.api.form_responses.getOne(formResponseId_1)];
205
+ case 22:
206
+ untouched = _f.sent();
207
+ (0, testing_1.assert)(!((_d = untouched.references) === null || _d === void 0 ? void 0 : _d.find(function (r) { return r.type === constants_1.METRIPORT_TITLE; })), "patient A's form response was stamped despite a cross-patient rejection: ".concat(JSON.stringify(untouched.references)), 'metriportPushFormResponse does not stamp a form response on cross-patient rejection');
208
+ /*************** idempotency ***************/
209
+ // form_responses.references is a readonly field, so it can only be stamped server-side (which
210
+ // is what a successful upload does). Attempt the stamp; if the API drops it, skip the check
211
+ // rather than assert on a state we couldn't set up.
212
+ return [4 /*yield*/, sdk.api.form_responses.updateOne(formResponseId_1, {
213
+ references: [{ type: constants_1.METRIPORT_TITLE, id: 'test-document-reference-id' }],
214
+ }).catch(function () { })];
215
+ case 23:
216
+ /*************** idempotency ***************/
217
+ // form_responses.references is a readonly field, so it can only be stamped server-side (which
218
+ // is what a successful upload does). Attempt the stamp; if the API drops it, skip the check
219
+ // rather than assert on a state we couldn't set up.
220
+ _f.sent();
221
+ return [4 /*yield*/, sdk.api.form_responses.getOne(formResponseId_1)];
222
+ case 24:
223
+ stamped = _f.sent();
224
+ if (!((_e = stamped.references) === null || _e === void 0 ? void 0 : _e.find(function (r) { return r.type === constants_1.METRIPORT_TITLE; }))) return [3 /*break*/, 26];
225
+ return [4 /*yield*/, processStep()];
226
+ case 25:
227
+ idempotentResult = _f.sent();
228
+ (0, testing_1.assert)(idempotentResult.success === true, "expected a no-op success for an already-shared form response, got: ".concat(JSON.stringify(idempotentResult)), 'metriportPushFormResponse no-ops for an already-shared form response');
229
+ return [3 /*break*/, 27];
230
+ case 26:
231
+ console.log("⏭️ Skipping idempotency check (form_responses.references is readonly over the API)");
232
+ _f.label = 27;
233
+ case 27: return [3 /*break*/, 39];
234
+ case 28:
235
+ if (!createdIntegrationId) return [3 /*break*/, 30];
236
+ return [4 /*yield*/, sdk.api.integrations.deleteOne(createdIntegrationId).catch(console.error)];
237
+ case 29:
238
+ _f.sent();
239
+ _f.label = 30;
240
+ case 30:
241
+ if (!journeyId) return [3 /*break*/, 32];
242
+ return [4 /*yield*/, sdk.api.journeys.deleteOne(journeyId).catch(console.error)];
243
+ case 31:
244
+ _f.sent();
245
+ _f.label = 32;
246
+ case 32:
247
+ if (!formId) return [3 /*break*/, 34];
248
+ return [4 /*yield*/, sdk.api.forms.deleteOne(formId).catch(console.error)];
249
+ case 33:
250
+ _f.sent();
251
+ _f.label = 34;
252
+ case 34:
253
+ if (!enduserId) return [3 /*break*/, 36];
254
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserId).catch(console.error)];
255
+ case 35:
256
+ _f.sent();
257
+ _f.label = 36;
258
+ case 36:
259
+ if (!otherEnduserId) return [3 /*break*/, 38];
260
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(otherEnduserId).catch(console.error)];
261
+ case 37:
262
+ _f.sent();
263
+ _f.label = 38;
264
+ case 38: return [7 /*endfinally*/];
265
+ case 39: return [2 /*return*/];
266
+ }
267
+ });
268
+ });
269
+ };
270
+ exports.metriport_push_form_response_tests = metriport_push_form_response_tests;
271
+ if (require.main === module) {
272
+ console.log("Using API URL: ".concat(host));
273
+ var sdk_2 = new sdk_1.Session({ host: host });
274
+ var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
275
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
276
+ return __generator(this, function (_a) {
277
+ switch (_a.label) {
278
+ case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
279
+ case 1:
280
+ _a.sent();
281
+ return [4 /*yield*/, (0, exports.metriport_push_form_response_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
282
+ case 2:
283
+ _a.sent();
284
+ return [2 /*return*/];
285
+ }
286
+ });
287
+ }); };
288
+ runTests()
289
+ .then(function () {
290
+ console.log("✅ Metriport push form response test suite completed successfully");
291
+ process.exit(0);
292
+ })
293
+ .catch(function (error) {
294
+ console.error("❌ Metriport push form response test suite failed:", error);
295
+ process.exit(1);
296
+ });
297
+ }
298
+ //# sourceMappingURL=metriport_push_form_response.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metriport_push_form_response.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/metriport_push_form_response.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Session } from "../../sdk";
2
+ export declare const phone_calls_move_enduser_tests: ({ sdk, sdkNonAdmin }: {
3
+ sdk: Session;
4
+ sdkNonAdmin: Session;
5
+ }) => Promise<void>;
6
+ //# sourceMappingURL=phone_calls_move_enduser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone_calls_move_enduser.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/phone_calls_move_enduser.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,eAAO,MAAM,8BAA8B;SAAwC,OAAO;iBAAe,OAAO;mBAiL/G,CAAA"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ 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;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
+ if (ar || !(i in from)) {
52
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
+ ar[i] = from[i];
54
+ }
55
+ }
56
+ return to.concat(ar || Array.prototype.slice.call(from));
57
+ };
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.phone_calls_move_enduser_tests = void 0;
60
+ require('source-map-support').install();
61
+ var sdk_1 = require("../../sdk");
62
+ var testing_1 = require("@tellescope/testing");
63
+ var constants_1 = require("@tellescope/constants");
64
+ var setup_1 = require("../setup");
65
+ var host = process.env.API_URL || 'http://localhost:8080';
66
+ var NONEXISTENT_MONGO_ID = '60398b1131a295e64f084fff';
67
+ var RAND = function () { return Math.random().toString(36).slice(2, 10); };
68
+ // Backs the mid-call "Move to Different Profile" flow in the call window
69
+ // (packages/private/webapp/src/pages/EnduserProfile/PhoneCalling.tsx). The move itself is a plain
70
+ // update of PhoneCall.enduserId, so these tests pin the lookups the UI performs and the guards that
71
+ // keep the update safe.
72
+ var phone_calls_move_enduser_tests = function (_a) {
73
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
74
+ return __awaiter(void 0, void 0, void 0, function () {
75
+ var SHARED_PHONE, createdEnduserIds, createdUserIds, createdRoleIds, matchedByPhone_1, matchedByLandline_1, matchedByAlternate_1, externalId_1, call_1, moved, role, rbap, noUpdateUser, _b, authToken, sessionUser, sdkNoUpdate_1, newerCall, _c, cancelledById, untouched, _d;
76
+ return __generator(this, function (_e) {
77
+ switch (_e.label) {
78
+ case 0:
79
+ (0, testing_1.log_header)("Phone Calls Move Enduser Tests");
80
+ SHARED_PHONE = '+15555550117';
81
+ createdEnduserIds = [];
82
+ createdUserIds = [];
83
+ createdRoleIds = [];
84
+ _e.label = 1;
85
+ case 1:
86
+ _e.trys.push([1, , 22, 24]);
87
+ return [4 /*yield*/, sdk.api.endusers.createOne({
88
+ fname: 'Move', lname: 'ByPhone', phone: SHARED_PHONE,
89
+ })];
90
+ case 2:
91
+ matchedByPhone_1 = _e.sent();
92
+ return [4 /*yield*/, sdk.api.endusers.createOne({
93
+ fname: 'Move', lname: 'ByLandline', landline: SHARED_PHONE,
94
+ })];
95
+ case 3:
96
+ matchedByLandline_1 = _e.sent();
97
+ return [4 /*yield*/, sdk.api.endusers.createOne({
98
+ fname: 'Move', lname: 'ByAlternate', alternatePhones: [SHARED_PHONE],
99
+ })];
100
+ case 4:
101
+ matchedByAlternate_1 = _e.sent();
102
+ createdEnduserIds.push(matchedByPhone_1.id, matchedByLandline_1.id, matchedByAlternate_1.id);
103
+ externalId_1 = "CAmoveenduser".concat(RAND()).concat(RAND());
104
+ return [4 /*yield*/, sdk.api.phone_calls.createOne({
105
+ enduserId: matchedByPhone_1.id,
106
+ inbound: true,
107
+ externalId: externalId_1,
108
+ from: SHARED_PHONE,
109
+ to: '+15550002222',
110
+ userId: sdk.userInfo.id,
111
+ })
112
+ // ── the lookup the panel runs to list candidate profiles ──
113
+ // alternatePhones is deliberately excluded: the inbound webhook only consults it as a fallback, and
114
+ // including it would widen the $or beyond the indexed fields
115
+ ];
116
+ case 5:
117
+ call_1 = _e.sent();
118
+ // ── the lookup the panel runs to list candidate profiles ──
119
+ // alternatePhones is deliberately excluded: the inbound webhook only consults it as a fallback, and
120
+ // including it would widen the $or beyond the indexed fields
121
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: phone/landline lookup finds both duplicates and excludes alternatePhones", function () { return sdk.api.endusers.getSome({
122
+ mdbFilter: { $or: [{ phone: SHARED_PHONE }, { landline: SHARED_PHONE }] },
123
+ limit: 10,
124
+ }); }, { onResult: function (endusers) {
125
+ var ids = endusers.map(function (e) { return e.id; });
126
+ return (ids.includes(matchedByPhone_1.id)
127
+ && ids.includes(matchedByLandline_1.id)
128
+ && !ids.includes(matchedByAlternate_1.id));
129
+ } })
130
+ // ── the two ways the call window resolves the PhoneCall record for the live call ──
131
+ ];
132
+ case 6:
133
+ // ── the lookup the panel runs to list candidate profiles ──
134
+ // alternatePhones is deliberately excluded: the inbound webhook only consults it as a fallback, and
135
+ // including it would widen the $or beyond the indexed fields
136
+ _e.sent();
137
+ // ── the two ways the call window resolves the PhoneCall record for the live call ──
138
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: record resolves by id (the pcId dial parameter)", function () { return sdk.api.phone_calls.getSome({ ids: [call_1.id], limit: 1 }); }, { onResult: function (calls) { return calls.length === 1 && calls[0].id === call_1.id; } })];
139
+ case 7:
140
+ // ── the two ways the call window resolves the PhoneCall record for the live call ──
141
+ _e.sent();
142
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: record resolves by externalId (the parentCallSID fallback)", function () { return sdk.api.phone_calls.getSome({ filter: { externalId: externalId_1 }, limit: 1 }); }, { onResult: function (calls) { return calls.length === 1 && calls[0].id === call_1.id; } })
143
+ // ── the move itself ──
144
+ ];
145
+ case 8:
146
+ _e.sent();
147
+ // ── the move itself ──
148
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: enduserId can be updated", function () { return sdk.api.phone_calls.updateOne(call_1.id, { enduserId: matchedByLandline_1.id }); }, testing_1.passOnAnyResult)];
149
+ case 9:
150
+ // ── the move itself ──
151
+ _e.sent();
152
+ return [4 /*yield*/, sdk.api.phone_calls.getOne(call_1.id)];
153
+ case 10:
154
+ moved = _e.sent();
155
+ (0, testing_1.assert)(moved.enduserId === matchedByLandline_1.id, "moved call enduserId is ".concat(moved.enduserId, ", expected ").concat(matchedByLandline_1.id), "move enduser: call is reattributed to the new enduser");
156
+ (0, testing_1.assert)(moved.externalId === externalId_1
157
+ && moved.from === SHARED_PHONE
158
+ && moved.to === '+15550002222'
159
+ && moved.inbound === true, "move altered call identity fields: ".concat(JSON.stringify({ externalId: moved.externalId, from: moved.from, to: moved.to, inbound: moved.inbound })), "move enduser: move leaves call identity fields untouched");
160
+ // ── guards ──
161
+ // the foreign-key check on enduserId is what blocks moving a call outside the session's tenant
162
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: cannot move to a nonexistent enduser", function () { return sdk.api.phone_calls.updateOne(call_1.id, { enduserId: NONEXISTENT_MONGO_ID }); }, { shouldError: true, onError: function (e) { return e.message === "Could not find a related record for the given id(s)"; } })];
163
+ case 11:
164
+ // ── guards ──
165
+ // the foreign-key check on enduserId is what blocks moving a call outside the session's tenant
166
+ _e.sent();
167
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: non-admin without access cannot move the call", function () { return sdkNonAdmin.api.phone_calls.updateOne(call_1.id, { enduserId: matchedByPhone_1.id }); }, testing_1.handleAnyError)
168
+ // a role with phone_calls update revoked must not be able to move the call, even though the UI
169
+ // gate is an org setting rather than a permission
170
+ ];
171
+ case 12:
172
+ _e.sent();
173
+ role = "move-call-".concat(RAND());
174
+ return [4 /*yield*/, sdk.api.role_based_access_permissions.createOne({
175
+ role: role,
176
+ permissions: __assign(__assign({}, constants_1.PROVIDER_PERMISSIONS), { endusers: constants_1.FULL_ACCESS, phone_calls: { create: null, read: 'All', update: null, delete: null } }),
177
+ })];
178
+ case 13:
179
+ rbap = _e.sent();
180
+ createdRoleIds.push(rbap.id);
181
+ return [4 /*yield*/, sdk.api.users.createOne({
182
+ email: "move.call.".concat(RAND(), "@tellescope.example"),
183
+ fname: 'Move', lname: 'CallRole',
184
+ notificationEmailsDisabled: true, verifiedEmail: true,
185
+ roles: [role],
186
+ })];
187
+ case 14:
188
+ noUpdateUser = _e.sent();
189
+ createdUserIds.push(noUpdateUser.id);
190
+ return [4 /*yield*/, sdk.api.users.generate_auth_token({ id: noUpdateUser.id })];
191
+ case 15:
192
+ _b = _e.sent(), authToken = _b.authToken, sessionUser = _b.user;
193
+ sdkNoUpdate_1 = new sdk_1.Session({ host: host });
194
+ sdkNoUpdate_1.setAuthToken(authToken);
195
+ sdkNoUpdate_1.setUserInfo(sessionUser);
196
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: role without phone_calls update cannot move the call", function () { return sdkNoUpdate_1.api.phone_calls.updateOne(call_1.id, { enduserId: matchedByPhone_1.id }); }, testing_1.handleAnyError)
197
+ // ── cancel_recording targets the given call, not merely the enduser's most recent one ──
198
+ // a newer call for the same enduser is what made the enduserId-only lookup unreliable once a call
199
+ // could be moved mid-conversation
200
+ ];
201
+ case 16:
202
+ _e.sent();
203
+ return [4 /*yield*/, sdk.api.phone_calls.createOne({
204
+ enduserId: matchedByLandline_1.id,
205
+ inbound: true,
206
+ externalId: "CAmoveendusernewer".concat(RAND()),
207
+ from: SHARED_PHONE,
208
+ to: '+15550002222',
209
+ userId: sdk.userInfo.id,
210
+ })];
211
+ case 17:
212
+ newerCall = _e.sent();
213
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: cancel_recording with callId targets that exact call", function () { return sdk.api.phone_calls.cancel_recording({ enduserId: matchedByLandline_1.id, callId: call_1.id }); }, testing_1.passOnAnyResult)];
214
+ case 18:
215
+ _e.sent();
216
+ return [4 /*yield*/, Promise.all([
217
+ sdk.api.phone_calls.getOne(call_1.id),
218
+ sdk.api.phone_calls.getOne(newerCall.id),
219
+ ])];
220
+ case 19:
221
+ _c = _e.sent(), cancelledById = _c[0], untouched = _c[1];
222
+ (0, testing_1.assert)(!!cancelledById.recordingCancelledAt && !untouched.recordingCancelledAt, "cancel_recording ignored callId: specified call cancelled=".concat(!!cancelledById.recordingCancelledAt, ", newer call cancelled=").concat(!!untouched.recordingCancelledAt), "move enduser: cancel_recording with callId cancels the specified call only");
223
+ return [4 /*yield*/, (0, testing_1.async_test)("move enduser: cancel_recording without callId still falls back to the most recent call", function () { return sdk.api.phone_calls.cancel_recording({ enduserId: matchedByLandline_1.id }); }, testing_1.passOnAnyResult)];
224
+ case 20:
225
+ _e.sent();
226
+ _d = testing_1.assert;
227
+ return [4 /*yield*/, sdk.api.phone_calls.getOne(newerCall.id)];
228
+ case 21:
229
+ _d.apply(void 0, [!!(_e.sent()).recordingCancelledAt,
230
+ "cancel_recording without callId did not cancel the enduser's most recent call",
231
+ "move enduser: cancel_recording without callId still uses the most-recent-call fallback"]);
232
+ return [3 /*break*/, 24];
233
+ case 22:
234
+ // deleting an enduser cascades deletion of its phone_calls records
235
+ return [4 /*yield*/, Promise.all(__spreadArray(__spreadArray(__spreadArray([], createdEnduserIds.map(function (id) { return sdk.api.endusers.deleteOne(id); }), true), createdUserIds.map(function (id) { return sdk.api.users.deleteOne(id); }), true), createdRoleIds.map(function (id) { return sdk.api.role_based_access_permissions.deleteOne(id); }), true)).catch(console.error)];
236
+ case 23:
237
+ // deleting an enduser cascades deletion of its phone_calls records
238
+ _e.sent();
239
+ return [7 /*endfinally*/];
240
+ case 24: return [2 /*return*/];
241
+ }
242
+ });
243
+ });
244
+ };
245
+ exports.phone_calls_move_enduser_tests = phone_calls_move_enduser_tests;
246
+ // Allow running this test file independently
247
+ if (require.main === module) {
248
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
249
+ var sdk_2 = new sdk_1.Session({ host: host });
250
+ var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
251
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
252
+ return __generator(this, function (_a) {
253
+ switch (_a.label) {
254
+ case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
255
+ case 1:
256
+ _a.sent();
257
+ return [4 /*yield*/, (0, exports.phone_calls_move_enduser_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
258
+ case 2:
259
+ _a.sent();
260
+ return [2 /*return*/];
261
+ }
262
+ });
263
+ }); };
264
+ runTests()
265
+ .then(function () {
266
+ console.log("✅ Phone calls move enduser test suite completed successfully");
267
+ process.exit(0);
268
+ })
269
+ .catch(function (error) {
270
+ console.error("❌ Phone calls move enduser test suite failed:", error);
271
+ process.exit(1);
272
+ });
273
+ }
274
+ //# sourceMappingURL=phone_calls_move_enduser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone_calls_move_enduser.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/phone_calls_move_enduser.test.ts"],"names":[],"mappings":"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"}