@tellescope/sdk 1.256.11 → 1.256.13

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 (46) hide show
  1. package/lib/cjs/sdk.d.ts +1 -0
  2. package/lib/cjs/sdk.d.ts.map +1 -1
  3. package/lib/cjs/sdk.js +1 -0
  4. package/lib/cjs/sdk.js.map +1 -1
  5. package/lib/cjs/tests/api_tests/active_patient_count.test.d.ts +15 -0
  6. package/lib/cjs/tests/api_tests/active_patient_count.test.d.ts.map +1 -0
  7. package/lib/cjs/tests/api_tests/active_patient_count.test.js +594 -0
  8. package/lib/cjs/tests/api_tests/active_patient_count.test.js.map +1 -0
  9. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.d.ts +6 -0
  10. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.js +192 -0
  12. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +5 -0
  14. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -1
  15. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +95 -31
  16. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  17. package/lib/cjs/tests/tests.d.ts.map +1 -1
  18. package/lib/cjs/tests/tests.js +156 -148
  19. package/lib/cjs/tests/tests.js.map +1 -1
  20. package/lib/esm/sdk.d.ts +1 -0
  21. package/lib/esm/sdk.d.ts.map +1 -1
  22. package/lib/esm/sdk.js +1 -0
  23. package/lib/esm/sdk.js.map +1 -1
  24. package/lib/esm/tests/api_tests/active_patient_count.test.d.ts +15 -0
  25. package/lib/esm/tests/api_tests/active_patient_count.test.d.ts.map +1 -0
  26. package/lib/esm/tests/api_tests/active_patient_count.test.js +590 -0
  27. package/lib/esm/tests/api_tests/active_patient_count.test.js.map +1 -0
  28. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.d.ts +6 -0
  29. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.d.ts.map +1 -0
  30. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.js +188 -0
  31. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.js.map +1 -0
  32. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +5 -0
  33. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -1
  34. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +95 -31
  35. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  36. package/lib/esm/tests/tests.d.ts.map +1 -1
  37. package/lib/esm/tests/tests.js +156 -148
  38. package/lib/esm/tests/tests.js.map +1 -1
  39. package/lib/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +10 -10
  41. package/src/sdk.ts +4 -0
  42. package/src/tests/api_tests/active_patient_count.test.ts +435 -0
  43. package/src/tests/api_tests/out_of_office_endpoint.test.ts +162 -0
  44. package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +56 -0
  45. package/src/tests/tests.ts +4 -0
  46. package/test_generated.pdf +0 -0
