@tellescope/sdk 1.256.8 → 1.256.10
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/appointment_link_expiration.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/appointment_link_expiration.test.js +12 -9
- package/lib/cjs/tests/api_tests/appointment_link_expiration.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/create_note_action.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/create_note_action.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/create_note_action.test.js +237 -0
- package/lib/cjs/tests/api_tests/create_note_action.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/readonly-enduser-preview.test.d.ts +29 -0
- package/lib/cjs/tests/api_tests/security/readonly-enduser-preview.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/readonly-enduser-preview.test.js +472 -0
- package/lib/cjs/tests/api_tests/security/readonly-enduser-preview.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.js +262 -0
- package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +236 -201
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/tests/api_tests/appointment_link_expiration.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/appointment_link_expiration.test.js +12 -9
- package/lib/esm/tests/api_tests/appointment_link_expiration.test.js.map +1 -1
- package/lib/esm/tests/api_tests/create_note_action.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/create_note_action.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/create_note_action.test.js +233 -0
- package/lib/esm/tests/api_tests/create_note_action.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/readonly-enduser-preview.test.d.ts +29 -0
- package/lib/esm/tests/api_tests/security/readonly-enduser-preview.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/readonly-enduser-preview.test.js +465 -0
- package/lib/esm/tests/api_tests/security/readonly-enduser-preview.test.js.map +1 -0
- package/lib/esm/tests/api_tests/webhook_raw_json_number.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/webhook_raw_json_number.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/webhook_raw_json_number.test.js +258 -0
- package/lib/esm/tests/api_tests/webhook_raw_json_number.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +237 -202
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/tests/api_tests/appointment_link_expiration.test.ts +7 -2
- package/src/tests/api_tests/create_note_action.test.ts +168 -0
- package/src/tests/api_tests/webhook_raw_json_number.test.ts +152 -0
- package/src/tests/tests.ts +52 -1
- package/test_generated.pdf +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appointment_link_expiration.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/appointment_link_expiration.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"appointment_link_expiration.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/appointment_link_expiration.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwCnC,eAAO,MAAM,iCAAiC;SAA2B,OAAO;iBAAe,OAAO;mBA+BrG,CAAA"}
|
|
@@ -59,18 +59,21 @@ var decode_jwt_payload = function (token) {
|
|
|
59
59
|
// The API returns a /r/<token> shortlink, not the destination — follow one hop and pull the
|
|
60
60
|
// `token` query param out of the URL the patient actually lands on.
|
|
61
61
|
var resolve_redirect_token = function (link) { return __awaiter(void 0, void 0, void 0, function () {
|
|
62
|
-
var _a, status, headers, location, token;
|
|
63
|
-
return __generator(this, function (
|
|
64
|
-
switch (
|
|
65
|
-
case 0:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
var _a, pathname, search, followURL, _b, status, headers, location, token;
|
|
63
|
+
return __generator(this, function (_c) {
|
|
64
|
+
switch (_c.label) {
|
|
65
|
+
case 0:
|
|
66
|
+
_a = new URL(link), pathname = _a.pathname, search = _a.search;
|
|
67
|
+
followURL = "".concat(host).concat(pathname).concat(search);
|
|
68
|
+
return [4 /*yield*/, axios_1.default.get(followURL, {
|
|
69
|
+
maxRedirects: 0,
|
|
70
|
+
validateStatus: function () { return true; },
|
|
71
|
+
})];
|
|
69
72
|
case 1:
|
|
70
|
-
|
|
73
|
+
_b = _c.sent(), status = _b.status, headers = _b.headers;
|
|
71
74
|
location = headers['location'];
|
|
72
75
|
if (!location)
|
|
73
|
-
throw new Error("Expected a redirect from ".concat(
|
|
76
|
+
throw new Error("Expected a redirect from ".concat(followURL, ", got status ").concat(status));
|
|
74
77
|
token = new URL(location).searchParams.get('token');
|
|
75
78
|
if (!token)
|
|
76
79
|
throw new Error("No token query param in redirect destination: ".concat(location));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appointment_link_expiration.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/appointment_link_expiration.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC;AAExC,gDAAyB;AAEzB,iCAAmC;AACnC,+CAA4D;AAC5D,kCAAsC;AAEtC,IAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAA;AAE3D,IAAM,kBAAkB,GAAG,KAAK,CAAA;AAChC,IAAM,cAAc,GAAG,GAAG,CAAA,CAAC,8EAA8E;AAEzG,gGAAgG;AAChG,oEAAoE;AACpE,IAAM,kBAAkB,GAAG,UAAC,KAAa;IACjC,IAAA,KAAc,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAA3B,OAAO,QAAoB,CAAA;IACpC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1C,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACtD,CAAA;AACnC,CAAC,CAAA;AAED,4FAA4F;AAC5F,oEAAoE;AACpE,IAAM,sBAAsB,GAAG,UAAO,IAAY
|
|
1
|
+
{"version":3,"file":"appointment_link_expiration.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/appointment_link_expiration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_note_action.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/create_note_action.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,eAAO,MAAM,wBAAwB;SAA2B,OAAO;iBAAe,OAAO;mBAqI5F,CAAA"}
|
|
@@ -0,0 +1,237 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.create_note_action_tests = void 0;
|
|
51
|
+
require('source-map-support').install();
|
|
52
|
+
var sdk_1 = require("../../sdk");
|
|
53
|
+
var testing_1 = require("@tellescope/testing");
|
|
54
|
+
var setup_1 = require("../setup");
|
|
55
|
+
var host = process.env.API_URL || "http://localhost:8080";
|
|
56
|
+
// createNote journey action: creates a note on the enduser timeline with deterministic
|
|
57
|
+
// (merge-field) text, or AI-generated text when aiSummaryConfiguration.enabled is set.
|
|
58
|
+
// The deterministic path is fully covered here; the AI path asserts config round-trip and,
|
|
59
|
+
// when the org lacks Bedrock enablement/credits (typical dev org), the error path instead.
|
|
60
|
+
var create_note_action_tests = function (_a) {
|
|
61
|
+
var sdk = _a.sdk;
|
|
62
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
63
|
+
var journey, createdEnduserIds, validInfo_1, step_1, processFor, enduser, result, notes, hiddenResult, allNotes, hiddenNote, aiInfo, aiStep, aiEnduser, aiResult, aiNotes, conversations, _i, createdEnduserIds_1, id;
|
|
64
|
+
var _b, _c;
|
|
65
|
+
return __generator(this, function (_d) {
|
|
66
|
+
switch (_d.label) {
|
|
67
|
+
case 0:
|
|
68
|
+
(0, testing_1.log_header)("Create Note Action Tests");
|
|
69
|
+
return [4 /*yield*/, sdk.api.journeys.createOne({ title: 'Create Note Test Journey' })];
|
|
70
|
+
case 1:
|
|
71
|
+
journey = _d.sent();
|
|
72
|
+
createdEnduserIds = [];
|
|
73
|
+
_d.label = 2;
|
|
74
|
+
case 2:
|
|
75
|
+
_d.trys.push([2, , 18, 24]);
|
|
76
|
+
validInfo_1 = {
|
|
77
|
+
title: 'Note for {{enduser.fname}}',
|
|
78
|
+
text: 'Hi {{enduser.fname}}, this is a journey note.',
|
|
79
|
+
tags: ['auto-note'],
|
|
80
|
+
};
|
|
81
|
+
return [4 /*yield*/, sdk.api.automation_steps.createOne({
|
|
82
|
+
journeyId: journey.id,
|
|
83
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
84
|
+
action: { type: 'createNote', info: validInfo_1 },
|
|
85
|
+
})];
|
|
86
|
+
case 3:
|
|
87
|
+
step_1 = _d.sent();
|
|
88
|
+
(0, testing_1.assert)(step_1.action.type === 'createNote' && step_1.action.info.title === validInfo_1.title && step_1.action.info.text === validInfo_1.text, 'createNote step round-trip failed', 'createNote step round-trips');
|
|
89
|
+
return [4 /*yield*/, (0, testing_1.async_test)('createNote without title is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
90
|
+
journeyId: journey.id,
|
|
91
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
92
|
+
action: { type: 'createNote', info: __assign(__assign({}, validInfo_1), { title: undefined }) },
|
|
93
|
+
}); }, { shouldError: true, onError: function () { return true; } })];
|
|
94
|
+
case 4:
|
|
95
|
+
_d.sent();
|
|
96
|
+
return [4 /*yield*/, (0, testing_1.async_test)('createNote with over-length title is rejected', function () { return sdk.api.automation_steps.createOne({
|
|
97
|
+
journeyId: journey.id,
|
|
98
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
99
|
+
action: { type: 'createNote', info: __assign(__assign({}, validInfo_1), { title: 'x'.repeat(251) }) },
|
|
100
|
+
}); }, { shouldError: true, onError: function () { return true; } })
|
|
101
|
+
/*************** Runtime: the process endpoint ***************/
|
|
102
|
+
];
|
|
103
|
+
case 5:
|
|
104
|
+
_d.sent();
|
|
105
|
+
processFor = function (enduserId, info) { return __awaiter(void 0, void 0, void 0, function () {
|
|
106
|
+
var automatedAction;
|
|
107
|
+
return __generator(this, function (_a) {
|
|
108
|
+
switch (_a.label) {
|
|
109
|
+
case 0: return [4 /*yield*/, sdk.api.automated_actions.createOne({
|
|
110
|
+
enduserId: enduserId,
|
|
111
|
+
journeyId: journey.id,
|
|
112
|
+
automationStepId: step_1.id,
|
|
113
|
+
event: { type: 'onJourneyStart', info: {} },
|
|
114
|
+
action: { type: 'createNote', info: info },
|
|
115
|
+
status: 'active',
|
|
116
|
+
processAfter: Date.now(),
|
|
117
|
+
})];
|
|
118
|
+
case 1:
|
|
119
|
+
automatedAction = _a.sent();
|
|
120
|
+
return [2 /*return*/, sdk.api.automated_actions.process({ automatedActionId: automatedAction.id })];
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}); };
|
|
124
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'NoteTest' })];
|
|
125
|
+
case 6:
|
|
126
|
+
enduser = _d.sent();
|
|
127
|
+
createdEnduserIds.push(enduser.id);
|
|
128
|
+
return [4 /*yield*/, processFor(enduser.id, validInfo_1)];
|
|
129
|
+
case 7:
|
|
130
|
+
result = _d.sent();
|
|
131
|
+
(0, testing_1.assert)(result.success === true, "deterministic createNote failed: ".concat(result.error), 'deterministic createNote succeeds');
|
|
132
|
+
return [4 /*yield*/, sdk.api.notes.getSome({ filter: { enduserId: enduser.id } })];
|
|
133
|
+
case 8:
|
|
134
|
+
notes = _d.sent();
|
|
135
|
+
(0, testing_1.assert)(notes.length === 1, "expected 1 note, got ".concat(notes.length), 'exactly one note created');
|
|
136
|
+
(0, testing_1.assert)(notes[0].title === 'Note for NoteTest', "title not templated: ".concat(notes[0].title), 'title merge fields resolve');
|
|
137
|
+
(0, testing_1.assert)(notes[0].text === 'Hi NoteTest, this is a journey note.', "text not templated: ".concat(notes[0].text), 'text merge fields resolve');
|
|
138
|
+
(0, testing_1.assert)(!!((_b = notes[0].tags) === null || _b === void 0 ? void 0 : _b.includes('auto-note')), 'tags missing on note', 'tags set on note');
|
|
139
|
+
(0, testing_1.assert)(notes[0].source === 'Journey', "wrong source: ".concat(notes[0].source), 'note source is Journey');
|
|
140
|
+
(0, testing_1.assert)(!notes[0].hiddenFromTimeline, 'note unexpectedly hidden', 'note visible on timeline by default');
|
|
141
|
+
(0, testing_1.assert)(!notes[0].aiGenerated, 'deterministic note incorrectly flagged aiGenerated', 'deterministic note not flagged as AI-generated');
|
|
142
|
+
return [4 /*yield*/, processFor(enduser.id, { title: 'Hidden note', hiddenFromTimeline: true })];
|
|
143
|
+
case 9:
|
|
144
|
+
hiddenResult = _d.sent();
|
|
145
|
+
(0, testing_1.assert)(hiddenResult.success === true, "hidden createNote failed: ".concat(hiddenResult.error), 'hidden createNote succeeds');
|
|
146
|
+
return [4 /*yield*/, sdk.api.notes.getSome({ filter: { enduserId: enduser.id } })];
|
|
147
|
+
case 10:
|
|
148
|
+
allNotes = _d.sent();
|
|
149
|
+
hiddenNote = allNotes.find(function (n) { return n.title === 'Hidden note'; });
|
|
150
|
+
(0, testing_1.assert)(!!hiddenNote && hiddenNote.hiddenFromTimeline === true && !hiddenNote.text, 'hidden/textless note not created correctly', 'hiddenFromTimeline note created without text');
|
|
151
|
+
aiInfo = {
|
|
152
|
+
title: 'AI note for {{enduser.fname}}',
|
|
153
|
+
aiSummaryConfiguration: {
|
|
154
|
+
enabled: true,
|
|
155
|
+
prompt: 'Write a one-sentence note stating this is a test patient.',
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
return [4 /*yield*/, sdk.api.automation_steps.createOne({
|
|
159
|
+
journeyId: journey.id,
|
|
160
|
+
events: [{ type: 'onJourneyStart', info: {} }],
|
|
161
|
+
action: { type: 'createNote', info: aiInfo },
|
|
162
|
+
})];
|
|
163
|
+
case 11:
|
|
164
|
+
aiStep = _d.sent();
|
|
165
|
+
(0, testing_1.assert)(aiStep.action.type === 'createNote' && ((_c = aiStep.action.info.aiSummaryConfiguration) === null || _c === void 0 ? void 0 : _c.enabled) === true, 'AI createNote config round-trip failed', 'AI createNote config round-trips');
|
|
166
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({ fname: 'AINoteTest' })];
|
|
167
|
+
case 12:
|
|
168
|
+
aiEnduser = _d.sent();
|
|
169
|
+
createdEnduserIds.push(aiEnduser.id);
|
|
170
|
+
return [4 /*yield*/, processFor(aiEnduser.id, aiInfo)];
|
|
171
|
+
case 13:
|
|
172
|
+
aiResult = _d.sent();
|
|
173
|
+
if (!!aiResult.success) return [3 /*break*/, 14];
|
|
174
|
+
// bedrockAIAllowed/credits are org-level and unreadable here — accept the configuration error path
|
|
175
|
+
(0, testing_1.assert)(/bedrock|credit|enabled|ai/i.test(aiResult.error || ''), "unexpected AI createNote error: ".concat(aiResult.error), 'AI createNote reports a configuration error (Bedrock unavailable — runtime generation skipped)');
|
|
176
|
+
return [3 /*break*/, 17];
|
|
177
|
+
case 14: return [4 /*yield*/, sdk.api.notes.getSome({ filter: { enduserId: aiEnduser.id } })];
|
|
178
|
+
case 15:
|
|
179
|
+
aiNotes = _d.sent();
|
|
180
|
+
(0, testing_1.assert)(aiNotes.length === 1 && !!aiNotes[0].text && aiNotes[0].title === 'AI note for AINoteTest', 'AI-generated note missing or malformed', 'AI-generated note created with non-empty text');
|
|
181
|
+
(0, testing_1.assert)(aiNotes[0].aiGenerated === true, 'AI note missing aiGenerated flag', 'AI note flagged as AI-generated');
|
|
182
|
+
return [4 /*yield*/, sdk.api.ai_conversations.getSome({ filter: { enduserId: aiEnduser.id } })];
|
|
183
|
+
case 16:
|
|
184
|
+
conversations = _d.sent();
|
|
185
|
+
(0, testing_1.assert)(conversations.some(function (c) { return c.type === 'AI Note'; }), 'no AI Note ai_conversations record', 'AI generation logged to ai_conversations with type AI Note');
|
|
186
|
+
_d.label = 17;
|
|
187
|
+
case 17: return [3 /*break*/, 24];
|
|
188
|
+
case 18: return [4 /*yield*/, sdk.api.journeys.deleteOne(journey.id).catch(function () { })];
|
|
189
|
+
case 19:
|
|
190
|
+
_d.sent();
|
|
191
|
+
_i = 0, createdEnduserIds_1 = createdEnduserIds;
|
|
192
|
+
_d.label = 20;
|
|
193
|
+
case 20:
|
|
194
|
+
if (!(_i < createdEnduserIds_1.length)) return [3 /*break*/, 23];
|
|
195
|
+
id = createdEnduserIds_1[_i];
|
|
196
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(id).catch(function () { })];
|
|
197
|
+
case 21:
|
|
198
|
+
_d.sent();
|
|
199
|
+
_d.label = 22;
|
|
200
|
+
case 22:
|
|
201
|
+
_i++;
|
|
202
|
+
return [3 /*break*/, 20];
|
|
203
|
+
case 23: return [7 /*endfinally*/];
|
|
204
|
+
case 24: return [2 /*return*/];
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
};
|
|
209
|
+
exports.create_note_action_tests = create_note_action_tests;
|
|
210
|
+
// Allow running this test file independently
|
|
211
|
+
if (require.main === module) {
|
|
212
|
+
var sdk_2 = new sdk_1.Session({ host: host });
|
|
213
|
+
var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
|
|
214
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
215
|
+
return __generator(this, function (_a) {
|
|
216
|
+
switch (_a.label) {
|
|
217
|
+
case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
|
|
218
|
+
case 1:
|
|
219
|
+
_a.sent();
|
|
220
|
+
return [4 /*yield*/, (0, exports.create_note_action_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
221
|
+
case 2:
|
|
222
|
+
_a.sent();
|
|
223
|
+
return [2 /*return*/];
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}); };
|
|
227
|
+
runTests()
|
|
228
|
+
.then(function () {
|
|
229
|
+
console.log("✅ Create Note Action test suite completed successfully");
|
|
230
|
+
process.exit(0);
|
|
231
|
+
})
|
|
232
|
+
.catch(function (error) {
|
|
233
|
+
console.error("❌ Create Note Action test suite failed:", error);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=create_note_action.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_note_action.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/create_note_action.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Session } from "../../../sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Regression test for F-0138
|
|
4
|
+
* (security-audit/findings/F-0138-endusers-generate-auth-token-no-admin-gate.md).
|
|
5
|
+
*
|
|
6
|
+
* `endusers.generate_auth_token` (the "View portal as patient" preview flow) requires only
|
|
7
|
+
* `endusers.read`, yet mints a FULLY-PRIVILEGED enduser session. A staff user who cannot update a
|
|
8
|
+
* patient can therefore act AS that patient: edit the record, submit forms, send chats, book
|
|
9
|
+
* appointments, even set the portal password.
|
|
10
|
+
*
|
|
11
|
+
* The fix mints the preview token with `sessionScopes: ['portal-preview']` whenever the calling
|
|
12
|
+
* staff user lacks update access to that specific enduser (record-level, honoring `Assigned`
|
|
13
|
+
* scoping). The scope's allowlist (api/modules/session_scopes.ts) grants exactly the portal's read
|
|
14
|
+
* surface plus session maintenance; every write path 403s via existing path confinement.
|
|
15
|
+
*
|
|
16
|
+
* RED (pre-fix): section A fails — the response carries no sessionScopes and every write in A2
|
|
17
|
+
* SUCCEEDS. Sections D/E (controls) pass pre-fix. GREEN (post-fix): all sections pass.
|
|
18
|
+
*
|
|
19
|
+
* Probes use raw axios rather than the SDK: parseError (sdk/src/session.ts) discards the status
|
|
20
|
+
* code, and a path-confinement denial (403 "Inaccessible") is byte-identical in message to a
|
|
21
|
+
* permissions denial. Write/blocked-read probes additionally confirm an UNCONFINED enduser token
|
|
22
|
+
* gets a non-403 on the same path in the same run, so a 403 can only be confinement, never bad
|
|
23
|
+
* permissions or a bad body.
|
|
24
|
+
*/
|
|
25
|
+
export declare const readonly_enduser_preview_tests: ({ sdk }: {
|
|
26
|
+
sdk: Session;
|
|
27
|
+
sdkNonAdmin: Session;
|
|
28
|
+
}) => Promise<void>;
|
|
29
|
+
//# sourceMappingURL=readonly-enduser-preview.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readonly-enduser-preview.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/readonly-enduser-preview.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAA;AA8BtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,8BAA8B;SAA2B,OAAO;iBAAe,OAAO;mBA6NlG,CAAA"}
|