@tellescope/sdk 1.247.0 → 1.249.0

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 (126) hide show
  1. package/.env +3 -0
  2. package/lib/cjs/sdk.d.ts +7 -1
  3. package/lib/cjs/sdk.d.ts.map +1 -1
  4. package/lib/cjs/sdk.js +3 -0
  5. package/lib/cjs/sdk.js.map +1 -1
  6. package/lib/cjs/tests/api_tests/chats_analytics.test.d.ts +6 -0
  7. package/lib/cjs/tests/api_tests/chats_analytics.test.d.ts.map +1 -0
  8. package/lib/cjs/tests/api_tests/chats_analytics.test.js +256 -0
  9. package/lib/cjs/tests/api_tests/chats_analytics.test.js.map +1 -0
  10. package/lib/cjs/tests/api_tests/cross_org_api_key.test.d.ts +6 -0
  11. package/lib/cjs/tests/api_tests/cross_org_api_key.test.d.ts.map +1 -0
  12. package/lib/cjs/tests/api_tests/cross_org_api_key.test.js +748 -0
  13. package/lib/cjs/tests/api_tests/cross_org_api_key.test.js.map +1 -0
  14. package/lib/cjs/tests/api_tests/date_string_validation.test.d.ts +6 -0
  15. package/lib/cjs/tests/api_tests/date_string_validation.test.d.ts.map +1 -0
  16. package/lib/cjs/tests/api_tests/date_string_validation.test.js +142 -0
  17. package/lib/cjs/tests/api_tests/date_string_validation.test.js.map +1 -0
  18. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.d.ts +6 -0
  19. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.d.ts.map +1 -0
  20. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js +667 -0
  21. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js.map +1 -0
  22. package/lib/cjs/tests/api_tests/eom_billing_codes.test.d.ts +6 -0
  23. package/lib/cjs/tests/api_tests/eom_billing_codes.test.d.ts.map +1 -0
  24. package/lib/cjs/tests/api_tests/eom_billing_codes.test.js +162 -0
  25. package/lib/cjs/tests/api_tests/eom_billing_codes.test.js.map +1 -0
  26. package/lib/cjs/tests/api_tests/eom_procedure_codes.test.d.ts +6 -0
  27. package/lib/cjs/tests/api_tests/eom_procedure_codes.test.d.ts.map +1 -0
  28. package/lib/cjs/tests/api_tests/eom_procedure_codes.test.js +339 -0
  29. package/lib/cjs/tests/api_tests/eom_procedure_codes.test.js.map +1 -0
  30. package/lib/cjs/tests/api_tests/field_redaction.test.d.ts +13 -0
  31. package/lib/cjs/tests/api_tests/field_redaction.test.d.ts.map +1 -0
  32. package/lib/cjs/tests/api_tests/field_redaction.test.js +818 -0
  33. package/lib/cjs/tests/api_tests/field_redaction.test.js.map +1 -0
  34. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.d.ts +6 -0
  35. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.d.ts.map +1 -0
  36. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.js +429 -0
  37. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.js.map +1 -0
  38. package/lib/cjs/tests/api_tests/integrations_redacted.test.d.ts +6 -0
  39. package/lib/cjs/tests/api_tests/integrations_redacted.test.d.ts.map +1 -0
  40. package/lib/cjs/tests/api_tests/integrations_redacted.test.js +273 -0
  41. package/lib/cjs/tests/api_tests/integrations_redacted.test.js.map +1 -0
  42. package/lib/cjs/tests/api_tests/managed_content_file_access.test.d.ts +13 -0
  43. package/lib/cjs/tests/api_tests/managed_content_file_access.test.d.ts.map +1 -0
  44. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js +385 -0
  45. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js.map +1 -0
  46. package/lib/cjs/tests/api_tests/openloop_webhooks.test.d.ts.map +1 -1
  47. package/lib/cjs/tests/api_tests/openloop_webhooks.test.js +108 -24
  48. package/lib/cjs/tests/api_tests/openloop_webhooks.test.js.map +1 -1
  49. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.d.ts.map +1 -1
  50. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.js +25 -2
  51. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.js.map +1 -1
  52. package/lib/cjs/tests/tests.d.ts.map +1 -1
  53. package/lib/cjs/tests/tests.js +310 -183
  54. package/lib/cjs/tests/tests.js.map +1 -1
  55. package/lib/esm/sdk.d.ts +9 -3
  56. package/lib/esm/sdk.d.ts.map +1 -1
  57. package/lib/esm/sdk.js +3 -0
  58. package/lib/esm/sdk.js.map +1 -1
  59. package/lib/esm/session.d.ts +1 -0
  60. package/lib/esm/session.d.ts.map +1 -1
  61. package/lib/esm/tests/api_tests/chats_analytics.test.d.ts +6 -0
  62. package/lib/esm/tests/api_tests/chats_analytics.test.d.ts.map +1 -0
  63. package/lib/esm/tests/api_tests/chats_analytics.test.js +252 -0
  64. package/lib/esm/tests/api_tests/chats_analytics.test.js.map +1 -0
  65. package/lib/esm/tests/api_tests/cross_org_api_key.test.d.ts +6 -0
  66. package/lib/esm/tests/api_tests/cross_org_api_key.test.d.ts.map +1 -0
  67. package/lib/esm/tests/api_tests/cross_org_api_key.test.js +744 -0
  68. package/lib/esm/tests/api_tests/cross_org_api_key.test.js.map +1 -0
  69. package/lib/esm/tests/api_tests/date_string_validation.test.d.ts +6 -0
  70. package/lib/esm/tests/api_tests/date_string_validation.test.d.ts.map +1 -0
  71. package/lib/esm/tests/api_tests/date_string_validation.test.js +138 -0
  72. package/lib/esm/tests/api_tests/date_string_validation.test.js.map +1 -0
  73. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.d.ts +6 -0
  74. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.d.ts.map +1 -0
  75. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js +663 -0
  76. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js.map +1 -0
  77. package/lib/esm/tests/api_tests/eom_billing_codes.test.d.ts +6 -0
  78. package/lib/esm/tests/api_tests/eom_billing_codes.test.d.ts.map +1 -0
  79. package/lib/esm/tests/api_tests/eom_billing_codes.test.js +158 -0
  80. package/lib/esm/tests/api_tests/eom_billing_codes.test.js.map +1 -0
  81. package/lib/esm/tests/api_tests/eom_procedure_codes.test.d.ts +6 -0
  82. package/lib/esm/tests/api_tests/eom_procedure_codes.test.d.ts.map +1 -0
  83. package/lib/esm/tests/api_tests/eom_procedure_codes.test.js +335 -0
  84. package/lib/esm/tests/api_tests/eom_procedure_codes.test.js.map +1 -0
  85. package/lib/esm/tests/api_tests/field_redaction.test.d.ts +13 -0
  86. package/lib/esm/tests/api_tests/field_redaction.test.d.ts.map +1 -0
  87. package/lib/esm/tests/api_tests/field_redaction.test.js +814 -0
  88. package/lib/esm/tests/api_tests/field_redaction.test.js.map +1 -0
  89. package/lib/esm/tests/api_tests/form_submitted_trigger.test.d.ts +6 -0
  90. package/lib/esm/tests/api_tests/form_submitted_trigger.test.d.ts.map +1 -0
  91. package/lib/esm/tests/api_tests/form_submitted_trigger.test.js +425 -0
  92. package/lib/esm/tests/api_tests/form_submitted_trigger.test.js.map +1 -0
  93. package/lib/esm/tests/api_tests/integrations_redacted.test.d.ts +6 -0
  94. package/lib/esm/tests/api_tests/integrations_redacted.test.d.ts.map +1 -0
  95. package/lib/esm/tests/api_tests/integrations_redacted.test.js +269 -0
  96. package/lib/esm/tests/api_tests/integrations_redacted.test.js.map +1 -0
  97. package/lib/esm/tests/api_tests/managed_content_file_access.test.d.ts +13 -0
  98. package/lib/esm/tests/api_tests/managed_content_file_access.test.d.ts.map +1 -0
  99. package/lib/esm/tests/api_tests/managed_content_file_access.test.js +358 -0
  100. package/lib/esm/tests/api_tests/managed_content_file_access.test.js.map +1 -0
  101. package/lib/esm/tests/api_tests/openloop_webhooks.test.d.ts.map +1 -1
  102. package/lib/esm/tests/api_tests/openloop_webhooks.test.js +108 -24
  103. package/lib/esm/tests/api_tests/openloop_webhooks.test.js.map +1 -1
  104. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.d.ts.map +1 -1
  105. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.js +25 -2
  106. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.js.map +1 -1
  107. package/lib/esm/tests/tests.d.ts.map +1 -1
  108. package/lib/esm/tests/tests.js +310 -183
  109. package/lib/esm/tests/tests.js.map +1 -1
  110. package/lib/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +10 -10
  112. package/src/sdk.ts +14 -0
  113. package/src/tests/api_tests/chats_analytics.test.ts +182 -0
  114. package/src/tests/api_tests/cross_org_api_key.test.ts +665 -0
  115. package/src/tests/api_tests/date_string_validation.test.ts +107 -0
  116. package/src/tests/api_tests/enduser_session_invalidation.test.ts +361 -0
  117. package/src/tests/api_tests/eom_procedure_codes.test.ts +296 -0
  118. package/src/tests/api_tests/field_redaction.test.ts +669 -0
  119. package/src/tests/api_tests/form_started_trigger.test.ts +1 -1
  120. package/src/tests/api_tests/form_submitted_trigger.test.ts +281 -0
  121. package/src/tests/api_tests/integrations_redacted.test.ts +245 -0
  122. package/src/tests/api_tests/managed_content_file_access.test.ts +214 -0
  123. package/src/tests/api_tests/openloop_webhooks.test.ts +64 -0
  124. package/src/tests/api_tests/organization_settings_duplicates.test.ts +14 -0
  125. package/src/tests/tests.ts +95 -7
  126. package/test_generated.pdf +0 -0
