@tellescope/sdk 1.254.0 → 1.254.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.
Files changed (71) hide show
  1. package/lib/cjs/tests/api_tests/ai_decision_summary_config.test.d.ts +16 -0
  2. package/lib/cjs/tests/api_tests/ai_decision_summary_config.test.d.ts.map +1 -0
  3. package/lib/cjs/tests/api_tests/ai_decision_summary_config.test.js +187 -0
  4. package/lib/cjs/tests/api_tests/ai_decision_summary_config.test.js.map +1 -0
  5. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.d.ts +6 -0
  6. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.d.ts.map +1 -0
  7. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.js +443 -0
  8. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.js.map +1 -0
  9. package/lib/cjs/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.d.ts +21 -0
  10. package/lib/cjs/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.js +362 -0
  12. package/lib/cjs/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/security/F-0145-globalunique-leak.test.d.ts +20 -0
  14. package/lib/cjs/tests/api_tests/security/F-0145-globalunique-leak.test.d.ts.map +1 -0
  15. package/lib/cjs/tests/api_tests/security/F-0145-globalunique-leak.test.js +139 -0
  16. package/lib/cjs/tests/api_tests/security/F-0145-globalunique-leak.test.js.map +1 -0
  17. package/lib/cjs/tests/api_tests/security/F-0151-load-inbox-redaction.test.d.ts +18 -0
  18. package/lib/cjs/tests/api_tests/security/F-0151-load-inbox-redaction.test.d.ts.map +1 -0
  19. package/lib/cjs/tests/api_tests/security/F-0151-load-inbox-redaction.test.js +156 -0
  20. package/lib/cjs/tests/api_tests/security/F-0151-load-inbox-redaction.test.js.map +1 -0
  21. package/lib/cjs/tests/api_tests/security/F-0155-webhook-timeout.test.d.ts +20 -0
  22. package/lib/cjs/tests/api_tests/security/F-0155-webhook-timeout.test.d.ts.map +1 -0
  23. package/lib/cjs/tests/api_tests/security/F-0155-webhook-timeout.test.js +157 -0
  24. package/lib/cjs/tests/api_tests/security/F-0155-webhook-timeout.test.js.map +1 -0
  25. package/lib/cjs/tests/setup.d.ts.map +1 -1
  26. package/lib/cjs/tests/setup.js +20 -1
  27. package/lib/cjs/tests/setup.js.map +1 -1
  28. package/lib/cjs/tests/tests.d.ts.map +1 -1
  29. package/lib/cjs/tests/tests.js +175 -155
  30. package/lib/cjs/tests/tests.js.map +1 -1
  31. package/lib/esm/sdk.d.ts +2 -2
  32. package/lib/esm/tests/api_tests/ai_decision_summary_config.test.d.ts +16 -0
  33. package/lib/esm/tests/api_tests/ai_decision_summary_config.test.d.ts.map +1 -0
  34. package/lib/esm/tests/api_tests/ai_decision_summary_config.test.js +183 -0
  35. package/lib/esm/tests/api_tests/ai_decision_summary_config.test.js.map +1 -0
  36. package/lib/esm/tests/api_tests/mdi_case_offerings.test.d.ts +6 -0
  37. package/lib/esm/tests/api_tests/mdi_case_offerings.test.d.ts.map +1 -0
  38. package/lib/esm/tests/api_tests/mdi_case_offerings.test.js +439 -0
  39. package/lib/esm/tests/api_tests/mdi_case_offerings.test.js.map +1 -0
  40. package/lib/esm/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.d.ts +21 -0
  41. package/lib/esm/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.d.ts.map +1 -0
  42. package/lib/esm/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.js +358 -0
  43. package/lib/esm/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.js.map +1 -0
  44. package/lib/esm/tests/api_tests/security/F-0145-globalunique-leak.test.d.ts +20 -0
  45. package/lib/esm/tests/api_tests/security/F-0145-globalunique-leak.test.d.ts.map +1 -0
  46. package/lib/esm/tests/api_tests/security/F-0145-globalunique-leak.test.js +135 -0
  47. package/lib/esm/tests/api_tests/security/F-0145-globalunique-leak.test.js.map +1 -0
  48. package/lib/esm/tests/api_tests/security/F-0151-load-inbox-redaction.test.d.ts +18 -0
  49. package/lib/esm/tests/api_tests/security/F-0151-load-inbox-redaction.test.d.ts.map +1 -0
  50. package/lib/esm/tests/api_tests/security/F-0151-load-inbox-redaction.test.js +152 -0
  51. package/lib/esm/tests/api_tests/security/F-0151-load-inbox-redaction.test.js.map +1 -0
  52. package/lib/esm/tests/api_tests/security/F-0155-webhook-timeout.test.d.ts +20 -0
  53. package/lib/esm/tests/api_tests/security/F-0155-webhook-timeout.test.d.ts.map +1 -0
  54. package/lib/esm/tests/api_tests/security/F-0155-webhook-timeout.test.js +150 -0
  55. package/lib/esm/tests/api_tests/security/F-0155-webhook-timeout.test.js.map +1 -0
  56. package/lib/esm/tests/setup.d.ts.map +1 -1
  57. package/lib/esm/tests/setup.js +20 -1
  58. package/lib/esm/tests/setup.js.map +1 -1
  59. package/lib/esm/tests/tests.d.ts.map +1 -1
  60. package/lib/esm/tests/tests.js +175 -155
  61. package/lib/esm/tests/tests.js.map +1 -1
  62. package/lib/tsconfig.tsbuildinfo +1 -1
  63. package/package.json +10 -10
  64. package/src/tests/api_tests/mdi_case_offerings.test.ts +414 -0
  65. package/src/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.ts +221 -0
  66. package/src/tests/api_tests/security/F-0145-globalunique-leak.test.ts +78 -0
  67. package/src/tests/api_tests/security/F-0151-load-inbox-redaction.test.ts +81 -0
  68. package/src/tests/api_tests/security/F-0155-webhook-timeout.test.ts +85 -0
  69. package/src/tests/setup.ts +9 -0
  70. package/src/tests/tests.ts +10 -0
  71. package/test_generated.pdf +0 -0