@@ -0,0 +1,590 @@
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ require('source-map-support').install();
58
+ import { Session, EnduserSession } from "../../sdk";
59
+ import { async_test, handleAnyError, log_header, wait, } from "@tellescope/testing";
60
+ import { authenticate_enduser_via_token, setup_tests } from "../setup";
61
+ var host = process.env.API_URL || 'http://localhost:8080';
62
+ var businessId = '60398b1131a295e64f084ff6';
63
+ // Second-tenant session, used to prove the active patient count never crosses tenants.
64
+ // Same key used by the org-isolation tests in tests.ts.
65
+ var OTHER_TENANT_API_KEY = "ba745e25162bb95a795c5fa1af70df188d93c4d3aac9c48b34a5c8c9dd7b80f7";
66
+ // Arbitrary valid ObjectId — endusers carrying a customTypeId are excluded from the default count
67
+ var TEST_CUSTOM_TYPE_ID = '60398b0231a295e64f084fd9';
68
+ /**
69
+ * Locks in the behavior of getEngagedEndusers (endusers/engagement), which backs both the billing
70
+ * /usage endpoint and the super-admin active patient count. Every case creates exactly one
71
+ * qualifying (or deliberately non-qualifying) engagement record and asserts its effect on the
72
+ * distinct enduser count.
73
+ *
74
+ * All assertions are made inside a time window opened at the top of the test, so unrelated records
75
+ * left behind by other suites can't move the numbers.
76
+ */
77
+ export var active_patient_count_tests = function (_a) {
78
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
79
+ return __awaiter(void 0, void 0, void 0, function () {
80
+ var userId, windowStart, activeCount, onlyCase, onlyThisTest, _b, eEmail, eEmailOutbound, eSMS, eSMSOutbound, eCallInbound, eCallLongOutbound, eCallShortOutbound, eChat, eChatNoEnduser, eForm, eFormUnsubmitted, eFormOtherForm, eCalendar, eCalendarUserOnly, eCalendarPastStart, eGroupMMS, eGroupMMSUserSender, eDedupe, eCustomType, eInactive, createdEnduserIds, chatRoomIds, conversationIds, calendarEventIds, formIds, chatRoom, chatRoomNoEnduser, formA_1, fieldA, formB, fieldB, submitForm, calendarEvent, calendarEventUserOnly, calendarEventPastStart, conversation, dedupeRoom, EXPECTED_ACTIVE_1, expectActive, afterAll_1, enduserSDK_1, sdkOther_1, otherWindowStart_1, otherEnduser;
81
+ return __generator(this, function (_c) {
82
+ switch (_c.label) {
83
+ case 0:
84
+ log_header("Active Patient Count Tests");
85
+ userId = sdk.userInfo.id;
86
+ windowStart = new Date(Date.now() - 2000);
87
+ activeCount = function (args) {
88
+ if (args === void 0) { args = {}; }
89
+ return (sdk.api.endusers.get_engagement_statistics(__assign({ range: { from: windowStart } }, args))
90
+ .then(function (r) { return r.count; }));
91
+ };
92
+ onlyCase = function (apcCase) { return activeCount({ enduserFields: [{ field: 'fields.apcCase', value: apcCase }] }); };
93
+ onlyThisTest = function (args) {
94
+ if (args === void 0) { args = {}; }
95
+ return activeCount(__assign(__assign({}, args), { enduserFields: [{ field: 'fields.apcCase', value: '$exists' }] }));
96
+ };
97
+ return [4 /*yield*/, sdk.api.endusers.createSome([
98
+ { fname: 'apc-email', fields: { apcCase: 'email', apcTag: 'yes', apcGroup: 'A' } },
99
+ { fname: 'apc-email-outbound', fields: { apcCase: 'email-outbound' } },
100
+ { fname: 'apc-sms', fields: { apcCase: 'sms', apcTag: 'yes', apcGroup: 'A' } },
101
+ { fname: 'apc-sms-outbound', fields: { apcCase: 'sms-outbound' } },
102
+ { fname: 'apc-call-inbound', fields: { apcCase: 'call-inbound', apcGroup: 'B' } },
103
+ { fname: 'apc-call-long-outbound', fields: { apcCase: 'call-long-outbound', apcGroup: 'B' } },
104
+ { fname: 'apc-call-short-outbound', fields: { apcCase: 'call-short-outbound' } },
105
+ { fname: 'apc-chat', fields: { apcCase: 'chat', apcGroup: 'B' } },
106
+ { fname: 'apc-chat-no-enduserid', fields: { apcCase: 'chat-no-enduserid' } },
107
+ { fname: 'apc-form', fields: { apcCase: 'form', apcGroup: 'C' } },
108
+ { fname: 'apc-form-unsubmitted', fields: { apcCase: 'form-unsubmitted' } },
109
+ { fname: 'apc-form-other-form', fields: { apcCase: 'form-other-form', apcGroup: 'C' } },
110
+ // deliberately has no apcGroup, so the $exists case below is narrower than the total
111
+ { fname: 'apc-calendar', fields: { apcCase: 'calendar' } },
112
+ { fname: 'apc-calendar-user-only', fields: { apcCase: 'calendar-user-only' } },
113
+ { fname: 'apc-calendar-past-start', fields: { apcCase: 'calendar-past-start' } },
114
+ { fname: 'apc-group-mms', fields: { apcCase: 'group-mms', apcGroup: 'D' } },
115
+ { fname: 'apc-group-mms-user-sender', fields: { apcCase: 'group-mms-user-sender' } },
116
+ { fname: 'apc-dedupe', fields: { apcCase: 'dedupe', apcTag: 'yes', apcGroup: 'D' } },
117
+ { fname: 'apc-custom-type', customTypeId: TEST_CUSTOM_TYPE_ID, fields: { apcCase: 'custom-type' } },
118
+ { fname: 'apc-inactive', fields: { apcCase: 'inactive' } },
119
+ ])];
120
+ case 1:
121
+ _b = (_c.sent()).created, eEmail = _b[0], eEmailOutbound = _b[1], eSMS = _b[2], eSMSOutbound = _b[3], eCallInbound = _b[4], eCallLongOutbound = _b[5], eCallShortOutbound = _b[6], eChat = _b[7], eChatNoEnduser = _b[8], eForm = _b[9], eFormUnsubmitted = _b[10], eFormOtherForm = _b[11], eCalendar = _b[12], eCalendarUserOnly = _b[13], eCalendarPastStart = _b[14], eGroupMMS = _b[15], eGroupMMSUserSender = _b[16], eDedupe = _b[17], eCustomType = _b[18], eInactive = _b[19];
122
+ createdEnduserIds = [
123
+ eEmail, eEmailOutbound, eSMS, eSMSOutbound, eCallInbound, eCallLongOutbound, eCallShortOutbound,
124
+ eChat, eChatNoEnduser, eForm, eFormUnsubmitted, eFormOtherForm, eCalendar, eCalendarUserOnly,
125
+ eCalendarPastStart, eGroupMMS, eGroupMMSUserSender, eDedupe, eCustomType, eInactive,
126
+ ].map(function (e) { return e.id; });
127
+ chatRoomIds = [];
128
+ conversationIds = [];
129
+ calendarEventIds = [];
130
+ formIds = [];
131
+ _c.label = 2;
132
+ case 2:
133
+ _c.trys.push([2, , 75, 77]);
134
+ // --- emails ---------------------------------------------------------------------------------
135
+ return [4 /*yield*/, sdk.api.emails.createOne({
136
+ logOnly: true, inbound: true,
137
+ userId: userId,
138
+ enduserId: eEmail.id, subject: 'apc inbound', textContent: 'inbound email',
139
+ })
140
+ // outbound with no link opens does not qualify
141
+ ];
142
+ case 3:
143
+ // --- emails ---------------------------------------------------------------------------------
144
+ _c.sent();
145
+ // outbound with no link opens does not qualify
146
+ return [4 /*yield*/, sdk.api.emails.createOne({
147
+ logOnly: true, inbound: false,
148
+ userId: userId,
149
+ enduserId: eEmailOutbound.id, subject: 'apc outbound', textContent: 'outbound email',
150
+ })
151
+ // --- sms_messages ---------------------------------------------------------------------------
152
+ ];
153
+ case 4:
154
+ // outbound with no link opens does not qualify
155
+ _c.sent();
156
+ // --- sms_messages ---------------------------------------------------------------------------
157
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
158
+ logOnly: true, inbound: true,
159
+ userId: userId,
160
+ enduserId: eSMS.id, message: 'apc inbound sms',
161
+ })];
162
+ case 5:
163
+ // --- sms_messages ---------------------------------------------------------------------------
164
+ _c.sent();
165
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
166
+ logOnly: true, inbound: false,
167
+ userId: userId,
168
+ enduserId: eSMSOutbound.id, message: 'apc outbound sms',
169
+ })
170
+ // --- phone_calls ----------------------------------------------------------------------------
171
+ // inbound qualifies regardless of duration
172
+ ];
173
+ case 6:
174
+ _c.sent();
175
+ // --- phone_calls ----------------------------------------------------------------------------
176
+ // inbound qualifies regardless of duration
177
+ return [4 /*yield*/, sdk.api.phone_calls.createOne({ enduserId: eCallInbound.id, inbound: true, userId: userId })
178
+ // outbound qualifies only at >= 60 seconds
179
+ ];
180
+ case 7:
181
+ // --- phone_calls ----------------------------------------------------------------------------
182
+ // inbound qualifies regardless of duration
183
+ _c.sent();
184
+ // outbound qualifies only at >= 60 seconds
185
+ return [4 /*yield*/, sdk.api.phone_calls.createOne({
186
+ enduserId: eCallLongOutbound.id, inbound: false,
187
+ userId: userId,
188
+ callDurationInSeconds: 60,
189
+ })];
190
+ case 8:
191
+ // outbound qualifies only at >= 60 seconds
192
+ _c.sent();
193
+ return [4 /*yield*/, sdk.api.phone_calls.createOne({
194
+ enduserId: eCallShortOutbound.id, inbound: false,
195
+ userId: userId,
196
+ callDurationInSeconds: 59,
197
+ })
198
+ // --- chats ----------------------------------------------------------------------------------
199
+ ];
200
+ case 9:
201
+ _c.sent();
202
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({ enduserIds: [eChat.id], userIds: [userId] })];
203
+ case 10:
204
+ chatRoom = _c.sent();
205
+ chatRoomIds.push(chatRoom.id);
206
+ return [4 /*yield*/, sdk.api.chats.createOne({
207
+ roomId: chatRoom.id, message: 'apc chat', senderId: eChat.id, enduserId: eChat.id,
208
+ })
209
+ // a chat with no enduserId can't be attributed to a patient
210
+ ];
211
+ case 11:
212
+ _c.sent();
213
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({
214
+ enduserIds: [eChatNoEnduser.id], userIds: [userId],
215
+ })];
216
+ case 12:
217
+ chatRoomNoEnduser = _c.sent();
218
+ chatRoomIds.push(chatRoomNoEnduser.id);
219
+ return [4 /*yield*/, sdk.api.chats.createOne({
220
+ roomId: chatRoomNoEnduser.id, message: 'apc chat without enduserId', senderId: userId,
221
+ })
222
+ // --- form_responses -------------------------------------------------------------------------
223
+ ];
224
+ case 13:
225
+ _c.sent();
226
+ return [4 /*yield*/, sdk.api.forms.createOne({ title: 'Active Patient Count Form A' })];
227
+ case 14:
228
+ formA_1 = _c.sent();
229
+ formIds.push(formA_1.id);
230
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
231
+ formId: formA_1.id, type: 'string', title: 'FieldA', previousFields: [{ type: 'root', info: {} }],
232
+ })];
233
+ case 15:
234
+ fieldA = _c.sent();
235
+ return [4 /*yield*/, sdk.api.forms.createOne({ title: 'Active Patient Count Form B' })];
236
+ case 16:
237
+ formB = _c.sent();
238
+ formIds.push(formB.id);
239
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
240
+ formId: formB.id, type: 'string', title: 'FieldB', previousFields: [{ type: 'root', info: {} }],
241
+ })];
242
+ case 17:
243
+ fieldB = _c.sent();
244
+ submitForm = function (formId, fieldId, fieldTitle, enduserId) { return __awaiter(void 0, void 0, void 0, function () {
245
+ var accessCode;
246
+ return __generator(this, function (_a) {
247
+ switch (_a.label) {
248
+ case 0: return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({ enduserId: enduserId, formId: formId })];
249
+ case 1:
250
+ accessCode = (_a.sent()).accessCode;
251
+ return [4 /*yield*/, sdk.api.form_responses.submit_form_response({
252
+ accessCode: accessCode,
253
+ responses: [{ fieldId: fieldId, fieldTitle: fieldTitle, answer: { type: 'string', value: 'apc' } }],
254
+ })];
255
+ case 2:
256
+ _a.sent();
257
+ return [2 /*return*/];
258
+ }
259
+ });
260
+ }); };
261
+ return [4 /*yield*/, submitForm(formA_1.id, fieldA.id, 'FieldA', eForm.id)];
262
+ case 18:
263
+ _c.sent();
264
+ return [4 /*yield*/, submitForm(formB.id, fieldB.id, 'FieldB', eFormOtherForm.id)
265
+ // prepared but never submitted — no submittedAt, so it must not qualify
266
+ ];
267
+ case 19:
268
+ _c.sent();
269
+ // prepared but never submitted — no submittedAt, so it must not qualify
270
+ return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({
271
+ enduserId: eFormUnsubmitted.id, formId: formA_1.id,
272
+ })
273
+ // --- calendar_events ------------------------------------------------------------------------
274
+ // starts now, not in the future — the bounded-range case below closes the window a couple of
275
+ // seconds out, and calendar_events are filtered on startTimeInMS
276
+ ];
277
+ case 20:
278
+ // prepared but never submitted — no submittedAt, so it must not qualify
279
+ _c.sent();
280
+ return [4 /*yield*/, sdk.api.calendar_events.createOne({
281
+ title: 'apc event', durationInMinutes: 30, startTimeInMS: Date.now(),
282
+ attendees: [{ id: eCalendar.id, type: 'enduser' }],
283
+ })];
284
+ case 21:
285
+ calendarEvent = _c.sent();
286
+ calendarEventIds.push(calendarEvent.id);
287
+ return [4 /*yield*/, sdk.api.calendar_events.createOne({
288
+ title: 'apc event user only', durationInMinutes: 30, startTimeInMS: Date.now(),
289
+ attendees: [{ id: userId, type: 'user' }],
290
+ })];
291
+ case 22:
292
+ calendarEventUserOnly = _c.sent();
293
+ calendarEventIds.push(calendarEventUserOnly.id);
294
+ return [4 /*yield*/, sdk.api.calendar_events.createOne({
295
+ title: 'apc event past start', durationInMinutes: 30,
296
+ startTimeInMS: Date.now() - 30 * 24 * 60 * 60 * 1000,
297
+ attendees: [{ id: eCalendarPastStart.id, type: 'enduser' }],
298
+ })];
299
+ case 23:
300
+ calendarEventPastStart = _c.sent();
301
+ calendarEventIds.push(calendarEventPastStart.id);
302
+ return [4 /*yield*/, sdk.api.group_mms_conversations.createOne({
303
+ enduserIds: [eGroupMMS.id, eGroupMMSUserSender.id], userIds: [userId], userStates: [], messages: [],
304
+ })];
305
+ case 24:
306
+ conversation = _c.sent();
307
+ conversationIds.push(conversation.id);
308
+ return [4 /*yield*/, sdk.api.group_mms_conversations.send_message({
309
+ conversationId: conversation.id, sender: eGroupMMS.id, message: 'apc group mms', logOnly: true,
310
+ })];
311
+ case 25:
312
+ _c.sent();
313
+ return [4 /*yield*/, wait(undefined, 250)
314
+ // sent by a user, so it counts for nobody — the other enduser in the conversation included
315
+ ];
316
+ case 26:
317
+ _c.sent();
318
+ // sent by a user, so it counts for nobody — the other enduser in the conversation included
319
+ return [4 /*yield*/, sdk.api.group_mms_conversations.send_message({
320
+ conversationId: conversation.id, sender: userId, message: 'apc group mms from user', logOnly: true,
321
+ })];
322
+ case 27:
323
+ // sent by a user, so it counts for nobody — the other enduser in the conversation included
324
+ _c.sent();
325
+ return [4 /*yield*/, wait(undefined, 250)
326
+ // --- dedupe: one enduser active across three channels ----------------------------------------
327
+ ];
328
+ case 28:
329
+ _c.sent();
330
+ // --- dedupe: one enduser active across three channels ----------------------------------------
331
+ return [4 /*yield*/, sdk.api.emails.createOne({
332
+ logOnly: true, inbound: true,
333
+ userId: userId,
334
+ enduserId: eDedupe.id, subject: 'apc dedupe', textContent: 'inbound email',
335
+ })];
336
+ case 29:
337
+ // --- dedupe: one enduser active across three channels ----------------------------------------
338
+ _c.sent();
339
+ return [4 /*yield*/, sdk.api.sms_messages.createOne({
340
+ logOnly: true, inbound: true,
341
+ userId: userId,
342
+ enduserId: eDedupe.id, message: 'apc dedupe sms',
343
+ })];
344
+ case 30:
345
+ _c.sent();
346
+ return [4 /*yield*/, sdk.api.chat_rooms.createOne({ enduserIds: [eDedupe.id], userIds: [userId] })];
347
+ case 31:
348
+ dedupeRoom = _c.sent();
349
+ chatRoomIds.push(dedupeRoom.id);
350
+ return [4 /*yield*/, sdk.api.chats.createOne({
351
+ roomId: dedupeRoom.id, message: 'apc dedupe chat', senderId: eDedupe.id, enduserId: eDedupe.id,
352
+ })
353
+ // --- customTypeId: excluded from the default count --------------------------------------------
354
+ ];
355
+ case 32:
356
+ _c.sent();
357
+ // --- customTypeId: excluded from the default count --------------------------------------------
358
+ return [4 /*yield*/, sdk.api.emails.createOne({
359
+ logOnly: true, inbound: true,
360
+ userId: userId,
361
+ enduserId: eCustomType.id, subject: 'apc custom type', textContent: 'inbound email',
362
+ })];
363
+ case 33:
364
+ // --- customTypeId: excluded from the default count --------------------------------------------
365
+ _c.sent();
366
+ return [4 /*yield*/, wait(undefined, 1000)
367
+ // Qualifying endusers: email, sms, inbound call, long outbound call, chat, form A, form B,
368
+ // calendar, group mms, dedupe = 10. eCustomType is excluded by customTypeId.
369
+ ]; // let side effects settle
370
+ case 34:
371
+ _c.sent(); // let side effects settle
372
+ EXPECTED_ACTIVE_1 = 10;
373
+ return [4 /*yield*/, async_test("Active count includes exactly the qualifying endusers", function () { return onlyThisTest(); }, { onResult: function (r) { return r === EXPECTED_ACTIVE_1; } })
374
+ // --- dedupe ----------------------------------------------------------------------------------
375
+ ];
376
+ case 35:
377
+ _c.sent();
378
+ // --- dedupe ----------------------------------------------------------------------------------
379
+ return [4 /*yield*/, async_test("Enduser active on email + sms + chat counts once", function () { return onlyCase('dedupe'); }, { onResult: function (r) { return r === 1; } })
380
+ // --- per-channel attribution -----------------------------------------------------------------
381
+ ];
382
+ case 36:
383
+ // --- dedupe ----------------------------------------------------------------------------------
384
+ _c.sent();
385
+ expectActive = function (label, apcCase, expected) { return async_test(label, function () { return onlyCase(apcCase); }, { onResult: function (r) { return r === expected; } }); };
386
+ return [4 /*yield*/, expectActive("Inbound email counts", 'email', 1)];
387
+ case 37:
388
+ _c.sent();
389
+ return [4 /*yield*/, expectActive("Outbound email without link opens does not count", 'email-outbound', 0)];
390
+ case 38:
391
+ _c.sent();
392
+ return [4 /*yield*/, expectActive("Inbound SMS counts", 'sms', 1)];
393
+ case 39:
394
+ _c.sent();
395
+ return [4 /*yield*/, expectActive("Outbound SMS does not count", 'sms-outbound', 0)];
396
+ case 40:
397
+ _c.sent();
398
+ return [4 /*yield*/, expectActive("Inbound phone call counts", 'call-inbound', 1)];
399
+ case 41:
400
+ _c.sent();
401
+ return [4 /*yield*/, expectActive("Outbound phone call >= 60s counts", 'call-long-outbound', 1)];
402
+ case 42:
403
+ _c.sent();
404
+ return [4 /*yield*/, expectActive("Outbound phone call < 60s does not count", 'call-short-outbound', 0)];
405
+ case 43:
406
+ _c.sent();
407
+ return [4 /*yield*/, expectActive("Chat with enduserId counts", 'chat', 1)];
408
+ case 44:
409
+ _c.sent();
410
+ return [4 /*yield*/, expectActive("Chat without enduserId does not count", 'chat-no-enduserid', 0)];
411
+ case 45:
412
+ _c.sent();
413
+ return [4 /*yield*/, expectActive("Submitted form response counts", 'form', 1)];
414
+ case 46:
415
+ _c.sent();
416
+ return [4 /*yield*/, expectActive("Unsubmitted form response does not count", 'form-unsubmitted', 0)];
417
+ case 47:
418
+ _c.sent();
419
+ return [4 /*yield*/, expectActive("Calendar event with enduser attendee counts", 'calendar', 1)];
420
+ case 48:
421
+ _c.sent();
422
+ return [4 /*yield*/, expectActive("Calendar event with only user attendees does not count", 'calendar-user-only', 0)];
423
+ case 49:
424
+ _c.sent();
425
+ return [4 /*yield*/, expectActive("Inbound group MMS counts", 'group-mms', 1)];
426
+ case 50:
427
+ _c.sent();
428
+ return [4 /*yield*/, expectActive("Group MMS sent by a user does not count", 'group-mms-user-sender', 0)];
429
+ case 51:
430
+ _c.sent();
431
+ return [4 /*yield*/, expectActive("Enduser with no engagement does not count", 'inactive', 0)
432
+ // --- date field per collection ----------------------------------------------------------------
433
+ ];
434
+ case 52:
435
+ _c.sent();
436
+ // --- date field per collection ----------------------------------------------------------------
437
+ return [4 /*yield*/, async_test("Calendar event is filtered by startTimeInMS, not creation time", function () { return onlyCase('calendar-past-start'); }, { onResult: function (r) { return r === 0; } })
438
+ // --- range boundaries -------------------------------------------------------------------------
439
+ ];
440
+ case 53:
441
+ // --- date field per collection ----------------------------------------------------------------
442
+ _c.sent();
443
+ afterAll_1 = new Date(Date.now() + 2000);
444
+ return [4 /*yield*/, async_test("Active count is unchanged with an explicit upper bound after all activity", function () { return sdk.api.endusers.get_engagement_statistics({
445
+ range: { from: windowStart, to: afterAll_1 },
446
+ enduserFields: [{ field: 'fields.apcCase', value: '$exists' }],
447
+ }).then(function (r) { return r.count; }); }, { onResult: function (r) { return r === EXPECTED_ACTIVE_1; } })];
448
+ case 54:
449
+ _c.sent();
450
+ return [4 /*yield*/, async_test("Active count is 0 for a range that starts after all activity", function () { return sdk.api.endusers.get_engagement_statistics({ range: { from: afterAll_1 } }).then(function (r) { return r.count; }); }, { onResult: function (r) { return r === 0; } })];
451
+ case 55:
452
+ _c.sent();
453
+ return [4 /*yield*/, async_test("Active count is 0 for a range that ends before all activity", function () { return sdk.api.endusers.get_engagement_statistics({
454
+ range: { from: new Date(windowStart.getTime() - 4000), to: windowStart },
455
+ enduserFields: [{ field: 'fields.apcCase', value: '$exists' }],
456
+ }).then(function (r) { return r.count; }); }, { onResult: function (r) { return r === 0; } })
457
+ // --- customTypeId ------------------------------------------------------------------------------
458
+ ];
459
+ case 56:
460
+ _c.sent();
461
+ // --- customTypeId ------------------------------------------------------------------------------
462
+ return [4 /*yield*/, async_test("Endusers with a customTypeId are excluded by default", function () { return onlyCase('custom-type'); }, { onResult: function (r) { return r === 0; } })];
463
+ case 57:
464
+ // --- customTypeId ------------------------------------------------------------------------------
465
+ _c.sent();
466
+ return [4 /*yield*/, async_test("Endusers with a customTypeId are included when that customTypeId is requested", function () { return activeCount({ customTypeId: TEST_CUSTOM_TYPE_ID }); }, { onResult: function (r) { return r === 1; } })
467
+ // --- formIds ------------------------------------------------------------------------------------
468
+ ];
469
+ case 58:
470
+ _c.sent();
471
+ // --- formIds ------------------------------------------------------------------------------------
472
+ return [4 /*yield*/, async_test("formIds narrows which form responses qualify", function () { return onlyThisTest({ formIds: [formA_1.id] }); }, { onResult: function (r) { return r === EXPECTED_ACTIVE_1 - 1; } } // drops the enduser who only submitted form B
473
+ )
474
+ // --- endusersFilter (a separate code path from enduserFields) -------------------------------------
475
+ ];
476
+ case 59:
477
+ // --- formIds ------------------------------------------------------------------------------------
478
+ _c.sent();
479
+ // --- endusersFilter (a separate code path from enduserFields) -------------------------------------
480
+ return [4 /*yield*/, async_test("endusersFilter narrows the counted endusers", function () { return activeCount({ endusersFilter: { 'fields.apcCase': 'email' } }); }, { onResult: function (r) { return r === 1; } })
481
+ // --- enduserFields -------------------------------------------------------------------------------
482
+ ];
483
+ case 60:
484
+ // --- endusersFilter (a separate code path from enduserFields) -------------------------------------
485
+ _c.sent();
486
+ // --- enduserFields -------------------------------------------------------------------------------
487
+ return [4 /*yield*/, async_test("enduserFields matches on a stored field value", function () { return activeCount({ enduserFields: [{ field: 'fields.apcTag', value: 'yes' }] }); }, { onResult: function (r) { return r === 3; } } // email, sms, dedupe
488
+ )];
489
+ case 61:
490
+ // --- enduserFields -------------------------------------------------------------------------------
491
+ _c.sent();
492
+ return [4 /*yield*/, async_test("enduserFields supports the $exists qualifier", function () { return activeCount({ enduserFields: [{ field: 'fields.apcGroup', value: '$exists' }] }); }, { onResult: function (r) { return r === EXPECTED_ACTIVE_1 - 1; } } // all active endusers except apc-calendar
493
+ )
494
+ // --- groupBy ---------------------------------------------------------------------------------------
495
+ ];
496
+ case 62:
497
+ _c.sent();
498
+ // --- groupBy ---------------------------------------------------------------------------------------
499
+ return [4 /*yield*/, async_test("groupBy returns per-group counts summing to the total", function () { return sdk.api.endusers.get_engagement_statistics({
500
+ range: { from: windowStart }, groupBy: 'fields.apcGroup',
501
+ enduserFields: [{ field: 'fields.apcCase', value: '$exists' }],
502
+ }); }, {
503
+ onResult: function (r) { return (Array.isArray(r.grouped)
504
+ && r.grouped.reduce(function (sum, g) { return sum + g.count; }, 0) === EXPECTED_ACTIVE_1); }
505
+ })
506
+ // --- endusers cannot read org-wide staff analytics ------------------------------------------------
507
+ ];
508
+ case 63:
509
+ // --- groupBy ---------------------------------------------------------------------------------------
510
+ _c.sent();
511
+ enduserSDK_1 = new EnduserSession({ host: host, businessId: businessId });
512
+ return [4 /*yield*/, authenticate_enduser_via_token(sdk, enduserSDK_1, { id: eEmail.id })];
513
+ case 64:
514
+ _c.sent();
515
+ return [4 /*yield*/, async_test("Endusers cannot call get_engagement_statistics", function () { return enduserSDK_1._GET('/v1/endusers/engagement', { range: { from: windowStart } }); }, handleAnyError)
516
+ // --- tenant isolation --------------------------------------------------------------------------------
517
+ // The refactor drops restrictAccess in favor of a direct businessId match, so this is the one
518
+ // boundary the function now enforces entirely on its own.
519
+ ];
520
+ case 65:
521
+ _c.sent();
522
+ sdkOther_1 = new Session({ host: host, apiKey: OTHER_TENANT_API_KEY });
523
+ otherWindowStart_1 = new Date(Date.now() - 2000);
524
+ return [4 /*yield*/, sdkOther_1.api.endusers.createOne({ fname: 'apc-other-tenant' })];
525
+ case 66:
526
+ otherEnduser = _c.sent();
527
+ _c.label = 67;
528
+ case 67:
529
+ _c.trys.push([67, , 72, 74]);
530
+ // userId is left to its session initializer — this is an API-key session with no logged-in user
531
+ return [4 /*yield*/, sdkOther_1.api.emails.createOne({
532
+ logOnly: true, inbound: true,
533
+ enduserId: otherEnduser.id, subject: 'apc other tenant', textContent: 'inbound email',
534
+ })];
535
+ case 68:
536
+ // userId is left to its session initializer — this is an API-key session with no logged-in user
537
+ _c.sent();
538
+ return [4 /*yield*/, wait(undefined, 500)];
539
+ case 69:
540
+ _c.sent();
541
+ return [4 /*yield*/, async_test("Other tenant's engagement does not appear in this tenant's count", function () { return onlyThisTest(); }, { onResult: function (r) { return r === EXPECTED_ACTIVE_1; } })];
542
+ case 70:
543
+ _c.sent();
544
+ return [4 /*yield*/, async_test("This tenant's engagement does not appear in the other tenant's count", function () { return sdkOther_1.api.endusers.get_engagement_statistics({ range: { from: otherWindowStart_1 } })
545
+ .then(function (r) { return r.count; }); }, { onResult: function (r) { return r === 1; } })];
546
+ case 71:
547
+ _c.sent();
548
+ return [3 /*break*/, 74];
549
+ case 72: return [4 /*yield*/, sdkOther_1.api.endusers.deleteOne(otherEnduser.id).catch(console.error)];
550
+ case 73:
551
+ _c.sent();
552
+ return [7 /*endfinally*/];
553
+ case 74: return [3 /*break*/, 77];
554
+ case 75: return [4 /*yield*/, Promise.all(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], createdEnduserIds.map(function (id) { return sdk.api.endusers.deleteOne(id).catch(console.error); }), true), chatRoomIds.map(function (id) { return sdk.api.chat_rooms.deleteOne(id).catch(console.error); }), true), conversationIds.map(function (id) { return sdk.api.group_mms_conversations.deleteOne(id).catch(console.error); }), true), calendarEventIds.map(function (id) { return sdk.api.calendar_events.deleteOne(id).catch(console.error); }), true), formIds.map(function (id) { return sdk.api.forms.deleteOne(id).catch(console.error); }), true))];
555
+ case 76:
556
+ _c.sent();
557
+ return [7 /*endfinally*/];
558
+ case 77: return [2 /*return*/];
559
+ }
560
+ });
561
+ });
562
+ };
563
+ // Allow running this test file independently
564
+ if (require.main === module) {
565
+ var sdk_1 = new Session({ host: host });
566
+ var sdkNonAdmin_1 = new Session({ host: host });
567
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
568
+ return __generator(this, function (_a) {
569
+ switch (_a.label) {
570
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
571
+ case 1:
572
+ _a.sent();
573
+ return [4 /*yield*/, active_patient_count_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
574
+ case 2:
575
+ _a.sent();
576
+ return [2 /*return*/];
577
+ }
578
+ });
579
+ }); };
580
+ runTests()
581
+ .then(function () {
582
+ console.log("✅ Active patient count test suite completed successfully");
583
+ process.exit(0);
584
+ })
585
+ .catch(function (error) {
586
+ console.error("❌ Active patient count test suite failed:", error);
587
+ process.exit(1);
588
+ });
589
+ }
590
+ //# sourceMappingURL=active_patient_count.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active_patient_count.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/active_patient_count.test.ts"],"names":[],"mappings":"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"}