@@ -0,0 +1,296 @@
1
+ require('source-map-support').install();
2
+
3
+ import { Session } from "../../sdk"
4
+ import { async_test, log_header } from "@tellescope/testing"
5
+ import { setup_tests } from "../setup"
6
+
7
+ const host = process.env.API_URL || 'http://localhost:8080' as const
8
+
9
+ const sampleProcedureCodes = [
10
+ {
11
+ code: 'G0019',
12
+ units: 1,
13
+ feeCents: 12000,
14
+ modifiers: ['25'],
15
+ },
16
+ {
17
+ code: 'G0022',
18
+ units: 0,
19
+ },
20
+ ]
21
+
22
+ const sampleDiagnosisCodes = [
23
+ { code: 'Z71.3', description: 'Dietary counseling and surveillance' },
24
+ ]
25
+
26
+ export const eom_procedure_codes_tests = async ({ sdk } : { sdk: Session, sdkNonAdmin: Session }) => {
27
+ log_header("EOM FormResponse Procedure Codes Tests")
28
+
29
+ const enduser = await sdk.api.endusers.createOne({ fname: 'EOM', lname: 'Test' })
30
+ const createdFormIds: string[] = []
31
+ const createdFormResponseIds: string[] = []
32
+
33
+ try {
34
+ // Bootstrap a base FormResponse via prepare_form_response (bypasses the
35
+ // form_responses.createOne path that requires non-empty responses).
36
+ const baseForm = await sdk.api.forms.createOne({ title: 'EOM Procedure Codes Base Form' })
37
+ createdFormIds.push(baseForm.id)
38
+ const { response: formResponse } = await sdk.api.form_responses.prepare_form_response({
39
+ formId: baseForm.id,
40
+ enduserId: enduser.id,
41
+ })
42
+ createdFormResponseIds.push(formResponse.id)
43
+
44
+ // ---------- FormResponse-level field tests (existing behavior) ----------
45
+ await async_test(
46
+ 'updateOne accepts procedureCodes and diagnosisCodes on FormResponse',
47
+ () => sdk.api.form_responses.updateOne(formResponse.id, {
48
+ procedureCodes: sampleProcedureCodes,
49
+ diagnosisCodes: sampleDiagnosisCodes,
50
+ }),
51
+ { onResult: r => !!r && Array.isArray(r.procedureCodes) && r.procedureCodes.length === 2 && Array.isArray(r.diagnosisCodes) && r.diagnosisCodes.length === 1 }
52
+ )
53
+
54
+ await async_test(
55
+ 'getOne returns persisted procedureCodes/diagnosisCodes',
56
+ () => sdk.api.form_responses.getOne(formResponse.id),
57
+ { onResult: r => (
58
+ r.procedureCodes?.[0]?.code === 'G0019'
59
+ && r.procedureCodes?.[0]?.units === 1
60
+ && r.procedureCodes?.[0]?.feeCents === 12000
61
+ && r.procedureCodes?.[1]?.code === 'G0022'
62
+ && r.procedureCodes?.[1]?.units === 0
63
+ && r.diagnosisCodes?.[0]?.code === 'Z71.3'
64
+ ) }
65
+ )
66
+
67
+ await async_test(
68
+ 'updateOne rejects FormResponse procedureCode with non-string code',
69
+ () => sdk.api.form_responses.updateOne(formResponse.id, {
70
+ procedureCodes: [{ code: 12345 as any, units: 1 }],
71
+ }),
72
+ { shouldError: true, onError: () => true }
73
+ )
74
+
75
+ await async_test(
76
+ 'updateOne rejects FormResponse procedureCode with negative units',
77
+ () => sdk.api.form_responses.updateOne(formResponse.id, {
78
+ procedureCodes: [{ code: 'G0019', units: -1 }],
79
+ }),
80
+ { shouldError: true, onError: () => true }
81
+ )
82
+
83
+ await async_test(
84
+ 'updateOne rejects FormResponse diagnosisCode with non-string code',
85
+ () => sdk.api.form_responses.updateOne(formResponse.id, {
86
+ diagnosisCodes: [{ code: 12345 as any }],
87
+ }),
88
+ { shouldError: true, onError: () => true }
89
+ )
90
+
91
+ await async_test(
92
+ 'updateOne can clear procedureCodes/diagnosisCodes with empty arrays via replaceObjectFields',
93
+ () => sdk.api.form_responses.updateOne(formResponse.id, {
94
+ procedureCodes: [],
95
+ diagnosisCodes: [],
96
+ }, { replaceObjectFields: true }),
97
+ { onResult: r => (
98
+ Array.isArray(r.procedureCodes) && r.procedureCodes.length === 0
99
+ && Array.isArray(r.diagnosisCodes) && r.diagnosisCodes.length === 0
100
+ ) }
101
+ )
102
+
103
+ // ---------- Form-level field validators ----------
104
+ await async_test(
105
+ 'forms.createOne accepts valid procedureCodes/diagnosisCodes',
106
+ () => sdk.api.forms.createOne({
107
+ title: 'EOM Procedure Codes Form (valid codes)',
108
+ procedureCodes: sampleProcedureCodes,
109
+ diagnosisCodes: sampleDiagnosisCodes,
110
+ }),
111
+ { onResult: f => {
112
+ createdFormIds.push(f.id)
113
+ return f.procedureCodes?.length === 2
114
+ && f.procedureCodes?.[0]?.code === 'G0019'
115
+ && f.diagnosisCodes?.[0]?.code === 'Z71.3'
116
+ } }
117
+ )
118
+
119
+ await async_test(
120
+ 'forms.createOne rejects procedureCode with non-string code',
121
+ () => sdk.api.forms.createOne({
122
+ title: 'EOM Bad Form',
123
+ procedureCodes: [{ code: 12345 as any, units: 1 }],
124
+ }),
125
+ { shouldError: true, onError: () => true }
126
+ )
127
+
128
+ await async_test(
129
+ 'forms.createOne rejects procedureCode with negative units',
130
+ () => sdk.api.forms.createOne({
131
+ title: 'EOM Bad Form',
132
+ procedureCodes: [{ code: 'G0019', units: -1 }],
133
+ }),
134
+ { shouldError: true, onError: () => true }
135
+ )
136
+
137
+ await async_test(
138
+ 'forms.createOne rejects diagnosisCode with non-string code',
139
+ () => sdk.api.forms.createOne({
140
+ title: 'EOM Bad Form',
141
+ diagnosisCodes: [{ code: 12345 as any }],
142
+ }),
143
+ { shouldError: true, onError: () => true }
144
+ )
145
+
146
+ // ---------- prepare_form_response copy-on-prepare from Form ----------
147
+ const formWithCodes = await sdk.api.forms.createOne({
148
+ title: 'EOM Procedure Codes Form (with codes)',
149
+ procedureCodes: sampleProcedureCodes,
150
+ diagnosisCodes: sampleDiagnosisCodes,
151
+ })
152
+ createdFormIds.push(formWithCodes.id)
153
+
154
+ let preparedFromFormResponseId = ''
155
+ await async_test(
156
+ 'prepare_form_response copies procedureCodes/diagnosisCodes from Form when no args',
157
+ () => sdk.api.form_responses.prepare_form_response({
158
+ formId: formWithCodes.id,
159
+ enduserId: enduser.id,
160
+ }),
161
+ { onResult: r => {
162
+ preparedFromFormResponseId = r.response.id
163
+ createdFormResponseIds.push(r.response.id)
164
+ return r.response.procedureCodes?.length === 2
165
+ && r.response.procedureCodes?.[0]?.code === 'G0019'
166
+ && r.response.diagnosisCodes?.[0]?.code === 'Z71.3'
167
+ } }
168
+ )
169
+
170
+ await async_test(
171
+ 'persisted FormResponse retains Form codes after prepare',
172
+ () => sdk.api.form_responses.getOne(preparedFromFormResponseId),
173
+ { onResult: r => (
174
+ r.procedureCodes?.length === 2
175
+ && r.procedureCodes?.[0]?.code === 'G0019'
176
+ && r.diagnosisCodes?.[0]?.code === 'Z71.3'
177
+ ) }
178
+ )
179
+
180
+ // ---------- prepare args override Form defaults ----------
181
+ const overrideProcedureCodes = [{ code: '99213', units: 1 }]
182
+ const overrideDiagnosisCodes = [{ code: 'E11.9', description: 'Type 2 diabetes' }]
183
+
184
+ let overridePreparedResponseId = ''
185
+ await async_test(
186
+ 'prepare_form_response args override Form defaults',
187
+ () => sdk.api.form_responses.prepare_form_response({
188
+ formId: formWithCodes.id,
189
+ enduserId: enduser.id,
190
+ procedureCodes: overrideProcedureCodes,
191
+ diagnosisCodes: overrideDiagnosisCodes,
192
+ }),
193
+ { onResult: r => {
194
+ overridePreparedResponseId = r.response.id
195
+ createdFormResponseIds.push(r.response.id)
196
+ return r.response.procedureCodes?.length === 1
197
+ && r.response.procedureCodes?.[0]?.code === '99213'
198
+ && r.response.diagnosisCodes?.length === 1
199
+ && r.response.diagnosisCodes?.[0]?.code === 'E11.9'
200
+ } }
201
+ )
202
+
203
+ await async_test(
204
+ 'persisted overridden FormResponse retains override codes',
205
+ () => sdk.api.form_responses.getOne(overridePreparedResponseId),
206
+ { onResult: r => (
207
+ r.procedureCodes?.[0]?.code === '99213'
208
+ && r.diagnosisCodes?.[0]?.code === 'E11.9'
209
+ ) }
210
+ )
211
+
212
+ // ---------- prepare with no Form defaults ----------
213
+ const formWithoutCodes = await sdk.api.forms.createOne({
214
+ title: 'EOM Procedure Codes Form (no codes)',
215
+ })
216
+ createdFormIds.push(formWithoutCodes.id)
217
+
218
+ await async_test(
219
+ 'prepare_form_response with args on a Form lacking codes uses the args',
220
+ () => sdk.api.form_responses.prepare_form_response({
221
+ formId: formWithoutCodes.id,
222
+ enduserId: enduser.id,
223
+ procedureCodes: overrideProcedureCodes,
224
+ diagnosisCodes: overrideDiagnosisCodes,
225
+ }),
226
+ { onResult: r => {
227
+ createdFormResponseIds.push(r.response.id)
228
+ return r.response.procedureCodes?.[0]?.code === '99213'
229
+ && r.response.diagnosisCodes?.[0]?.code === 'E11.9'
230
+ } }
231
+ )
232
+
233
+ // ---------- prepare with no defaults and no args yields no codes ----------
234
+ await async_test(
235
+ 'prepare_form_response with no codes anywhere produces FormResponse without codes',
236
+ () => sdk.api.form_responses.prepare_form_response({
237
+ formId: formWithoutCodes.id,
238
+ enduserId: enduser.id,
239
+ }),
240
+ { onResult: r => {
241
+ createdFormResponseIds.push(r.response.id)
242
+ return !r.response.procedureCodes && !r.response.diagnosisCodes
243
+ } }
244
+ )
245
+
246
+ // ---------- prepare rejects bad code shapes ----------
247
+ await async_test(
248
+ 'prepare_form_response rejects procedureCode with non-string code',
249
+ () => sdk.api.form_responses.prepare_form_response({
250
+ formId: formWithoutCodes.id,
251
+ enduserId: enduser.id,
252
+ procedureCodes: [{ code: 12345 as any, units: 1 }],
253
+ }),
254
+ { shouldError: true, onError: () => true }
255
+ )
256
+
257
+ await async_test(
258
+ 'prepare_form_response rejects procedureCode with negative units',
259
+ () => sdk.api.form_responses.prepare_form_response({
260
+ formId: formWithoutCodes.id,
261
+ enduserId: enduser.id,
262
+ procedureCodes: [{ code: 'G0019', units: -1 }],
263
+ }),
264
+ { shouldError: true, onError: () => true }
265
+ )
266
+ } finally {
267
+ for (const id of createdFormResponseIds) {
268
+ await sdk.api.form_responses.deleteOne(id).catch(() => {})
269
+ }
270
+ for (const id of createdFormIds) {
271
+ await sdk.api.forms.deleteOne(id).catch(() => {})
272
+ }
273
+ await sdk.api.endusers.deleteOne(enduser.id).catch(() => {})
274
+ }
275
+ }
276
+
277
+ if (require.main === module) {
278
+ console.log(`🌐 Using API URL: ${host}`)
279
+ const sdk = new Session({ host })
280
+ const sdkNonAdmin = new Session({ host })
281
+
282
+ const runTests = async () => {
283
+ await setup_tests(sdk, sdkNonAdmin)
284
+ await eom_procedure_codes_tests({ sdk, sdkNonAdmin })
285
+ }
286
+
287
+ runTests()
288
+ .then(() => {
289
+ console.log("✅ EOM procedure codes test suite completed successfully")
290
+ process.exit(0)
291
+ })
292
+ .catch((error) => {
293
+ console.error("❌ EOM procedure codes test suite failed:", error)
294
+ process.exit(1)
295
+ })
296
+ }