@tellescope/sdk 1.255.8 → 1.255.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.
Files changed (71) hide show
  1. package/lib/cjs/enduser.d.ts +1 -0
  2. package/lib/cjs/enduser.d.ts.map +1 -1
  3. package/lib/cjs/sdk.d.ts +3 -2
  4. package/lib/cjs/sdk.d.ts.map +1 -1
  5. package/lib/cjs/tests/api_tests/calendar_event_limits.test.js +1 -1
  6. package/lib/cjs/tests/api_tests/calendar_event_limits.test.js.map +1 -1
  7. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts +6 -0
  8. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts.map +1 -0
  9. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.js +166 -0
  10. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.js.map +1 -0
  11. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js +8 -8
  12. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  13. package/lib/cjs/tests/api_tests/nutrition_tracking.test.d.ts +6 -0
  14. package/lib/cjs/tests/api_tests/nutrition_tracking.test.d.ts.map +1 -0
  15. package/lib/cjs/tests/api_tests/nutrition_tracking.test.js +483 -0
  16. package/lib/cjs/tests/api_tests/nutrition_tracking.test.js.map +1 -0
  17. package/lib/cjs/tests/api_tests/webhook_error_handling.test.d.ts +6 -0
  18. package/lib/cjs/tests/api_tests/webhook_error_handling.test.d.ts.map +1 -0
  19. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js +324 -0
  20. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js.map +1 -0
  21. package/lib/cjs/tests/setup.d.ts +11 -1
  22. package/lib/cjs/tests/setup.d.ts.map +1 -1
  23. package/lib/cjs/tests/setup.js +19 -1
  24. package/lib/cjs/tests/setup.js.map +1 -1
  25. package/lib/cjs/tests/tests.d.ts.map +1 -1
  26. package/lib/cjs/tests/tests.js +207 -192
  27. package/lib/cjs/tests/tests.js.map +1 -1
  28. package/lib/esm/sdk.d.ts +2 -2
  29. package/lib/esm/tests/api_tests/calendar_event_limits.test.js +2 -2
  30. package/lib/esm/tests/api_tests/calendar_event_limits.test.js.map +1 -1
  31. package/lib/esm/tests/api_tests/custom_dashboards.test.d.ts.map +1 -1
  32. package/lib/esm/tests/api_tests/custom_dashboards.test.js +259 -33
  33. package/lib/esm/tests/api_tests/custom_dashboards.test.js.map +1 -1
  34. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts +6 -0
  35. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts.map +1 -0
  36. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.js +162 -0
  37. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.js.map +1 -0
  38. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js +9 -9
  39. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  40. package/lib/esm/tests/api_tests/medication_added_trigger.test.d.ts.map +1 -1
  41. package/lib/esm/tests/api_tests/medication_added_trigger.test.js +206 -136
  42. package/lib/esm/tests/api_tests/medication_added_trigger.test.js.map +1 -1
  43. package/lib/esm/tests/api_tests/nutrition_tracking.test.d.ts +6 -0
  44. package/lib/esm/tests/api_tests/nutrition_tracking.test.d.ts.map +1 -0
  45. package/lib/esm/tests/api_tests/nutrition_tracking.test.js +479 -0
  46. package/lib/esm/tests/api_tests/nutrition_tracking.test.js.map +1 -0
  47. package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts +10 -0
  48. package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts.map +1 -1
  49. package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js +184 -41
  50. package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js.map +1 -1
  51. package/lib/esm/tests/api_tests/webhook_error_handling.test.d.ts +6 -0
  52. package/lib/esm/tests/api_tests/webhook_error_handling.test.d.ts.map +1 -0
  53. package/lib/esm/tests/api_tests/webhook_error_handling.test.js +317 -0
  54. package/lib/esm/tests/api_tests/webhook_error_handling.test.js.map +1 -0
  55. package/lib/esm/tests/setup.d.ts +11 -1
  56. package/lib/esm/tests/setup.d.ts.map +1 -1
  57. package/lib/esm/tests/setup.js +17 -0
  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 +233 -206
  61. package/lib/esm/tests/tests.js.map +1 -1
  62. package/lib/tsconfig.tsbuildinfo +1 -1
  63. package/package.json +8 -8
  64. package/src/tests/api_tests/calendar_event_limits.test.ts +2 -2
  65. package/src/tests/api_tests/dont_sync_to_elation_form_submission.test.ts +91 -0
  66. package/src/tests/api_tests/enduser_cross_access_isolation.test.ts +6 -6
  67. package/src/tests/api_tests/nutrition_tracking.test.ts +425 -0
  68. package/src/tests/api_tests/webhook_error_handling.test.ts +190 -0
  69. package/src/tests/setup.ts +13 -0
  70. package/src/tests/tests.ts +29 -18
  71. package/test_generated.pdf +0 -0
