@tellescope/sdk 1.256.0 → 1.256.1
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/tests/api_tests/beluga_trigger_refill.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.js +224 -0
- package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/start_ai_conversation.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/start_ai_conversation.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/start_ai_conversation.test.js +351 -0
- package/lib/cjs/tests/api_tests/start_ai_conversation.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +201 -185
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/enduser.d.ts +1 -0
- package/lib/esm/enduser.d.ts.map +1 -1
- package/lib/esm/sdk.d.ts +3 -2
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/session.d.ts +1 -0
- package/lib/esm/session.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/beluga_trigger_refill.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/beluga_trigger_refill.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/beluga_trigger_refill.test.js +220 -0
- package/lib/esm/tests/api_tests/beluga_trigger_refill.test.js.map +1 -0
- package/lib/esm/tests/api_tests/start_ai_conversation.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/start_ai_conversation.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/start_ai_conversation.test.js +347 -0
- package/lib/esm/tests/api_tests/start_ai_conversation.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +201 -185
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/tests/api_tests/beluga_trigger_refill.test.ts +152 -0
- package/src/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.ts +292 -0
- package/src/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.ts +179 -0
- package/src/tests/api_tests/start_ai_conversation.test.ts +256 -0
- package/src/tests/tests.ts +8 -0
- package/test_generated.pdf +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beluga_trigger_refill.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/beluga_trigger_refill.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBnC,eAAO,MAAM,2BAA2B;SAAuC,OAAO;iBAAe,OAAO;mBA+G3G,CAAA"}
|
|
@@ -0,0 +1,224 @@
|
|
|
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.beluga_trigger_refill_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 host = process.env.API_URL || 'http://localhost:8080';
|
|
45
|
+
// Beluga Trigger Refill journey action tests (CU-86e2gbv7y).
|
|
46
|
+
//
|
|
47
|
+
// Validator-acceptance only: verifies that automation steps configured with the new
|
|
48
|
+
// belugaTriggerRefill action (org-mapping and inline-medIds variants) pass validation, and that
|
|
49
|
+
// invalid shapes are rejected. No live Beluga call is made — external/triggerRefill requires
|
|
50
|
+
// sandbox credentials, and the process endpoint's guard branches (missing integration, missing
|
|
51
|
+
// preferences) mirror the already-tested belugaAutoRx/belugaUpdateVisit handlers.
|
|
52
|
+
var beluga_trigger_refill_tests = function (_a) {
|
|
53
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
54
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
55
|
+
var journeyId, formId, stepIds, journey_1, form_1, _i, stepIds_1, id;
|
|
56
|
+
return __generator(this, function (_b) {
|
|
57
|
+
switch (_b.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
(0, testing_1.log_header)("Beluga Trigger Refill Journey Action Tests");
|
|
60
|
+
stepIds = [];
|
|
61
|
+
_b.label = 1;
|
|
62
|
+
case 1:
|
|
63
|
+
_b.trys.push([1, , 9, 18]);
|
|
64
|
+
return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'Beluga Trigger Refill Test Journey' })];
|
|
65
|
+
case 2:
|
|
66
|
+
journey_1 = _b.sent();
|
|
67
|
+
journeyId = journey_1.id;
|
|
68
|
+
return [4 /*yield*/, sdk.api.forms.createOne({ title: 'Beluga Trigger Refill Test Form' })];
|
|
69
|
+
case 3:
|
|
70
|
+
form_1 = _b.sent();
|
|
71
|
+
formId = form_1.id;
|
|
72
|
+
// Inline med IDs variant
|
|
73
|
+
return [4 /*yield*/, (0, testing_1.async_test)("belugaTriggerRefill step accepted (inline medIds)", function () { return sdk.api.automation_steps.createOne({
|
|
74
|
+
journeyId: journey_1.id,
|
|
75
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
76
|
+
action: {
|
|
77
|
+
type: 'belugaTriggerRefill',
|
|
78
|
+
info: {
|
|
79
|
+
formId: form_1.id,
|
|
80
|
+
patientPreferences: [{ medId: 'med-123' }, { medId: 'med-456' }],
|
|
81
|
+
customFieldName: 'Refill Medication',
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}).then(function (s) { stepIds.push(s.id); return s; }); }, testing_1.passOnAnyResult)
|
|
85
|
+
// Organization mapping variant
|
|
86
|
+
];
|
|
87
|
+
case 4:
|
|
88
|
+
// Inline med IDs variant
|
|
89
|
+
_b.sent();
|
|
90
|
+
// Organization mapping variant
|
|
91
|
+
return [4 /*yield*/, (0, testing_1.async_test)("belugaTriggerRefill step accepted (organization mapping)", function () { return sdk.api.automation_steps.createOne({
|
|
92
|
+
journeyId: journey_1.id,
|
|
93
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
94
|
+
action: {
|
|
95
|
+
type: 'belugaTriggerRefill',
|
|
96
|
+
info: {
|
|
97
|
+
formId: form_1.id,
|
|
98
|
+
useOrganizationMapping: true,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
}).then(function (s) { stepIds.push(s.id); return s; }); }, testing_1.passOnAnyResult)
|
|
102
|
+
// Invalid formId (not a mongo id) rejected
|
|
103
|
+
];
|
|
104
|
+
case 5:
|
|
105
|
+
// Organization mapping variant
|
|
106
|
+
_b.sent();
|
|
107
|
+
// Invalid formId (not a mongo id) rejected
|
|
108
|
+
return [4 /*yield*/, (0, testing_1.async_test)("belugaTriggerRefill step rejected (invalid formId)", function () { return sdk.api.automation_steps.createOne({
|
|
109
|
+
journeyId: journey_1.id,
|
|
110
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
111
|
+
action: {
|
|
112
|
+
type: 'belugaTriggerRefill',
|
|
113
|
+
info: {
|
|
114
|
+
formId: 'not-a-mongo-id',
|
|
115
|
+
patientPreferences: [{ medId: 'med-123' }],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
}); }, { shouldError: true, onError: function () { return true; } })
|
|
119
|
+
// Missing formId rejected
|
|
120
|
+
];
|
|
121
|
+
case 6:
|
|
122
|
+
// Invalid formId (not a mongo id) rejected
|
|
123
|
+
_b.sent();
|
|
124
|
+
// Missing formId rejected
|
|
125
|
+
return [4 /*yield*/, (0, testing_1.async_test)("belugaTriggerRefill step rejected (missing formId)", function () { return sdk.api.automation_steps.createOne({
|
|
126
|
+
journeyId: journey_1.id,
|
|
127
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
128
|
+
action: {
|
|
129
|
+
type: 'belugaTriggerRefill',
|
|
130
|
+
info: {
|
|
131
|
+
patientPreferences: [{ medId: 'med-123' }],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
}); }, { shouldError: true, onError: function () { return true; } })
|
|
135
|
+
// Unexpected fields in a patient preference are stripped by objectValidator, not rejected —
|
|
136
|
+
// assert they never reach the stored config (the step itself is accepted)
|
|
137
|
+
];
|
|
138
|
+
case 7:
|
|
139
|
+
// Missing formId rejected
|
|
140
|
+
_b.sent();
|
|
141
|
+
// Unexpected fields in a patient preference are stripped by objectValidator, not rejected —
|
|
142
|
+
// assert they never reach the stored config (the step itself is accepted)
|
|
143
|
+
return [4 /*yield*/, (0, testing_1.async_test)("belugaTriggerRefill step strips unexpected patientPreferences field", function () { return sdk.api.automation_steps.createOne({
|
|
144
|
+
journeyId: journey_1.id,
|
|
145
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
146
|
+
action: {
|
|
147
|
+
type: 'belugaTriggerRefill',
|
|
148
|
+
info: {
|
|
149
|
+
formId: form_1.id,
|
|
150
|
+
patientPreferences: [{ medId: 'med-123', pharmacyId: 'not-allowed' }],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
}).then(function (s) { stepIds.push(s.id); return s; }); }, {
|
|
154
|
+
onResult: function (s) {
|
|
155
|
+
var _a;
|
|
156
|
+
var preference = (_a = s.action.info.patientPreferences) === null || _a === void 0 ? void 0 : _a[0];
|
|
157
|
+
return (preference === null || preference === void 0 ? void 0 : preference.medId) === 'med-123' && (preference === null || preference === void 0 ? void 0 : preference.pharmacyId) === undefined;
|
|
158
|
+
},
|
|
159
|
+
})];
|
|
160
|
+
case 8:
|
|
161
|
+
// Unexpected fields in a patient preference are stripped by objectValidator, not rejected —
|
|
162
|
+
// assert they never reach the stored config (the step itself is accepted)
|
|
163
|
+
_b.sent();
|
|
164
|
+
return [3 /*break*/, 18];
|
|
165
|
+
case 9:
|
|
166
|
+
_i = 0, stepIds_1 = stepIds;
|
|
167
|
+
_b.label = 10;
|
|
168
|
+
case 10:
|
|
169
|
+
if (!(_i < stepIds_1.length)) return [3 /*break*/, 13];
|
|
170
|
+
id = stepIds_1[_i];
|
|
171
|
+
return [4 /*yield*/, sdk.api.automation_steps.deleteOne(id).catch(console.error)];
|
|
172
|
+
case 11:
|
|
173
|
+
_b.sent();
|
|
174
|
+
_b.label = 12;
|
|
175
|
+
case 12:
|
|
176
|
+
_i++;
|
|
177
|
+
return [3 /*break*/, 10];
|
|
178
|
+
case 13:
|
|
179
|
+
if (!formId) return [3 /*break*/, 15];
|
|
180
|
+
return [4 /*yield*/, sdk.api.forms.deleteOne(formId).catch(console.error)];
|
|
181
|
+
case 14:
|
|
182
|
+
_b.sent();
|
|
183
|
+
_b.label = 15;
|
|
184
|
+
case 15:
|
|
185
|
+
if (!journeyId) return [3 /*break*/, 17];
|
|
186
|
+
return [4 /*yield*/, sdk.api.journeys.deleteOne(journeyId).catch(console.error)];
|
|
187
|
+
case 16:
|
|
188
|
+
_b.sent();
|
|
189
|
+
_b.label = 17;
|
|
190
|
+
case 17: return [7 /*endfinally*/];
|
|
191
|
+
case 18: return [2 /*return*/];
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
exports.beluga_trigger_refill_tests = beluga_trigger_refill_tests;
|
|
197
|
+
if (require.main === module) {
|
|
198
|
+
console.log("Using API URL: ".concat(host));
|
|
199
|
+
var sdk_2 = new sdk_1.Session({ host: host });
|
|
200
|
+
var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
|
|
201
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
202
|
+
return __generator(this, function (_a) {
|
|
203
|
+
switch (_a.label) {
|
|
204
|
+
case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
|
|
205
|
+
case 1:
|
|
206
|
+
_a.sent();
|
|
207
|
+
return [4 /*yield*/, (0, exports.beluga_trigger_refill_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
208
|
+
case 2:
|
|
209
|
+
_a.sent();
|
|
210
|
+
return [2 /*return*/];
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}); };
|
|
214
|
+
runTests()
|
|
215
|
+
.then(function () {
|
|
216
|
+
console.log("✅ Beluga trigger refill test suite completed successfully");
|
|
217
|
+
process.exit(0);
|
|
218
|
+
})
|
|
219
|
+
.catch(function (error) {
|
|
220
|
+
console.error("❌ Beluga trigger refill test suite failed:", error);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=beluga_trigger_refill.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beluga_trigger_refill.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/beluga_trigger_refill.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start_ai_conversation.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/start_ai_conversation.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAanC,eAAO,MAAM,2BAA2B;SAAwC,OAAO;iBAAe,OAAO;mBA2N5G,CAAA"}
|
|
@@ -0,0 +1,351 @@
|
|
|
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.start_ai_conversation_tests = void 0;
|
|
60
|
+
require('source-map-support').install();
|
|
61
|
+
var sdk_1 = require("../../sdk");
|
|
62
|
+
var testing_1 = require("@tellescope/testing");
|
|
63
|
+
var setup_1 = require("../setup");
|
|
64
|
+
var host = process.env.API_URL || "http://localhost:8080";
|
|
65
|
+
var TEST_MARKER = '__TELLESCOPE_TEST_INCOMING_SMS_AUTOMATION__';
|
|
66
|
+
var TEST_PHONE = '+15555555555'; // send_sms short-circuits real sends for this number
|
|
67
|
+
// SMS AI conversations (startAIConversation journey action).
|
|
68
|
+
// Runtime flows (start/supersede/takeover/inbound absorption) require the organization to have an
|
|
69
|
+
// SMS number configured — when it doesn't (typical dev org), those sections assert the
|
|
70
|
+
// configuration error path and are otherwise skipped; config validation runs everywhere.
|
|
71
|
+
var start_ai_conversation_tests = function (_a) {
|
|
72
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
73
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
+
var users, senderId, journey, createdEnduserIds, validInfo_1, step_1, outcomeChild, processFor, phonelessEnduser, noPhoneResult, session, resolvedOrgId_1, organization, orgHasNumber, enduser_1, result, enduser, startResult, refreshed, entry, conversation, initialMessages, outbound, secondStart, activeEntries_1, stopped, takeoverStart, _b, _c, takenOver, baselineEnduser, baselineRefreshed, baselineMessages, _i, createdEnduserIds_1, id;
|
|
75
|
+
var _d;
|
|
76
|
+
var _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
77
|
+
return __generator(this, function (_p) {
|
|
78
|
+
switch (_p.label) {
|
|
79
|
+
case 0:
|
|
80
|
+
(0, testing_1.log_header)("Start AI Conversation (SMS Agent) Tests");
|
|
81
|
+
return [4 /*yield*/, sdk.api.users.getSome({})];
|
|
82
|
+
case 1:
|
|
83
|
+
users = _p.sent();
|
|
84
|
+
senderId = users[0].id;
|
|
85
|
+
return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'SMS Agent Test Journey' })];
|
|
86
|
+
case 2:
|
|
87
|
+
journey = _p.sent();
|
|
88
|
+
createdEnduserIds = [];
|
|
89
|
+
_p.label = 3;
|
|
90
|
+
case 3:
|
|
91
|
+
_p.trys.push([3, , 39, 45]);
|
|
92
|
+
validInfo_1 = {
|
|
93
|
+
channel: 'SMS',
|
|
94
|
+
senderId: senderId,
|
|
95
|
+
initialMessage: 'Hello {{enduser.fname}}! Quick question for you.',
|
|
96
|
+
prompt: 'You are texting on behalf of Test Clinic. Answer briefly.',
|
|
97
|
+
outcomes: [{ value: 'resolved', description: 'The question was answered' }],
|
|
98
|
+
};
|
|
99
|
+
return [4 /*yield*/, sdk.api.automation_steps.createOne({
|
|
100
|
+
journeyId: journey.id,
|
|
101
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
102
|
+
action: { type: 'startAIConversation', info: validInfo_1 },
|
|
103
|
+
})];
|
|
104
|
+
case 4:
|
|
105
|
+
step_1 = _p.sent();
|
|
106
|
+
(0, testing_1.assert)(step_1.action.type === 'startAIConversation' && step_1.action.info.initialMessage === validInfo_1.initialMessage, 'startAIConversation step round-trip failed', 'startAIConversation step round-trips');
|
|
107
|
+
return [4 /*yield*/, sdk.api.automation_steps.createOne({
|
|
108
|
+
journeyId: journey.id,
|
|
109
|
+
events: [{ type: 'onAIConversationOutcome', info: { automationStepId: step_1.id, outcome: 'resolved' } }],
|
|
110
|
+
action: { type: 'addEnduserTags', info: { tags: ['sms-agent-resolved'] } },
|
|
111
|
+
})];
|
|
112
|
+
case 5:
|
|
113
|
+
outcomeChild = _p.sent();
|
|
114
|
+
(0, testing_1.assert)(outcomeChild.events[0].type === 'onAIConversationOutcome', 'onAIConversationOutcome event round-trip failed', 'onAIConversationOutcome event round-trips');
|
|
115
|
+
return [4 /*yield*/, (0, testing_1.async_test)('startAIConversation without prompt is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
116
|
+
journeyId: journey.id,
|
|
117
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
118
|
+
action: { type: 'startAIConversation', info: __assign(__assign({}, validInfo_1), { prompt: undefined }) },
|
|
119
|
+
}); }, { shouldError: true, onError: function () { return true; } })];
|
|
120
|
+
case 6:
|
|
121
|
+
_p.sent();
|
|
122
|
+
return [4 /*yield*/, (0, testing_1.async_test)('startAIConversation without senderId is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
123
|
+
journeyId: journey.id,
|
|
124
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
125
|
+
action: { type: 'startAIConversation', info: __assign(__assign({}, validInfo_1), { senderId: undefined }) },
|
|
126
|
+
}); }, { shouldError: true, onError: function () { return true; } })];
|
|
127
|
+
case 7:
|
|
128
|
+
_p.sent();
|
|
129
|
+
return [4 /*yield*/, (0, testing_1.async_test)('startAIConversation without initialMessage is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
130
|
+
journeyId: journey.id,
|
|
131
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
132
|
+
action: { type: 'startAIConversation', info: __assign(__assign({}, validInfo_1), { initialMessage: undefined }) },
|
|
133
|
+
}); }, { shouldError: true, onError: function () { return true; } })];
|
|
134
|
+
case 8:
|
|
135
|
+
_p.sent();
|
|
136
|
+
return [4 /*yield*/, (0, testing_1.async_test)('startAIConversation with invalid tool is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
137
|
+
journeyId: journey.id,
|
|
138
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
139
|
+
action: { type: 'startAIConversation', info: __assign(__assign({}, validInfo_1), { tools: [{ type: 'Submit Form', info: { formId: 'not-an-id' } }] }) },
|
|
140
|
+
}); }, { shouldError: true, onError: function () { return true; } })
|
|
141
|
+
/*************** Runtime: the process endpoint ***************/
|
|
142
|
+
];
|
|
143
|
+
case 9:
|
|
144
|
+
_p.sent();
|
|
145
|
+
processFor = function (enduserId) { return __awaiter(void 0, void 0, void 0, function () {
|
|
146
|
+
var automatedAction;
|
|
147
|
+
return __generator(this, function (_a) {
|
|
148
|
+
switch (_a.label) {
|
|
149
|
+
case 0: return [4 /*yield*/, sdk.api.automated_actions.createOne({
|
|
150
|
+
enduserId: enduserId,
|
|
151
|
+
journeyId: journey.id,
|
|
152
|
+
automationStepId: step_1.id,
|
|
153
|
+
event: { type: 'onJourneyStart', info: {} },
|
|
154
|
+
action: { type: 'startAIConversation', info: validInfo_1 },
|
|
155
|
+
status: 'active',
|
|
156
|
+
processAfter: Date.now(),
|
|
157
|
+
})];
|
|
158
|
+
case 1:
|
|
159
|
+
automatedAction = _a.sent();
|
|
160
|
+
return [2 /*return*/, sdk.api.automated_actions.process({ automatedActionId: automatedAction.id })];
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}); };
|
|
164
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'sms-agent-nophone' })];
|
|
165
|
+
case 10:
|
|
166
|
+
phonelessEnduser = _p.sent();
|
|
167
|
+
createdEnduserIds.push(phonelessEnduser.id);
|
|
168
|
+
return [4 /*yield*/, processFor(phonelessEnduser.id)];
|
|
169
|
+
case 11:
|
|
170
|
+
noPhoneResult = _p.sent();
|
|
171
|
+
(0, testing_1.assert)(!noPhoneResult.success && !!noPhoneResult.error, 'phoneless start should fail with an error', 'start action errors for a contact without a phone');
|
|
172
|
+
session = sdk.userInfo;
|
|
173
|
+
resolvedOrgId_1 = __spreadArray([], ((_e = session.organizationIds) !== null && _e !== void 0 ? _e : []), true).pop() || session.businessId;
|
|
174
|
+
return [4 /*yield*/, sdk.api.organizations.getSome({})];
|
|
175
|
+
case 12:
|
|
176
|
+
organization = (_p.sent()).find(function (o) { return o.id === resolvedOrgId_1; });
|
|
177
|
+
orgHasNumber = !!(organization === null || organization === void 0 ? void 0 : organization.twilioNumber) || !!((_f = organization === null || organization === void 0 ? void 0 : organization.twilioNumbers) === null || _f === void 0 ? void 0 : _f.length);
|
|
178
|
+
if (!!orgHasNumber) return [3 /*break*/, 15];
|
|
179
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'sms-agent-nonumber', phone: TEST_PHONE })];
|
|
180
|
+
case 13:
|
|
181
|
+
enduser_1 = _p.sent();
|
|
182
|
+
createdEnduserIds.push(enduser_1.id);
|
|
183
|
+
return [4 /*yield*/, processFor(enduser_1.id)];
|
|
184
|
+
case 14:
|
|
185
|
+
result = _p.sent();
|
|
186
|
+
(0, testing_1.assert)(!result.success && /no sms number configured|ai is not enabled/i.test(result.error || ''), "expected a configuration error, got: ".concat(result.error), 'start action reports a configuration error (org has no SMS number — runtime flows skipped)');
|
|
187
|
+
return [2 /*return*/];
|
|
188
|
+
case 15: return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'sms-agent-runtime', phone: TEST_PHONE })];
|
|
189
|
+
case 16:
|
|
190
|
+
enduser = _p.sent();
|
|
191
|
+
createdEnduserIds.push(enduser.id);
|
|
192
|
+
return [4 /*yield*/, processFor(enduser.id)];
|
|
193
|
+
case 17:
|
|
194
|
+
startResult = _p.sent();
|
|
195
|
+
(0, testing_1.assert)(startResult.success === true, "start failed: ".concat(startResult.error), 'start action succeeds');
|
|
196
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
|
|
197
|
+
case 18:
|
|
198
|
+
_p.sent();
|
|
199
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
|
|
200
|
+
case 19:
|
|
201
|
+
refreshed = _p.sent();
|
|
202
|
+
entry = ((_g = refreshed.aiConversations) !== null && _g !== void 0 ? _g : []).find(function (c) { return c.active; });
|
|
203
|
+
(0, testing_1.assert)(!!entry, 'no active aiConversations entry on enduser', 'enduser has an active conversation entry');
|
|
204
|
+
(0, testing_1.assert)((entry === null || entry === void 0 ? void 0 : entry.destination) === TEST_PHONE, 'wrong destination on entry', 'conversation entry pairs the contact number');
|
|
205
|
+
return [4 /*yield*/, sdk.api.ai_conversations.getOne(entry.aiConversationId)];
|
|
206
|
+
case 20:
|
|
207
|
+
conversation = _p.sent();
|
|
208
|
+
(0, testing_1.assert)(conversation.type === 'sms_agent', 'wrong ai_conversations type', 'ai_conversations doc has type sms_agent');
|
|
209
|
+
return [4 /*yield*/, sdk.api.sms_messages.getSome({ filter: { enduserId: enduser.id } })];
|
|
210
|
+
case 21:
|
|
211
|
+
initialMessages = _p.sent();
|
|
212
|
+
outbound = initialMessages.find(function (m) { return !m.inbound && m.automationStepId === step_1.id; });
|
|
213
|
+
// exact equality on a merge-field-containing opener guards two regressions: templating must
|
|
214
|
+
// happen in send_sms (raw text on the record), and the agent-reply {{ escaping must NOT be
|
|
215
|
+
// applied to the org-authored initial message (preserveMergeFields)
|
|
216
|
+
(0, testing_1.assert)(!!outbound && outbound.message === validInfo_1.initialMessage, 'initial SMS record missing or not raw text', 'initial SMS logged with raw (untemplated) text + automationStepId');
|
|
217
|
+
return [4 /*yield*/, processFor(enduser.id)];
|
|
218
|
+
case 22:
|
|
219
|
+
secondStart = _p.sent();
|
|
220
|
+
(0, testing_1.assert)(secondStart.success === true, "second start failed: ".concat(secondStart.error), 'duplicate start succeeds (replace)');
|
|
221
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
|
|
222
|
+
case 23:
|
|
223
|
+
_p.sent();
|
|
224
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
|
|
225
|
+
case 24:
|
|
226
|
+
refreshed = _p.sent();
|
|
227
|
+
activeEntries_1 = ((_h = refreshed.aiConversations) !== null && _h !== void 0 ? _h : []).filter(function (c) { return c.active; });
|
|
228
|
+
(0, testing_1.assert)(activeEntries_1.length === 1, 'expected exactly one active conversation', 'supersede leaves exactly one active conversation');
|
|
229
|
+
(0, testing_1.assert)(activeEntries_1[0].aiConversationId !== entry.aiConversationId, 'active conversation was not replaced', 'supersede started a fresh conversation');
|
|
230
|
+
// inbound absorption via the testing hook: STOP ends the conversation
|
|
231
|
+
return [4 /*yield*/, sdk.api.sms_messages.createOne({
|
|
232
|
+
enduserId: enduser.id,
|
|
233
|
+
message: "stop".concat(TEST_MARKER),
|
|
234
|
+
inbound: true,
|
|
235
|
+
logOnly: true,
|
|
236
|
+
phoneNumber: activeEntries_1[0].source,
|
|
237
|
+
enduserPhoneNumber: TEST_PHONE,
|
|
238
|
+
})];
|
|
239
|
+
case 25:
|
|
240
|
+
// inbound absorption via the testing hook: STOP ends the conversation
|
|
241
|
+
_p.sent();
|
|
242
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 2000)];
|
|
243
|
+
case 26:
|
|
244
|
+
_p.sent();
|
|
245
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
|
|
246
|
+
case 27:
|
|
247
|
+
refreshed = _p.sent();
|
|
248
|
+
stopped = ((_j = refreshed.aiConversations) !== null && _j !== void 0 ? _j : []).find(function (c) { return c.aiConversationId === activeEntries_1[0].aiConversationId; });
|
|
249
|
+
(0, testing_1.assert)((stopped === null || stopped === void 0 ? void 0 : stopped.active) === false && (stopped === null || stopped === void 0 ? void 0 : stopped.endedReason) === 'unsubscribed', "STOP did not end the conversation (".concat(JSON.stringify(stopped), ")"), 'STOP reply ends the conversation');
|
|
250
|
+
return [4 /*yield*/, processFor(enduser.id)];
|
|
251
|
+
case 28:
|
|
252
|
+
takeoverStart = _p.sent();
|
|
253
|
+
(0, testing_1.assert)(takeoverStart.success === true, "takeover-start failed: ".concat(takeoverStart.error), 'start (for takeover test) succeeds');
|
|
254
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
|
|
255
|
+
case 29:
|
|
256
|
+
_p.sent();
|
|
257
|
+
_c = (_b = sdk.api.sms_messages).createOne;
|
|
258
|
+
_d = {
|
|
259
|
+
enduserId: enduser.id,
|
|
260
|
+
message: 'Hi, this is a real person taking over.',
|
|
261
|
+
inbound: false
|
|
262
|
+
};
|
|
263
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
|
|
264
|
+
case 30: return [4 /*yield*/, _c.apply(_b, [(_d.phoneNumber = (_l = (_k = (_p.sent()).aiConversations) === null || _k === void 0 ? void 0 : _k.find(function (c) { return c.active; })) === null || _l === void 0 ? void 0 : _l.source,
|
|
265
|
+
_d.enduserPhoneNumber = TEST_PHONE,
|
|
266
|
+
_d)])];
|
|
267
|
+
case 31:
|
|
268
|
+
_p.sent();
|
|
269
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 2000)];
|
|
270
|
+
case 32:
|
|
271
|
+
_p.sent();
|
|
272
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(enduser.id)];
|
|
273
|
+
case 33:
|
|
274
|
+
refreshed = _p.sent();
|
|
275
|
+
takenOver = ((_m = refreshed.aiConversations) !== null && _m !== void 0 ? _m : []).find(function (c) { return c.endedReason === 'staff-takeover'; });
|
|
276
|
+
(0, testing_1.assert)(!!takenOver, 'no staff-takeover ended entry found', 'manual staff SMS ends the conversation (takeover)');
|
|
277
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'sms-agent-baseline', phone: '+15555555554' })];
|
|
278
|
+
case 34:
|
|
279
|
+
baselineEnduser = _p.sent();
|
|
280
|
+
createdEnduserIds.push(baselineEnduser.id);
|
|
281
|
+
return [4 /*yield*/, sdk.api.sms_messages.createOne({
|
|
282
|
+
enduserId: baselineEnduser.id,
|
|
283
|
+
message: "hello there".concat(TEST_MARKER),
|
|
284
|
+
inbound: true,
|
|
285
|
+
logOnly: true,
|
|
286
|
+
phoneNumber: activeEntries_1[0].source,
|
|
287
|
+
enduserPhoneNumber: '+15555555554',
|
|
288
|
+
})];
|
|
289
|
+
case 35:
|
|
290
|
+
_p.sent();
|
|
291
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 2000)];
|
|
292
|
+
case 36:
|
|
293
|
+
_p.sent();
|
|
294
|
+
return [4 /*yield*/, sdk.api.endusers.getOne(baselineEnduser.id)];
|
|
295
|
+
case 37:
|
|
296
|
+
baselineRefreshed = _p.sent();
|
|
297
|
+
return [4 /*yield*/, sdk.api.sms_messages.getSome({ filter: { enduserId: baselineEnduser.id } })];
|
|
298
|
+
case 38:
|
|
299
|
+
baselineMessages = _p.sent();
|
|
300
|
+
(0, testing_1.assert)(!((_o = baselineRefreshed.aiConversations) !== null && _o !== void 0 ? _o : []).length && !baselineMessages.find(function (m) { return !m.inbound; }), 'AI artifacts appeared for an enduser with no conversation', 'no-conversation inbound produces zero AI artifacts (regression baseline)');
|
|
301
|
+
return [3 /*break*/, 45];
|
|
302
|
+
case 39: return [4 /*yield*/, sdk.api.journeys.deleteOne(journey.id).catch(function () { })];
|
|
303
|
+
case 40:
|
|
304
|
+
_p.sent();
|
|
305
|
+
_i = 0, createdEnduserIds_1 = createdEnduserIds;
|
|
306
|
+
_p.label = 41;
|
|
307
|
+
case 41:
|
|
308
|
+
if (!(_i < createdEnduserIds_1.length)) return [3 /*break*/, 44];
|
|
309
|
+
id = createdEnduserIds_1[_i];
|
|
310
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(id).catch(function () { })];
|
|
311
|
+
case 42:
|
|
312
|
+
_p.sent();
|
|
313
|
+
_p.label = 43;
|
|
314
|
+
case 43:
|
|
315
|
+
_i++;
|
|
316
|
+
return [3 /*break*/, 41];
|
|
317
|
+
case 44: return [7 /*endfinally*/];
|
|
318
|
+
case 45: return [2 /*return*/];
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
exports.start_ai_conversation_tests = start_ai_conversation_tests;
|
|
324
|
+
// Allow running this test file independently
|
|
325
|
+
if (require.main === module) {
|
|
326
|
+
var sdk_2 = new sdk_1.Session({ host: host });
|
|
327
|
+
var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
|
|
328
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
329
|
+
return __generator(this, function (_a) {
|
|
330
|
+
switch (_a.label) {
|
|
331
|
+
case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
|
|
332
|
+
case 1:
|
|
333
|
+
_a.sent();
|
|
334
|
+
return [4 /*yield*/, (0, exports.start_ai_conversation_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
335
|
+
case 2:
|
|
336
|
+
_a.sent();
|
|
337
|
+
return [2 /*return*/];
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}); };
|
|
341
|
+
runTests()
|
|
342
|
+
.then(function () {
|
|
343
|
+
console.log("✅ Start AI Conversation test suite completed successfully");
|
|
344
|
+
process.exit(0);
|
|
345
|
+
})
|
|
346
|
+
.catch(function (error) {
|
|
347
|
+
console.error("❌ Start AI Conversation test suite failed:", error);
|
|
348
|
+
process.exit(1);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=start_ai_conversation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start_ai_conversation.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/start_ai_conversation.test.ts"],"names":[],"mappings":"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"}
|