@@ -0,0 +1,439 @@
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 } from "../../sdk";
39
+ import { async_test, log_header, } from "@tellescope/testing";
40
+ import { setup_tests } from "../setup";
41
+ import { evaluate_conditional_logic, evaluate_string_field_comparison } from "@tellescope/utilities";
42
+ var host = process.env.API_URL || 'http://localhost:8080';
43
+ // Local replica of the API's resolve_case_offerings (md_integrations.ts), built
44
+ // from the same shared @tellescope/utilities helpers it uses, so we can assert
45
+ // the resolution behavior from the SDK test harness.
46
+ var is_empty_conditions = function (conditions) {
47
+ if (!conditions || !Object.keys(conditions).length)
48
+ return true;
49
+ var condition = conditions.condition;
50
+ if (condition !== undefined)
51
+ return !Object.keys(condition).length;
52
+ return false;
53
+ };
54
+ var resolve_case_offerings = function (offerings, responses) { return (offerings.filter(function (o) {
55
+ if (!o.conditions || is_empty_conditions(o.conditions))
56
+ return true;
57
+ return evaluate_conditional_logic(o.conditions, function (key, value) { var _a; return evaluate_string_field_comparison((_a = responses.find(function (r) { return r.externalId === key; })) === null || _a === void 0 ? void 0 : _a.value, value); });
58
+ })); };
59
+ var to_number = function (v) {
60
+ var n = typeof v === 'number' ? v : parseFloat(String(v !== null && v !== void 0 ? v : ''));
61
+ return Number.isFinite(n) ? n : undefined;
62
+ };
63
+ var enduser_height_to_cm = function (h) {
64
+ var inches = to_number(h === null || h === void 0 ? void 0 : h.value);
65
+ if (inches === undefined)
66
+ return undefined;
67
+ return Math.round(inches * 2.54);
68
+ };
69
+ var enduser_weight_to_kg = function (w) {
70
+ var lbs = to_number(w === null || w === void 0 ? void 0 : w.value);
71
+ if (lbs === undefined)
72
+ return undefined;
73
+ return Math.round(lbs * 0.45359237 * 100) / 100;
74
+ };
75
+ var PATIENT_MAPPED_EXTERNAL_IDS = new Set([
76
+ 'fname', 'first_name', 'lname', 'last_name',
77
+ 'email', 'dateOfBirth', 'gender', 'phone', 'address',
78
+ 'height', 'weight',
79
+ 'allergies', 'current_medications', 'medical_conditions', 'special_necessities', 'pregnancy',
80
+ 'intro_video_id',
81
+ ]);
82
+ // Mirrors the externalId exclusion step in form_response_to_case_questions:
83
+ // patient-mapped fields are dropped, everything else survives.
84
+ var case_question_external_ids = function (responses) { return (responses
85
+ .filter(function (r) { return !(r.externalId && PATIENT_MAPPED_EXTERNAL_IDS.has(r.externalId)); })
86
+ .map(function (r) { return r.externalId; })
87
+ .filter(function (id) { return id !== undefined; })); };
88
+ var resolve_displayed_options = function (response, formFields) {
89
+ var _a, _b;
90
+ if (formFields === void 0) { formFields = []; }
91
+ var field = (formFields.find(function (f) { return f._id.toString() === response.fieldId; })
92
+ || formFields.find(function (f) { return response.externalId && f.externalId === response.externalId; }));
93
+ return ((response.answer.type === 'multiple_choice' || response.answer.type === 'Dropdown')
94
+ && ((_b = (_a = field === null || field === void 0 ? void 0 : field.options) === null || _a === void 0 ? void 0 : _a.choices) === null || _b === void 0 ? void 0 : _b.length)) ? field.options.choices : undefined;
95
+ };
96
+ export var mdi_case_offerings_tests = function (_a) {
97
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
98
+ return __awaiter(void 0, void 0, void 0, function () {
99
+ var testFormId, MIXED_1;
100
+ return __generator(this, function (_b) {
101
+ switch (_b.label) {
102
+ case 0:
103
+ log_header("MDI Case Offerings Tests");
104
+ _b.label = 1;
105
+ case 1:
106
+ _b.trys.push([1, , 18, 21]);
107
+ // --- Schema round-trip tests ---
108
+ return [4 /*yield*/, async_test("Create form with mdiCaseOfferings mixing unconditional and conditional entries", function () { return __awaiter(void 0, void 0, void 0, function () {
109
+ var offerings, form, fetched;
110
+ var _a, _b, _c;
111
+ return __generator(this, function (_d) {
112
+ switch (_d.label) {
113
+ case 0:
114
+ offerings = [
115
+ { offering_id: "offering-always" },
116
+ { offering_id: "offering-ca", conditions: { condition: { state: "CA" } } },
117
+ {
118
+ offering_id: "offering-ca-glp",
119
+ conditions: { $and: [{ condition: { state: "CA" } }, { condition: { med_type: "weightLoss" } }] },
120
+ },
121
+ ];
122
+ return [4 /*yield*/, sdk.api.forms.createOne({
123
+ title: 'MDI Case Offerings Test Form',
124
+ mdiCaseOfferings: offerings,
125
+ })];
126
+ case 1:
127
+ form = _d.sent();
128
+ testFormId = form.id;
129
+ return [4 /*yield*/, sdk.api.forms.getOne(form.id)];
130
+ case 2:
131
+ fetched = _d.sent();
132
+ return [2 /*return*/, (((_a = fetched.mdiCaseOfferings) === null || _a === void 0 ? void 0 : _a.length) === 3
133
+ && fetched.mdiCaseOfferings[0].offering_id === "offering-always"
134
+ && fetched.mdiCaseOfferings[0].conditions === undefined
135
+ && !!((_b = fetched.mdiCaseOfferings[1].conditions) === null || _b === void 0 ? void 0 : _b.condition)
136
+ && !!((_c = fetched.mdiCaseOfferings[2].conditions) === null || _c === void 0 ? void 0 : _c.$and))];
137
+ }
138
+ });
139
+ }); }, { expectedResult: true })];
140
+ case 2:
141
+ // --- Schema round-trip tests ---
142
+ _b.sent();
143
+ return [4 /*yield*/, async_test("Backwards-compat: existing flat { offering_id } config still validates", function () { return __awaiter(void 0, void 0, void 0, function () {
144
+ var flat, fetched;
145
+ var _a;
146
+ return __generator(this, function (_b) {
147
+ switch (_b.label) {
148
+ case 0:
149
+ if (!testFormId)
150
+ throw new Error("No test form");
151
+ flat = [
152
+ { offering_id: "legacy-1" },
153
+ { offering_id: "legacy-2" },
154
+ ];
155
+ return [4 /*yield*/, sdk.api.forms.updateOne(testFormId, { mdiCaseOfferings: flat }, { replaceObjectFields: true })];
156
+ case 1:
157
+ _b.sent();
158
+ return [4 /*yield*/, sdk.api.forms.getOne(testFormId)];
159
+ case 2:
160
+ fetched = _b.sent();
161
+ return [2 /*return*/, (((_a = fetched.mdiCaseOfferings) === null || _a === void 0 ? void 0 : _a.length) === 2
162
+ && fetched.mdiCaseOfferings.every(function (o) { return o.conditions === undefined; }))];
163
+ }
164
+ });
165
+ }); }, { expectedResult: true })];
166
+ case 3:
167
+ _b.sent();
168
+ return [4 /*yield*/, async_test("Save nested CompoundFilter conditions on an offering and read back", function () { return __awaiter(void 0, void 0, void 0, function () {
169
+ var nested, fetched;
170
+ var _a, _b;
171
+ return __generator(this, function (_c) {
172
+ switch (_c.label) {
173
+ case 0:
174
+ if (!testFormId)
175
+ throw new Error("No test form");
176
+ nested = [
177
+ {
178
+ offering_id: "offering-nested",
179
+ conditions: {
180
+ $and: [
181
+ { $or: [{ condition: { state: "CA" } }, { condition: { state: "NY" } }] },
182
+ { condition: { med_type: "weightLoss" } },
183
+ ],
184
+ },
185
+ },
186
+ ];
187
+ return [4 /*yield*/, sdk.api.forms.updateOne(testFormId, { mdiCaseOfferings: nested }, { replaceObjectFields: true })];
188
+ case 1:
189
+ _c.sent();
190
+ return [4 /*yield*/, sdk.api.forms.getOne(testFormId)];
191
+ case 2:
192
+ fetched = _c.sent();
193
+ return [2 /*return*/, (((_a = fetched.mdiCaseOfferings) === null || _a === void 0 ? void 0 : _a.length) === 1
194
+ && !!((_b = fetched.mdiCaseOfferings[0].conditions) === null || _b === void 0 ? void 0 : _b.$and))];
195
+ }
196
+ });
197
+ }); }, { expectedResult: true })
198
+ // --- resolve_case_offerings behavior tests ---
199
+ ];
200
+ case 4:
201
+ _b.sent();
202
+ MIXED_1 = [
203
+ { offering_id: "always" },
204
+ { offering_id: "ca-only", conditions: { condition: { state: "CA" } } },
205
+ { offering_id: "ny-only", conditions: { condition: { state: "NY" } } },
206
+ ];
207
+ return [4 /*yield*/, async_test("Resolver returns exactly the matching subset plus unconditional offerings", function () { return __awaiter(void 0, void 0, void 0, function () {
208
+ var resolved;
209
+ return __generator(this, function (_a) {
210
+ resolved = resolve_case_offerings(MIXED_1, [{ externalId: "state", value: "CA" }]);
211
+ return [2 /*return*/, (resolved.length === 2
212
+ && resolved.some(function (o) { return o.offering_id === "always"; })
213
+ && resolved.some(function (o) { return o.offering_id === "ca-only"; })
214
+ && !resolved.some(function (o) { return o.offering_id === "ny-only"; }))];
215
+ });
216
+ }); }, { expectedResult: true })];
217
+ case 5:
218
+ _b.sent();
219
+ return [4 /*yield*/, async_test("Send none: when conditions match nothing, only unconditional offerings remain", function () { return __awaiter(void 0, void 0, void 0, function () {
220
+ var allConditional, resolved;
221
+ return __generator(this, function (_a) {
222
+ allConditional = [
223
+ { offering_id: "ca-only", conditions: { condition: { state: "CA" } } },
224
+ { offering_id: "ny-only", conditions: { condition: { state: "NY" } } },
225
+ ];
226
+ resolved = resolve_case_offerings(allConditional, [{ externalId: "state", value: "TX" }]);
227
+ return [2 /*return*/, resolved.length === 0];
228
+ });
229
+ }); }, { expectedResult: true })];
230
+ case 6:
231
+ _b.sent();
232
+ return [4 /*yield*/, async_test("Backwards compat: all-unconditional config sends everything", function () { return __awaiter(void 0, void 0, void 0, function () {
233
+ var allUnconditional, resolved;
234
+ return __generator(this, function (_a) {
235
+ allUnconditional = [
236
+ { offering_id: "a" },
237
+ { offering_id: "b" },
238
+ { offering_id: "c" },
239
+ ];
240
+ resolved = resolve_case_offerings(allUnconditional, [{ externalId: "state", value: "TX" }]);
241
+ return [2 /*return*/, resolved.length === 3];
242
+ });
243
+ }); }, { expectedResult: true })];
244
+ case 7:
245
+ _b.sent();
246
+ return [4 /*yield*/, async_test("Empty/blank conditions object is treated as unconditional (always sent)", function () { return __awaiter(void 0, void 0, void 0, function () {
247
+ var withBlank, resolved;
248
+ return __generator(this, function (_a) {
249
+ withBlank = [
250
+ { offering_id: "blank", conditions: { condition: {} } },
251
+ ];
252
+ resolved = resolve_case_offerings(withBlank, []);
253
+ return [2 /*return*/, resolved.length === 1 && resolved[0].offering_id === "blank"];
254
+ });
255
+ }); }, { expectedResult: true })];
256
+ case 8:
257
+ _b.sent();
258
+ return [4 /*yield*/, async_test("$or conditions: offering sent when any branch matches", function () { return __awaiter(void 0, void 0, void 0, function () {
259
+ var offerings, resolved;
260
+ return __generator(this, function (_a) {
261
+ offerings = [
262
+ { offering_id: "ca-or-ny", conditions: { $or: [{ condition: { state: "CA" } }, { condition: { state: "NY" } }] } },
263
+ ];
264
+ resolved = resolve_case_offerings(offerings, [{ externalId: "state", value: "NY" }]);
265
+ return [2 /*return*/, resolved.length === 1];
266
+ });
267
+ }); }, { expectedResult: true })];
268
+ case 9:
269
+ _b.sent();
270
+ return [4 /*yield*/, async_test("$contains operator narrows offerings by substring match", function () { return __awaiter(void 0, void 0, void 0, function () {
271
+ var offerings, matches, misses;
272
+ return __generator(this, function (_a) {
273
+ offerings = [
274
+ { offering_id: "glp", conditions: { condition: { meds: { $contains: "GLP" } } } },
275
+ ];
276
+ matches = resolve_case_offerings(offerings, [{ externalId: "meds", value: "GLP-1 agonist" }]);
277
+ misses = resolve_case_offerings(offerings, [{ externalId: "meds", value: "Semaglutide" }]);
278
+ return [2 /*return*/, matches.length === 1 && misses.length === 0];
279
+ });
280
+ }); }, { expectedResult: true })
281
+ // --- height/weight conversion tests ---
282
+ ];
283
+ case 10:
284
+ _b.sent();
285
+ // --- height/weight conversion tests ---
286
+ return [4 /*yield*/, async_test("enduser_height_to_cm converts Inches → integer centimeters", function () { return __awaiter(void 0, void 0, void 0, function () {
287
+ return __generator(this, function (_a) {
288
+ return [2 /*return*/, (enduser_height_to_cm({ value: 70, unit: 'Inches' }) === 178
289
+ && enduser_height_to_cm({ value: '70', unit: 'Inches' }) === 178 // string value parsed
290
+ && enduser_height_to_cm(undefined) === undefined // absent → omitted
291
+ && enduser_height_to_cm({ value: '', unit: 'Inches' }) === undefined)];
292
+ });
293
+ }); }, { expectedResult: true })];
294
+ case 11:
295
+ // --- height/weight conversion tests ---
296
+ _b.sent();
297
+ return [4 /*yield*/, async_test("enduser_weight_to_kg converts Pounds → kilograms (float, 2dp)", function () { return __awaiter(void 0, void 0, void 0, function () {
298
+ return __generator(this, function (_a) {
299
+ return [2 /*return*/, (enduser_weight_to_kg({ value: 200, unit: 'Pounds' }) === 90.72
300
+ && enduser_weight_to_kg({ value: '200', unit: 'Pounds' }) === 90.72 // string value parsed
301
+ && enduser_weight_to_kg(undefined) === undefined // absent → omitted
302
+ && enduser_weight_to_kg({ value: 'not-a-number', unit: 'Pounds' }) === undefined)];
303
+ });
304
+ }); }, { expectedResult: true })
305
+ // --- case_questions exclusion tests ---
306
+ ];
307
+ case 12:
308
+ _b.sent();
309
+ // --- case_questions exclusion tests ---
310
+ return [4 /*yield*/, async_test("case_questions exclude patient-mapped fields but keep non-mapped clinical answers", function () { return __awaiter(void 0, void 0, void 0, function () {
311
+ var responses, kept, excluded;
312
+ return __generator(this, function (_a) {
313
+ responses = [
314
+ { externalId: 'fname' },
315
+ { externalId: 'email' },
316
+ { externalId: 'dateOfBirth' },
317
+ { externalId: 'gender' },
318
+ { externalId: 'phone' },
319
+ { externalId: 'address' },
320
+ { externalId: 'height' },
321
+ { externalId: 'weight' },
322
+ { externalId: 'allergies' },
323
+ { externalId: 'special_necessities' },
324
+ { externalId: 'symptoms' },
325
+ { externalId: 'duration' }, // non-mapped clinical field → survives
326
+ ];
327
+ kept = case_question_external_ids(responses);
328
+ excluded = ['fname', 'email', 'dateOfBirth', 'gender', 'phone', 'address', 'height', 'weight', 'allergies', 'special_necessities'];
329
+ return [2 /*return*/, (kept.length === 2
330
+ && kept.includes('symptoms')
331
+ && kept.includes('duration')
332
+ && excluded.every(function (id) { return !kept.includes(id); }))];
333
+ });
334
+ }); }, { expectedResult: true })
335
+ // --- displayed_options tests ---
336
+ ];
337
+ case 13:
338
+ // --- case_questions exclusion tests ---
339
+ _b.sent();
340
+ // --- displayed_options tests ---
341
+ return [4 /*yield*/, async_test("multiple_choice response + matching field by _id → displayed_options equals field choices", function () { return __awaiter(void 0, void 0, void 0, function () {
342
+ var fields, response, opts;
343
+ return __generator(this, function (_a) {
344
+ fields = [
345
+ { _id: 'field-1', options: { choices: ['Yes', 'No', 'Maybe'] } },
346
+ ];
347
+ response = { fieldId: 'field-1', answer: { type: 'multiple_choice' } };
348
+ opts = resolve_displayed_options(response, fields);
349
+ return [2 /*return*/, (!!opts
350
+ && opts.length === 3
351
+ && opts[0] === 'Yes' && opts[1] === 'No' && opts[2] === 'Maybe')];
352
+ });
353
+ }); }, { expectedResult: true })];
354
+ case 14:
355
+ // --- displayed_options tests ---
356
+ _b.sent();
357
+ return [4 /*yield*/, async_test("Dropdown response + matching field by externalId → displayed_options equals field choices", function () { return __awaiter(void 0, void 0, void 0, function () {
358
+ var fields, response, opts;
359
+ return __generator(this, function (_a) {
360
+ fields = [
361
+ { _id: 'field-2', externalId: 'state', options: { choices: ['CA', 'NY', 'TX'] } },
362
+ ];
363
+ response = { fieldId: '', externalId: 'state', answer: { type: 'Dropdown' } };
364
+ opts = resolve_displayed_options(response, fields);
365
+ return [2 /*return*/, !!opts && opts.length === 3 && opts.join(',') === 'CA,NY,TX'];
366
+ });
367
+ }); }, { expectedResult: true })];
368
+ case 15:
369
+ _b.sent();
370
+ return [4 /*yield*/, async_test("string/number response → displayed_options undefined even with field choices present", function () { return __awaiter(void 0, void 0, void 0, function () {
371
+ var fields, stringResponse, numberResponse;
372
+ return __generator(this, function (_a) {
373
+ fields = [
374
+ { _id: 'field-3', options: { choices: ['Yes', 'No'] } },
375
+ ];
376
+ stringResponse = { fieldId: 'field-3', answer: { type: 'string' } };
377
+ numberResponse = { fieldId: 'field-3', answer: { type: 'number' } };
378
+ return [2 /*return*/, (resolve_displayed_options(stringResponse, fields) === undefined
379
+ && resolve_displayed_options(numberResponse, fields) === undefined)];
380
+ });
381
+ }); }, { expectedResult: true })];
382
+ case 16:
383
+ _b.sent();
384
+ return [4 /*yield*/, async_test("multiple_choice response with no matching field → displayed_options undefined (question still kept)", function () { return __awaiter(void 0, void 0, void 0, function () {
385
+ var fields, noMatch, emptyChoices, fieldsEmpty;
386
+ return __generator(this, function (_a) {
387
+ fields = [
388
+ { _id: 'field-4', externalId: 'other', options: { choices: ['A', 'B'] } },
389
+ ];
390
+ noMatch = { fieldId: 'field-unknown', externalId: 'unknown', answer: { type: 'multiple_choice' } };
391
+ emptyChoices = { fieldId: 'field-5', answer: { type: 'multiple_choice' } };
392
+ fieldsEmpty = [{ _id: 'field-5', options: { choices: [] } }];
393
+ return [2 /*return*/, (resolve_displayed_options(noMatch, fields) === undefined
394
+ && resolve_displayed_options(emptyChoices, fieldsEmpty) === undefined)];
395
+ });
396
+ }); }, { expectedResult: true })];
397
+ case 17:
398
+ _b.sent();
399
+ return [3 /*break*/, 21];
400
+ case 18:
401
+ if (!testFormId) return [3 /*break*/, 20];
402
+ return [4 /*yield*/, sdk.api.forms.deleteOne(testFormId).catch(console.error)];
403
+ case 19:
404
+ _b.sent();
405
+ _b.label = 20;
406
+ case 20: return [7 /*endfinally*/];
407
+ case 21: return [2 /*return*/];
408
+ }
409
+ });
410
+ });
411
+ };
412
+ if (require.main === module) {
413
+ console.log("Using API URL: ".concat(host));
414
+ var sdk_1 = new Session({ host: host });
415
+ var sdkNonAdmin_1 = new Session({ host: host });
416
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
417
+ return __generator(this, function (_a) {
418
+ switch (_a.label) {
419
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
420
+ case 1:
421
+ _a.sent();
422
+ return [4 /*yield*/, mdi_case_offerings_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
423
+ case 2:
424
+ _a.sent();
425
+ return [2 /*return*/];
426
+ }
427
+ });
428
+ }); };
429
+ runTests()
430
+ .then(function () {
431
+ console.log("MDI case offerings test suite completed successfully");
432
+ process.exit(0);
433
+ })
434
+ .catch(function (error) {
435
+ console.error("MDI case offerings test suite failed:", error);
436
+ process.exit(1);
437
+ });
438
+ }
439
+ //# sourceMappingURL=mdi_case_offerings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdi_case_offerings.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/mdi_case_offerings.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Session } from "../../../sdk";
2
+ /**
3
+ * Regression test for the enduser cross-enduser CREATE gating gaps:
4
+ * F-0116 enduser_observations (security-audit/findings/F-0116-*.md)
5
+ * F-0117 enduser_orders (security-audit/findings/F-0117-*.md)
6
+ * F-0119 managed_content_records (security-audit/findings/F-0119-*.md)
7
+ * F-0118 chat_rooms (enduserIds-only gate; staff userIds targeting is by-design)
8
+ *
9
+ * Each model exposed enduserActions.create with an `enduserId`/`enduserIds` field that
10
+ * lacked a write-side gate, letting an authenticated enduser create records bound to a
11
+ * DIFFERENT enduser in the same tenant. The fix adds a `constraints.relationship`
12
+ * evaluator mirroring the canonical `tickets` pattern (schema.ts).
13
+ *
14
+ * Methodology: each section asserts BOTH the exploit-is-blocked case AND that the
15
+ * legitimate path (self-create + staff-create) still works.
16
+ */
17
+ export declare const enduser_cross_create_tests: ({ sdk }: {
18
+ sdk: Session;
19
+ sdkNonAdmin: Session;
20
+ }) => Promise<void>;
21
+ //# sourceMappingURL=F-0116-F-0119-enduser-cross-create.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"F-0116-F-0119-enduser-cross-create.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0116-F-0119-enduser-cross-create.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAA;AActD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,0BAA0B;SAA2B,OAAO;iBAAe,OAAO;mBAuK9F,CAAA"}