@@ -0,0 +1,479 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ require('source-map-support').install();
49
+ import { Session, EnduserSession } from "../../sdk";
50
+ import { async_test, log_header, } from "@tellescope/testing";
51
+ import { authenticate_enduser_via_token, setup_tests } from "../setup";
52
+ var host = process.env.API_URL || 'http://localhost:8080';
53
+ var businessId = '60398b1131a295e64f084ff6';
54
+ var ENDUSER_PASSWORD = 'NutritionTestPassword!123';
55
+ var NUTRITION_TARGETS = {
56
+ dailyCalorieTarget: 2200,
57
+ dailyProteinTarget: 150,
58
+ dailyCarbTarget: 250,
59
+ dailyFatTarget: 70,
60
+ dailyFiberTarget: 30,
61
+ dailyWaterTarget: 2500,
62
+ };
63
+ var MACRO_COMPONENTS = [
64
+ { code: { text: 'Calories' }, valueQuantity: { value: 450, unit: 'kcal' } },
65
+ { code: { text: 'Protein' }, valueQuantity: { value: 42, unit: 'g' } },
66
+ { code: { text: 'Carbohydrates' }, valueQuantity: { value: 30, unit: 'g' } },
67
+ { code: { text: 'Fat' }, valueQuantity: { value: 18, unit: 'g' } },
68
+ {
69
+ code: {
70
+ text: 'Cheddar cheese',
71
+ coding: [{ system: 'https://fdc.nal.usda.gov', code: '328637', display: 'Cheese, cheddar' }],
72
+ },
73
+ valueQuantity: { value: 100, unit: 'g' },
74
+ },
75
+ ];
76
+ var USDA_NOT_CONFIGURED_MESSAGE = 'USDA food search is not configured';
77
+ // contract shape returned by the USDA proxy — nothing else may leak through
78
+ var EXPECTED_FOOD_KEYS = ['fdcId', 'description', 'calories', 'protein', 'carbs', 'fat', 'fiber'];
79
+ var MACRO_KEYS = ['calories', 'protein', 'carbs', 'fat', 'fiber'];
80
+ var is_valid_food_summary = function (f) { return (typeof (f === null || f === void 0 ? void 0 : f.fdcId) === 'number' && Number.isInteger(f.fdcId) && f.fdcId > 0
81
+ && typeof (f === null || f === void 0 ? void 0 : f.description) === 'string' && f.description.length > 0
82
+ && Object.keys(f).every(function (k) { return EXPECTED_FOOD_KEYS.includes(k); })
83
+ && MACRO_KEYS.every(function (m) { return f[m] === undefined || (typeof f[m] === 'number' && isFinite(f[m]) && f[m] >= 0); })); };
84
+ // values are per 100g: grams of a macro can't exceed 100, energy tops out near pure fat (~900 kcal)
85
+ var is_plausible_per_100g = function (f) { return ((f.calories === undefined || f.calories <= 950)
86
+ && ['protein', 'carbs', 'fat', 'fiber'].every(function (m) { return f[m] === undefined || f[m] <= 100; })); };
87
+ // same food fetched via different USDA response shapes should yield the same numbers
88
+ var approx_equal = function (a, b) { return ((a === undefined && b === undefined)
89
+ || (typeof a === 'number' && typeof b === 'number' && Math.abs(a - b) <= Math.max(1, 0.1 * Math.max(a, b)))); };
90
+ var usda_proxy_tests = function (_a) {
91
+ var sdk = _a.sdk, enduserSDK = _a.enduserSDK;
92
+ return __awaiter(void 0, void 0, void 0, function () {
93
+ var searchResult, err_1, firstFood, fullFatCheddar;
94
+ var _b, _c;
95
+ return __generator(this, function (_d) {
96
+ switch (_d.label) {
97
+ case 0:
98
+ log_header("USDA Food Search Proxy");
99
+ _d.label = 1;
100
+ case 1:
101
+ _d.trys.push([1, 3, , 4]);
102
+ return [4 /*yield*/, enduserSDK.api.integrations.proxy_read({
103
+ integration: 'USDA',
104
+ type: 'search',
105
+ query: JSON.stringify({ keywords: 'cheddar cheese' }),
106
+ })];
107
+ case 2:
108
+ searchResult = _d.sent();
109
+ return [3 /*break*/, 4];
110
+ case 3:
111
+ err_1 = _d.sent();
112
+ if ((_c = (_b = err_1 === null || err_1 === void 0 ? void 0 : err_1.message) === null || _b === void 0 ? void 0 : _b.includes) === null || _c === void 0 ? void 0 : _c.call(_b, USDA_NOT_CONFIGURED_MESSAGE)) {
113
+ console.log("⏭️ Skipping USDA proxy tests (no { type: 'usda' } zz_secrets doc configured)");
114
+ return [2 /*return*/];
115
+ }
116
+ throw err_1;
117
+ case 4: return [4 /*yield*/, async_test('USDA search (enduser): non-empty foods with fdcId/description, totalHits > 0', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
118
+ return [2 /*return*/, searchResult];
119
+ }); }); }, { onResult: function (r) {
120
+ var _a;
121
+ return (Array.isArray((_a = r === null || r === void 0 ? void 0 : r.data) === null || _a === void 0 ? void 0 : _a.foods)
122
+ && r.data.foods.length > 0
123
+ && r.data.foods.every(function (f) { return typeof f.fdcId === 'number' && typeof f.description === 'string'; })
124
+ && r.data.foods.every(function (f) { return ['calories', 'protein', 'carbs', 'fat', 'fiber'].every(function (macro) { return f[macro] === undefined || typeof f[macro] === 'number'; }); })
125
+ && r.data.totalHits > 0);
126
+ } })];
127
+ case 5:
128
+ _d.sent();
129
+ firstFood = searchResult.data.foods[0];
130
+ return [4 /*yield*/, async_test('USDA food detail (enduser): matching single food by fdcId', function () { return enduserSDK.api.integrations.proxy_read({
131
+ integration: 'USDA',
132
+ type: 'food',
133
+ id: String(firstFood.fdcId),
134
+ }); }, { onResult: function (r) {
135
+ var _a;
136
+ return (((_a = r === null || r === void 0 ? void 0 : r.data) === null || _a === void 0 ? void 0 : _a.fdcId) === firstFood.fdcId
137
+ && typeof r.data.description === 'string');
138
+ } })];
139
+ case 6:
140
+ _d.sent();
141
+ return [4 /*yield*/, async_test('USDA search (staff session) also succeeds', function () { return sdk.api.integrations.proxy_read({
142
+ integration: 'USDA',
143
+ type: 'search',
144
+ query: JSON.stringify({ keywords: 'cheddar cheese' }),
145
+ }); }, { onResult: function (r) { var _a; return Array.isArray((_a = r === null || r === void 0 ? void 0 : r.data) === null || _a === void 0 ? void 0 : _a.foods) && r.data.foods.length > 0; } })];
146
+ case 7:
147
+ _d.sent();
148
+ return [4 /*yield*/, async_test('USDA search: missing keywords rejected', function () { return enduserSDK.api.integrations.proxy_read({
149
+ integration: 'USDA',
150
+ type: 'search',
151
+ query: JSON.stringify({}),
152
+ }); }, { shouldError: true, onError: function () { return true; } })];
153
+ case 8:
154
+ _d.sent();
155
+ return [4 /*yield*/, async_test('USDA search: 1-char keywords rejected', function () { return enduserSDK.api.integrations.proxy_read({
156
+ integration: 'USDA',
157
+ type: 'search',
158
+ query: JSON.stringify({ keywords: 'c' }),
159
+ }); }, { shouldError: true, onError: function () { return true; } })
160
+ // ---- rigorous output-format validation ----
161
+ ];
162
+ case 9:
163
+ _d.sent();
164
+ // ---- rigorous output-format validation ----
165
+ return [4 /*yield*/, async_test('USDA format: every search result matches the contract shape exactly (no extra fields)', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
166
+ return [2 /*return*/, searchResult];
167
+ }); }); }, { onResult: function (r) { return r.data.foods.every(function (f) { return is_valid_food_summary(f) && is_plausible_per_100g(f); }); } })];
168
+ case 10:
169
+ // ---- rigorous output-format validation ----
170
+ _d.sent();
171
+ return [4 /*yield*/, async_test('USDA format: no api_key or raw USDA payload fields leak into the response', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
172
+ return [2 /*return*/, searchResult];
173
+ }); }); }, { onResult: function (r) {
174
+ var serialized = JSON.stringify(r.data);
175
+ return !serialized.includes('api_key') && !serialized.includes('foodNutrients') && !serialized.includes('nutrientNumber');
176
+ } })
177
+ // extraction must actually populate macros across the result set (catches a broken
178
+ // nutrient-number mapping, which the undefined-tolerant shape checks above would miss)
179
+ ];
180
+ case 11:
181
+ _d.sent();
182
+ // extraction must actually populate macros across the result set (catches a broken
183
+ // nutrient-number mapping, which the undefined-tolerant shape checks above would miss)
184
+ return [4 /*yield*/, async_test('USDA format: macro extraction populated for nearly all results', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
185
+ return [2 /*return*/, searchResult];
186
+ }); }); }, { onResult: function (r) {
187
+ var foods = r.data.foods;
188
+ var fullyPopulated = foods.filter(function (f) { return MACRO_KEYS.every(function (m) { return typeof f[m] === 'number'; }); });
189
+ return foods.length > 0 && fullyPopulated.length >= foods.length * 0.8;
190
+ } })
191
+ // at least one result must match full-fat cheddar's real per-100g profile
192
+ // (search includes reduced-fat branded variants, so assert existence rather than checking an arbitrary pick)
193
+ ];
194
+ case 12:
195
+ // extraction must actually populate macros across the result set (catches a broken
196
+ // nutrient-number mapping, which the undefined-tolerant shape checks above would miss)
197
+ _d.sent();
198
+ fullFatCheddar = searchResult.data.foods.find(function (f) {
199
+ var _a;
200
+ return (((_a = f.description) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('cheddar'))
201
+ && f.calories >= 300 && f.calories <= 500
202
+ && f.protein >= 15 && f.protein <= 35
203
+ && f.fat >= 25 && f.fat <= 45
204
+ && f.carbs >= 0 && f.carbs <= 15
205
+ && (f.fiber === undefined || (f.fiber >= 0 && f.fiber <= 5)));
206
+ });
207
+ return [4 /*yield*/, async_test('USDA format: a result matches full-fat cheddar\'s realistic per-100g values', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
208
+ return [2 /*return*/, fullFatCheddar];
209
+ }); }); }, { onResult: function (f) { return !!f; } })];
210
+ case 13:
211
+ _d.sent();
212
+ return [4 /*yield*/, async_test('USDA format: food detail (abridged shape) yields same values as search (search shape) for same fdcId', function () { return enduserSDK.api.integrations.proxy_read({
213
+ integration: 'USDA',
214
+ type: 'food',
215
+ id: String(fullFatCheddar === null || fullFatCheddar === void 0 ? void 0 : fullFatCheddar.fdcId),
216
+ }); }, { onResult: function (r) { return (is_valid_food_summary(r === null || r === void 0 ? void 0 : r.data)
217
+ && r.data.fdcId === (fullFatCheddar === null || fullFatCheddar === void 0 ? void 0 : fullFatCheddar.fdcId)
218
+ && MACRO_KEYS.every(function (m) { return approx_equal(r.data[m], fullFatCheddar === null || fullFatCheddar === void 0 ? void 0 : fullFatCheddar[m]); })); } })];
219
+ case 14:
220
+ _d.sent();
221
+ return [4 /*yield*/, async_test('USDA format: pageSize honored (5 -> exactly 5 valid foods)', function () { return enduserSDK.api.integrations.proxy_read({
222
+ integration: 'USDA',
223
+ type: 'search',
224
+ query: JSON.stringify({ keywords: 'apple', pageSize: 5 }),
225
+ }); }, { onResult: function (r) {
226
+ var _a, _b;
227
+ return (((_b = (_a = r === null || r === void 0 ? void 0 : r.data) === null || _a === void 0 ? void 0 : _a.foods) === null || _b === void 0 ? void 0 : _b.length) === 5
228
+ && r.data.totalHits >= 5
229
+ && r.data.foods.every(function (f) { return is_valid_food_summary(f) && is_plausible_per_100g(f); }));
230
+ } })];
231
+ case 15:
232
+ _d.sent();
233
+ return [4 /*yield*/, async_test('USDA format: oversized pageSize clamped to at most 50', function () { return enduserSDK.api.integrations.proxy_read({
234
+ integration: 'USDA',
235
+ type: 'search',
236
+ query: JSON.stringify({ keywords: 'banana', pageSize: 10000 }),
237
+ }); }, { onResult: function (r) { var _a, _b; return ((_b = (_a = r === null || r === void 0 ? void 0 : r.data) === null || _a === void 0 ? void 0 : _a.foods) === null || _b === void 0 ? void 0 : _b.length) > 0 && r.data.foods.length <= 50; } })];
238
+ case 16:
239
+ _d.sent();
240
+ return [4 /*yield*/, async_test('USDA format: non-numeric food id rejected', function () { return enduserSDK.api.integrations.proxy_read({
241
+ integration: 'USDA',
242
+ type: 'food',
243
+ id: '../foods/search',
244
+ }); }, { shouldError: true, onError: function () { return true; } })];
245
+ case 17:
246
+ _d.sent();
247
+ return [2 /*return*/];
248
+ }
249
+ });
250
+ });
251
+ };
252
+ export var nutrition_tracking_tests = function (_a) {
253
+ var sdk = _a.sdk;
254
+ return __awaiter(void 0, void 0, void 0, function () {
255
+ var enduserAId, enduserBId, ts, enduserAEmail, enduserBEmail, enduserA_1, enduserB, enduserSDK_1, enduserSDKB_1, withComponents_1, withoutComponents_1, staffCreated_1, enduserACreated_1, _b, _c;
256
+ return __generator(this, function (_d) {
257
+ switch (_d.label) {
258
+ case 0:
259
+ log_header("Nutrition Tracking (weight & macro backend support)");
260
+ _d.label = 1;
261
+ case 1:
262
+ _d.trys.push([1, , 30, 39]);
263
+ ts = Date.now();
264
+ enduserAEmail = "nutrition-a-".concat(ts, "@test.tellescope.com");
265
+ enduserBEmail = "nutrition-b-".concat(ts, "@test.tellescope.com");
266
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: enduserAEmail, fname: 'Nutrition', lname: 'TesterA' })];
267
+ case 2:
268
+ enduserA_1 = _d.sent();
269
+ enduserAId = enduserA_1.id;
270
+ return [4 /*yield*/, sdk.api.endusers.set_password({ id: enduserA_1.id, password: ENDUSER_PASSWORD })];
271
+ case 3:
272
+ _d.sent();
273
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: enduserBEmail, fname: 'Nutrition', lname: 'TesterB' })];
274
+ case 4:
275
+ enduserB = _d.sent();
276
+ enduserBId = enduserB.id;
277
+ return [4 /*yield*/, sdk.api.endusers.set_password({ id: enduserB.id, password: ENDUSER_PASSWORD })];
278
+ case 5:
279
+ _d.sent();
280
+ enduserSDK_1 = new EnduserSession({ host: host, businessId: businessId });
281
+ return [4 /*yield*/, authenticate_enduser_via_token(sdk, enduserSDK_1, { email: enduserAEmail })];
282
+ case 6:
283
+ _d.sent();
284
+ enduserSDKB_1 = new EnduserSession({ host: host, businessId: businessId });
285
+ return [4 /*yield*/, authenticate_enduser_via_token(sdk, enduserSDKB_1, { email: enduserBEmail })
286
+ // ---- Requirement 3: daily nutrition targets (enduser-readable and -writable) ----
287
+ ];
288
+ case 7:
289
+ _d.sent();
290
+ // ---- Requirement 3: daily nutrition targets (enduser-readable and -writable) ----
291
+ return [4 /*yield*/, async_test('targets: enduser sets all six daily nutrition targets on own record', function () { return enduserSDK_1.api.endusers.updateOne(enduserA_1.id, __assign({}, NUTRITION_TARGETS)); }, { onResult: function (e) { return Object.entries(NUTRITION_TARGETS).every(function (_a) {
292
+ var field = _a[0], value = _a[1];
293
+ return e[field] === value;
294
+ }); } })];
295
+ case 8:
296
+ // ---- Requirement 3: daily nutrition targets (enduser-readable and -writable) ----
297
+ _d.sent();
298
+ return [4 /*yield*/, async_test('targets: enduser reads all six targets back (no redaction)', function () { return enduserSDK_1.api.endusers.getOne(enduserA_1.id); }, { onResult: function (e) { return Object.entries(NUTRITION_TARGETS).every(function (_a) {
299
+ var field = _a[0], value = _a[1];
300
+ return e[field] === value;
301
+ }); } })];
302
+ case 9:
303
+ _d.sent();
304
+ return [4 /*yield*/, async_test('targets: staff can read targets', function () { return sdk.api.endusers.getOne(enduserA_1.id); }, { onResult: function (e) { return Object.entries(NUTRITION_TARGETS).every(function (_a) {
305
+ var field = _a[0], value = _a[1];
306
+ return e[field] === value;
307
+ }); } })];
308
+ case 10:
309
+ _d.sent();
310
+ return [4 /*yield*/, async_test('targets: staff can write targets', function () { return sdk.api.endusers.updateOne(enduserA_1.id, { dailyCalorieTarget: 2000, dailyWaterTarget: 3000 }); }, { onResult: function (e) { return e.dailyCalorieTarget === 2000 && e.dailyWaterTarget === 3000; } })];
311
+ case 11:
312
+ _d.sent();
313
+ return [4 /*yield*/, async_test('targets: negative values rejected', function () { return enduserSDK_1.api.endusers.updateOne(enduserA_1.id, { dailyProteinTarget: -10 }); }, { shouldError: true, onError: function () { return true; } })
314
+ // ---- Requirement 2: EnduserObservation.components round-trip ----
315
+ ];
316
+ case 12:
317
+ _d.sent();
318
+ return [4 /*yield*/, enduserSDK_1.api.enduser_observations.createOne({
319
+ enduserId: enduserA_1.id,
320
+ status: 'final',
321
+ category: 'vital-signs',
322
+ type: 'food',
323
+ measurement: { value: 450, unit: 'kcal' },
324
+ components: MACRO_COMPONENTS,
325
+ })];
326
+ case 13:
327
+ withComponents_1 = _d.sent();
328
+ return [4 /*yield*/, async_test('components: enduser round-trips observation with macros + coded food item', function () { return enduserSDK_1.api.enduser_observations.getOne(withComponents_1.id); }, { onResult: function (o) {
329
+ var _a, _b, _c, _d, _e, _f, _g;
330
+ return (((_a = o.components) === null || _a === void 0 ? void 0 : _a.length) === MACRO_COMPONENTS.length
331
+ && o.components[1].code.text === 'Protein'
332
+ && o.components[1].valueQuantity.value === 42
333
+ && o.components[1].valueQuantity.unit === 'g'
334
+ && ((_c = (_b = o.components[4].code.coding) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.system) === 'https://fdc.nal.usda.gov'
335
+ && ((_e = (_d = o.components[4].code.coding) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.code) === '328637'
336
+ && ((_g = (_f = o.components[4].code.coding) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.display) === 'Cheese, cheddar'
337
+ && o.measurement.value === 450);
338
+ } })];
339
+ case 14:
340
+ _d.sent();
341
+ return [4 /*yield*/, enduserSDK_1.api.enduser_observations.createOne({
342
+ enduserId: enduserA_1.id,
343
+ status: 'final',
344
+ category: 'vital-signs',
345
+ type: 'weight',
346
+ measurement: { value: 180, unit: 'lbs' },
347
+ })];
348
+ case 15:
349
+ withoutComponents_1 = _d.sent();
350
+ return [4 /*yield*/, async_test('components: observation without components still works (back-compat)', function () { return enduserSDK_1.api.enduser_observations.getOne(withoutComponents_1.id); }, { onResult: function (o) { return o.components === undefined && o.measurement.value === 180; } })
351
+ // ---- Requirement 4: creatorOnly update/delete ----
352
+ ];
353
+ case 16:
354
+ _d.sent();
355
+ // ---- Requirement 4: creatorOnly update/delete ----
356
+ return [4 /*yield*/, async_test('creatorOnly: enduser updates own observation', function () { return enduserSDK_1.api.enduser_observations.updateOne(withoutComponents_1.id, { measurement: { value: 178, unit: 'lbs' } }); }, { onResult: function (o) { return o.measurement.value === 178; } })];
357
+ case 17:
358
+ // ---- Requirement 4: creatorOnly update/delete ----
359
+ _d.sent();
360
+ return [4 /*yield*/, async_test('creatorOnly: enduser deletes own observation', function () { return enduserSDK_1.api.enduser_observations.deleteOne(withoutComponents_1.id); }, { shouldError: false, onResult: function () { return true; } })
361
+ // Negative: staff-created observation for the enduser remains locked
362
+ ];
363
+ case 18:
364
+ _d.sent();
365
+ return [4 /*yield*/, sdk.api.enduser_observations.createOne({
366
+ enduserId: enduserA_1.id,
367
+ status: 'final',
368
+ category: 'vital-signs',
369
+ type: 'weight',
370
+ measurement: { value: 182, unit: 'lbs' },
371
+ })];
372
+ case 19:
373
+ staffCreated_1 = _d.sent();
374
+ return [4 /*yield*/, async_test('creatorOnly: enduser cannot update staff-created observation', function () { return enduserSDK_1.api.enduser_observations.updateOne(staffCreated_1.id, { measurement: { value: 1, unit: 'lbs' } }); }, { shouldError: true, onError: function () { return true; } })];
375
+ case 20:
376
+ _d.sent();
377
+ return [4 /*yield*/, async_test('creatorOnly: enduser cannot delete staff-created observation', function () { return enduserSDK_1.api.enduser_observations.deleteOne(staffCreated_1.id); }, { shouldError: true, onError: function () { return true; } })];
378
+ case 21:
379
+ _d.sent();
380
+ return [4 /*yield*/, async_test('creatorOnly: enduser can still read staff-created observation', function () { return enduserSDK_1.api.enduser_observations.getOne(staffCreated_1.id); }, { onResult: function (o) { return o.id === staffCreated_1.id && o.measurement.value === 182; } })
381
+ // Staff sessions unaffected by creatorOnly (applies to enduser sessions only)
382
+ ];
383
+ case 22:
384
+ _d.sent();
385
+ // Staff sessions unaffected by creatorOnly (applies to enduser sessions only)
386
+ return [4 /*yield*/, async_test('staff unchanged: staff updates enduser-created observation', function () { return sdk.api.enduser_observations.updateOne(withComponents_1.id, { measurement: { value: 500, unit: 'kcal' } }); }, { onResult: function (o) { return o.measurement.value === 500; } })];
387
+ case 23:
388
+ // Staff sessions unaffected by creatorOnly (applies to enduser sessions only)
389
+ _d.sent();
390
+ return [4 /*yield*/, async_test('staff unchanged: staff deletes enduser-created observation', function () { return sdk.api.enduser_observations.deleteOne(withComponents_1.id); }, { shouldError: false, onResult: function () { return true; } })
391
+ // Cross-enduser: B cannot update/delete A's observation
392
+ ];
393
+ case 24:
394
+ _d.sent();
395
+ return [4 /*yield*/, enduserSDK_1.api.enduser_observations.createOne({
396
+ enduserId: enduserA_1.id,
397
+ status: 'final',
398
+ category: 'vital-signs',
399
+ type: 'weight',
400
+ measurement: { value: 179, unit: 'lbs' },
401
+ })];
402
+ case 25:
403
+ enduserACreated_1 = _d.sent();
404
+ return [4 /*yield*/, async_test("cross-enduser: enduser B cannot update enduser A's observation", function () { return enduserSDKB_1.api.enduser_observations.updateOne(enduserACreated_1.id, { measurement: { value: 1, unit: 'lbs' } }); }, { shouldError: true, onError: function () { return true; } })];
405
+ case 26:
406
+ _d.sent();
407
+ return [4 /*yield*/, async_test("cross-enduser: enduser B cannot delete enduser A's observation", function () { return enduserSDKB_1.api.enduser_observations.deleteOne(enduserACreated_1.id); }, { shouldError: true, onError: function () { return true; } })];
408
+ case 27:
409
+ _d.sent();
410
+ return [4 /*yield*/, async_test("cross-enduser: enduser A's observation still exists (admin verify)", function () { return sdk.api.enduser_observations.getOne(enduserACreated_1.id); }, { onResult: function (o) { return o.id === enduserACreated_1.id && o.measurement.value === 179; } })
411
+ // ---- Requirement 1: USDA food search proxy (behavioral skip when not configured) ----
412
+ ];
413
+ case 28:
414
+ _d.sent();
415
+ // ---- Requirement 1: USDA food search proxy (behavioral skip when not configured) ----
416
+ return [4 /*yield*/, usda_proxy_tests({ sdk: sdk, enduserSDK: enduserSDK_1 })];
417
+ case 29:
418
+ // ---- Requirement 1: USDA food search proxy (behavioral skip when not configured) ----
419
+ _d.sent();
420
+ return [3 /*break*/, 39];
421
+ case 30:
422
+ if (!enduserAId) return [3 /*break*/, 34];
423
+ _d.label = 31;
424
+ case 31:
425
+ _d.trys.push([31, 33, , 34]);
426
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserAId)];
427
+ case 32:
428
+ _d.sent();
429
+ return [3 /*break*/, 34];
430
+ case 33:
431
+ _b = _d.sent();
432
+ return [3 /*break*/, 34];
433
+ case 34:
434
+ if (!enduserBId) return [3 /*break*/, 38];
435
+ _d.label = 35;
436
+ case 35:
437
+ _d.trys.push([35, 37, , 38]);
438
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserBId)];
439
+ case 36:
440
+ _d.sent();
441
+ return [3 /*break*/, 38];
442
+ case 37:
443
+ _c = _d.sent();
444
+ return [3 /*break*/, 38];
445
+ case 38: return [7 /*endfinally*/];
446
+ case 39: return [2 /*return*/];
447
+ }
448
+ });
449
+ });
450
+ };
451
+ // Allow running this test file independently
452
+ if (require.main === module) {
453
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
454
+ var sdk_1 = new Session({ host: host });
455
+ var sdkNonAdmin_1 = new Session({ host: host });
456
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
457
+ return __generator(this, function (_a) {
458
+ switch (_a.label) {
459
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
460
+ case 1:
461
+ _a.sent();
462
+ return [4 /*yield*/, nutrition_tracking_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
463
+ case 2:
464
+ _a.sent();
465
+ return [2 /*return*/];
466
+ }
467
+ });
468
+ }); };
469
+ runTests()
470
+ .then(function () {
471
+ console.log("✅ Nutrition tracking test suite completed successfully");
472
+ process.exit(0);
473
+ })
474
+ .catch(function (error) {
475
+ console.error("❌ Nutrition tracking test suite failed:", error);
476
+ process.exit(1);
477
+ });
478
+ }
479
+ //# sourceMappingURL=nutrition_tracking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutrition_tracking.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/nutrition_tracking.test.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,16 @@ import { Session } from "../../../sdk";
14
14
  * 2. Assigns the role to the non-admin user.
15
15
  * 3. Calls each endpoint as the non-admin.
16
16
  * 4. Asserts each endpoint returns a 403-equivalent error (not 200).
17
+ * 5. Positive case: a role granting ai_conversations create (read/update denied) must pass
18
+ * the send_message gate — generating a NEW conversation requires only create access.
19
+ * 6. But the same role must still 403 when passing a conversationId: continuing an existing
20
+ * conversation reads its stored history (returned in the response) and appends to it,
21
+ * so it requires read + update access in addition to create.
22
+ * 7. Default-provider-permissions role (ai_conversations = Assigned): send_message must not
23
+ * 500. Regression: the post-generation $push previously ran through the caller's
24
+ * access-scoped DB, where "Assigned" filters can't match the just-created conversation,
25
+ * returning null and crashing the handler (Cannot read properties of null '_id') after
26
+ * credits were consumed. bedrock.ts now persists via tenant-scoped org-wide queries.
17
27
  *
18
28
  * Pre-fix:
19
29
  * - send_message: 200 (or some downstream error from Bedrock) — NOT 403. Test fails.
@@ -1 +1 @@
1
- {"version":3,"file":"F-0005-ai-conversations-rbac.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0005-ai-conversations-rbac.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAYtC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,2BAA2B;SAAwC,OAAO;iBAAe,OAAO;mBA8F5G,CAAA"}
1
+ {"version":3,"file":"F-0005-ai-conversations-rbac.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0005-ai-conversations-rbac.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAYtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,2BAA2B;SAAwC,OAAO;iBAAe,OAAO;mBA+M5G,CAAA"}