@haste-health/testscript-runner 0.8.3

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/README.md ADDED
@@ -0,0 +1 @@
1
+ # @haste-health/testscript-runner
package/lib/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { Logger } from "pino";
2
+ import createHTTPClient from "@haste-health/client/http";
3
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
4
+ /**
5
+ * Execute a TestScript and return results as TestReport.
6
+ * @param client HasteHealth client instance
7
+ * @param version FHIR Version
8
+ * @param testScript The testscript to run.
9
+ * @returns TestReport of results from testscript.
10
+ */
11
+ export declare function run<Version extends FHIR_VERSION>(logger: Logger<string>, client: ReturnType<typeof createHTTPClient>, version: Version, testScript: Resource<Version, "TestScript">, timeout?: number): Promise<Resource<Version, "TestReport">>;
package/lib/index.js ADDED
@@ -0,0 +1,733 @@
1
+ import { isResponseError } from "@haste-health/client/http";
2
+ import { parseQuery } from "@haste-health/client/url";
3
+ import { descend, pointer as fhirPointer, get, root, } from "@haste-health/fhir-pointer";
4
+ import * as fhirpath from "@haste-health/fhirpath";
5
+ import { OperationError, outcomeError, outcomeFatal, } from "@haste-health/operation-outcomes";
6
+ function getFixtureResource(state, id) {
7
+ const v = state.fixtures[id];
8
+ if (!v) {
9
+ throw new OperationError(outcomeFatal("invalid", `fixture with id '${id}' not found`));
10
+ }
11
+ switch (v.type) {
12
+ case "response":
13
+ case "request": {
14
+ if ("body" in v.data) {
15
+ return v.data.body;
16
+ }
17
+ throw new OperationError(outcomeFatal("invalid", `Response or Request body not found on fixture '${id}'`));
18
+ }
19
+ case "resource": {
20
+ if (v.data.resourceType === "Binary" &&
21
+ v.data.contentType === "application/fhir+json" &&
22
+ v.data.data) {
23
+ return JSON.parse(v.data.data);
24
+ }
25
+ return v.data;
26
+ }
27
+ }
28
+ }
29
+ const PATCH_CONTENT_TYPE = "application/json-patch+json";
30
+ function getPatches(state, id) {
31
+ const fixture = state.fixtures[id];
32
+ if (fixture?.type !== "resource" || fixture.data.resourceType !== "Binary") {
33
+ throw new OperationError(outcomeFatal("invalid", `Binary with id '${id}' not found`));
34
+ }
35
+ if (fixture.data.contentType !== PATCH_CONTENT_TYPE) {
36
+ throw new OperationError(outcomeFatal("invalid", `Binary with id '${id}' must be of content type '${PATCH_CONTENT_TYPE}' `));
37
+ }
38
+ if (!fixture.data.data) {
39
+ throw new OperationError(outcomeFatal("invalid", `Binary with id '${id}' must have data.`));
40
+ }
41
+ let patches;
42
+ try {
43
+ patches = JSON.parse(fixture.data.data);
44
+ }
45
+ catch (e) {
46
+ throw new OperationError(outcomeError("invalid", `Invalid JSON Patch`));
47
+ }
48
+ if (!Array.isArray(patches)) {
49
+ throw new OperationError(outcomeError("invalid", `Invalid JSON Patch`));
50
+ }
51
+ return patches;
52
+ }
53
+ async function getVariable(state, variables, variableName) {
54
+ const variable = variables.find((v) => v.name === variableName);
55
+ if (!variable)
56
+ throw new OperationError(outcomeFatal("invalid", `variable with id '${variableName}' not found`));
57
+ switch (true) {
58
+ case variable.expression !== undefined: {
59
+ return (await fhirpath.evaluate(variable.expression, variable.sourceId
60
+ ? getFixtureResource(state, variable.sourceId)
61
+ : undefined))[0];
62
+ }
63
+ default: {
64
+ throw new OperationError(outcomeFatal("not-supported", `expression variables are only supported for now.`));
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Return the default source (by default is Response in unless specified a sourceId or direction request)
70
+ * @param state Current test state
71
+ * @param assertion
72
+ * @returns
73
+ */
74
+ function getSource(state, assertion) {
75
+ switch (true) {
76
+ case assertion.sourceId !== undefined: {
77
+ return getFixtureResource(state, assertion.sourceId);
78
+ }
79
+ case assertion.direction === "request": {
80
+ if (!state.latestRequest?.data || !("body" in state.latestRequest.data))
81
+ return undefined;
82
+ return state.latestRequest?.data.body;
83
+ }
84
+ // Default can be assumed as response.
85
+ case assertion.direction === "response":
86
+ default: {
87
+ if (!state.latestResponse?.data || !("body" in state.latestResponse.data))
88
+ return undefined;
89
+ return state.latestResponse?.data.body;
90
+ }
91
+ }
92
+ }
93
+ const EXPRESSION_REGEX = /\${([^}]*)}/;
94
+ async function evaluateVariables(state, pointer, value) {
95
+ let output = value;
96
+ const variables = get(descend(root(pointer), "variable"), state.testScript) ?? [];
97
+ while (EXPRESSION_REGEX.test(output)) {
98
+ const result = EXPRESSION_REGEX.exec(output);
99
+ const variableName = result?.[1];
100
+ const match = result?.[0];
101
+ if (!match || !variableName) {
102
+ throw new Error("Invalid expression");
103
+ }
104
+ const variableValue = (await getVariable(state, variables, variableName))?.toString();
105
+ if (!variableValue)
106
+ throw new OperationError(outcomeError("invalid", `Variable with id '${variableName}' not found.`));
107
+ output = output.replace(match, variableValue);
108
+ }
109
+ return output;
110
+ }
111
+ async function operationToFHIRRequest(state, pointer) {
112
+ // See https://hl7.org/fhir/r4/valueset-testscript-operation-codes.html
113
+ const operation = get(pointer, state.testScript);
114
+ // Extending this with "invoke" for invoking generic operations.
115
+ switch (operation?.type?.code) {
116
+ case "invoke": {
117
+ // Assume the op code is provided by url.
118
+ const op = operation.url;
119
+ if (!op) {
120
+ throw new OperationError(outcomeFatal("invalid", `url is required for invoke operation which is used as the operation code.`));
121
+ }
122
+ if (!operation.sourceId) {
123
+ throw new OperationError(outcomeError("invalid", "sourceId is required for invoke operation"));
124
+ }
125
+ const parameters = getFixtureResource(state, operation.sourceId);
126
+ if (parameters.resourceType !== "Parameters") {
127
+ throw new OperationError(outcomeError("invalid", `sourceId must point to Parameters resource for ${operation.sourceId}`));
128
+ }
129
+ switch (true) {
130
+ case operation.targetId !== undefined: {
131
+ const target = getFixtureResource(state, operation.targetId);
132
+ if (!target.id)
133
+ throw new OperationError(outcomeFatal("invalid", `targetId must have an id on resource for '${operation.targetId}'`));
134
+ return {
135
+ fhirVersion: state.version,
136
+ level: "instance",
137
+ type: "invoke-request",
138
+ resource: operation.resource ?? target.resourceType,
139
+ id: target.id,
140
+ operation: op,
141
+ body: parameters,
142
+ };
143
+ }
144
+ case operation.resource !== undefined: {
145
+ return {
146
+ fhirVersion: state.version,
147
+ level: "type",
148
+ type: "invoke-request",
149
+ resource: operation.resource,
150
+ operation: op,
151
+ body: parameters,
152
+ };
153
+ }
154
+ default: {
155
+ return {
156
+ fhirVersion: state.version,
157
+ level: "system",
158
+ type: "invoke-request",
159
+ operation: op,
160
+ body: parameters,
161
+ };
162
+ }
163
+ }
164
+ }
165
+ case "read": {
166
+ if (!operation.targetId)
167
+ throw new OperationError(outcomeFatal("invalid", "targetId is required for read operation"));
168
+ const target = getFixtureResource(state, operation.targetId);
169
+ return {
170
+ fhirVersion: state.version,
171
+ level: "instance",
172
+ type: "read-request",
173
+ resource: operation.resource ??
174
+ target?.resourceType,
175
+ id: target?.id,
176
+ };
177
+ }
178
+ case "create": {
179
+ if (!operation.sourceId)
180
+ throw new OperationError(outcomeFatal("invalid", "sourceId is required for read operation"));
181
+ const target = getFixtureResource(state, operation.sourceId);
182
+ return {
183
+ fhirVersion: state.version,
184
+ level: "type",
185
+ type: "create-request",
186
+ resource: operation.resource ?? target.resourceType,
187
+ body: target,
188
+ };
189
+ }
190
+ case "patch": {
191
+ if (!operation.targetId)
192
+ throw new OperationError(outcomeFatal("invalid", "targetId is required for patch operation"));
193
+ if (!operation.sourceId)
194
+ throw new OperationError(outcomeFatal("invalid", "sourceId is required for patch operation"));
195
+ const target = getFixtureResource(state, operation.targetId);
196
+ return {
197
+ fhirVersion: state.version,
198
+ level: "instance",
199
+ type: "patch-request",
200
+ resource: operation.resource ??
201
+ target?.resourceType,
202
+ id: target?.id,
203
+ body: getPatches(state, operation.sourceId),
204
+ };
205
+ }
206
+ case "vread": {
207
+ if (!operation.targetId)
208
+ throw new OperationError(outcomeFatal("invalid", "targetId is required for vread operation"));
209
+ const target = getFixtureResource(state, operation.targetId);
210
+ return {
211
+ fhirVersion: state.version,
212
+ level: "instance",
213
+ type: "vread-request",
214
+ resource: operation.resource ?? target?.resourceType,
215
+ id: target?.id,
216
+ versionId: getFixtureResource(state, operation.targetId)?.meta
217
+ ?.versionId,
218
+ };
219
+ }
220
+ case "update": {
221
+ if (!operation.sourceId)
222
+ throw new OperationError(outcomeFatal("invalid", "sourceId is required for update operation"));
223
+ switch (true) {
224
+ case operation.params !== undefined: {
225
+ let source = getFixtureResource(state, operation.sourceId);
226
+ if (operation.targetId) {
227
+ const target = getFixtureResource(state, operation.targetId);
228
+ source = {
229
+ ...source,
230
+ resourceType: (operation.resource ??
231
+ target?.resourceType),
232
+ id: target?.id,
233
+ };
234
+ }
235
+ return {
236
+ fhirVersion: state.version,
237
+ level: "type",
238
+ type: "update-request",
239
+ resource: operation.resource,
240
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params)),
241
+ body: source,
242
+ };
243
+ }
244
+ case operation.targetId !== undefined: {
245
+ const target = getFixtureResource(state, operation.targetId);
246
+ return {
247
+ fhirVersion: state.version,
248
+ level: "instance",
249
+ type: "update-request",
250
+ resource: operation.resource ??
251
+ target?.resourceType,
252
+ id: target?.id,
253
+ body: getFixtureResource(state, operation.sourceId),
254
+ };
255
+ }
256
+ default: {
257
+ throw new OperationError(outcomeFatal("business-rule", "Must have either a targetId or params for update."));
258
+ }
259
+ }
260
+ }
261
+ case "delete": {
262
+ switch (true) {
263
+ case operation.targetId !== undefined: {
264
+ const target = getFixtureResource(state, operation.targetId);
265
+ return {
266
+ fhirVersion: state.version,
267
+ level: "instance",
268
+ type: "delete-request",
269
+ resource: operation.resource ?? target?.resourceType,
270
+ id: target?.id,
271
+ };
272
+ }
273
+ case operation.resource !== undefined: {
274
+ return {
275
+ fhirVersion: state.version,
276
+ level: "type",
277
+ type: "delete-request",
278
+ resource: operation.resource,
279
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
280
+ };
281
+ }
282
+ case operation.params !== undefined: {
283
+ return {
284
+ fhirVersion: state.version,
285
+ level: "system",
286
+ type: "delete-request",
287
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
288
+ };
289
+ }
290
+ default: {
291
+ throw new OperationError(outcomeFatal("invalid", "Delete request is invalid."));
292
+ }
293
+ }
294
+ }
295
+ case "search": {
296
+ if (operation.resource) {
297
+ return {
298
+ fhirVersion: state.version,
299
+ level: "type",
300
+ type: "search-request",
301
+ resource: operation.resource,
302
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
303
+ };
304
+ }
305
+ else {
306
+ return {
307
+ fhirVersion: state.version,
308
+ level: "system",
309
+ type: "search-request",
310
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
311
+ };
312
+ }
313
+ }
314
+ case "batch": {
315
+ if (!operation.sourceId)
316
+ throw new OperationError(outcomeFatal("invalid", "sourceId is required for read operation"));
317
+ const batch = getFixtureResource(state, operation.sourceId);
318
+ if (batch.resourceType !== "Bundle" || batch.type !== "batch") {
319
+ throw new OperationError(outcomeFatal("invalid", `Batch request must be a bundle and a of type batch. Found instead '${batch.resourceType}' of type '${"type" in batch ? batch.type : "invalid"}'`));
320
+ }
321
+ return {
322
+ fhirVersion: state.version,
323
+ level: "system",
324
+ type: "batch-request",
325
+ body: batch,
326
+ };
327
+ }
328
+ case "transaction": {
329
+ if (!operation.sourceId)
330
+ throw new OperationError(outcomeFatal("invalid", "sourceId is required for read operation"));
331
+ const transaction = getFixtureResource(state, operation.sourceId);
332
+ if (transaction.resourceType !== "Bundle" ||
333
+ transaction.type !== "transaction") {
334
+ throw new OperationError(outcomeFatal("invalid", "Transaction request must be a bundle and a of type transaction."));
335
+ }
336
+ return {
337
+ fhirVersion: state.version,
338
+ level: "system",
339
+ type: "transaction-request",
340
+ body: transaction,
341
+ };
342
+ }
343
+ case "history": {
344
+ switch (true) {
345
+ case operation.targetId !== undefined: {
346
+ const target = getFixtureResource(state, operation.targetId);
347
+ return {
348
+ fhirVersion: state.version,
349
+ level: "instance",
350
+ type: "history-request",
351
+ resource: operation.resource ??
352
+ target?.resourceType,
353
+ id: target?.id,
354
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
355
+ };
356
+ }
357
+ case operation.resource !== undefined: {
358
+ return {
359
+ fhirVersion: state.version,
360
+ level: "type",
361
+ type: "history-request",
362
+ resource: operation.resource,
363
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
364
+ };
365
+ }
366
+ default: {
367
+ return {
368
+ fhirVersion: state.version,
369
+ level: "system",
370
+ type: "history-request",
371
+ parameters: parseQuery(await evaluateVariables(state, pointer, operation.params ?? "")),
372
+ };
373
+ }
374
+ }
375
+ }
376
+ default: {
377
+ throw new OperationError(outcomeFatal("not-supported", `operation of type '${operation?.type?.code}' is not supported`));
378
+ }
379
+ }
380
+ }
381
+ const numberRegex = /^-?\d+(\.\d+)?$/;
382
+ async function deriveComparision(state, assertion) {
383
+ if (assertion.compareToSourceId) {
384
+ const data = getFixtureResource(state, assertion.compareToSourceId);
385
+ switch (true) {
386
+ case assertion.compareToSourceExpression !== undefined: {
387
+ return (await fhirpath.evaluate(assertion.compareToSourceExpression, data))[0];
388
+ }
389
+ }
390
+ }
391
+ else if (assertion.value) {
392
+ switch (true) {
393
+ case numberRegex.test(assertion.value): {
394
+ return parseFloat(assertion.value);
395
+ }
396
+ case assertion.value === "true": {
397
+ return true;
398
+ }
399
+ case assertion.value === "false": {
400
+ return false;
401
+ }
402
+ default: {
403
+ return assertion.value;
404
+ }
405
+ }
406
+ }
407
+ throw new Error("Invalid Value could not derive comparison.");
408
+ }
409
+ /**
410
+ * [https://hl7.org/fhir/r4/valueset-assert-operator-codes.html]
411
+ * equals equals Default value. Equals comparison.
412
+ * notEquals notEquals Not equals comparison.
413
+ * in in Compare value within a known set of values.
414
+ * notIn notIn Compare value not within a known set of values.
415
+ * greaterThan greaterThan Compare value to be greater than a known value.
416
+ * lessThan lessThan Compare value to be less than a known value.
417
+ * empty empty Compare value is empty.
418
+ * notEmpty notEmpty Compare value is not empty.
419
+ * contains contains Compare value string contains a known value.
420
+ * notContains notContains Compare value string does not contain a known value.
421
+ * eval evaluate Evaluate the FHIRPath expression as a boolean condition.
422
+ */
423
+ function evaluateOperator(v1, v2, operator = "equals") {
424
+ switch (operator) {
425
+ case "equals":
426
+ return JSON.stringify(v1) === JSON.stringify(v2);
427
+ case "notEquals":
428
+ return JSON.stringify(v1) !== JSON.stringify(v2);
429
+ case "in":
430
+ return Array.isArray(v2) ? v2.includes(v1) : false;
431
+ case "notIn":
432
+ return Array.isArray(v2) ? !v2.includes(v1) : false;
433
+ case "greaterThan":
434
+ return parseInt(v1?.toString() ?? "") > parseInt(v2?.toString() ?? "");
435
+ case "lessThan":
436
+ return parseInt(v1?.toString() ?? "") < parseInt(v2?.toString() ?? "");
437
+ case "empty":
438
+ return Array.isArray(v1)
439
+ ? v1.length === 0
440
+ : v1 === undefined || v1 === null;
441
+ case "notEmpty":
442
+ return Array.isArray(v1)
443
+ ? v1.length !== 0
444
+ : v1 !== undefined && v1 !== null;
445
+ case "contains":
446
+ return typeof v1 === "string" && typeof v2 === "string"
447
+ ? v1.includes(v2)
448
+ : false;
449
+ case "notContains":
450
+ return typeof v1 === "string" && typeof v2 === "string"
451
+ ? !v1.includes(v2)
452
+ : false;
453
+ case "eval":
454
+ return v1 === v2;
455
+ default:
456
+ throw new OperationError(outcomeError("invalid", `Invalid operator '${operator}'`));
457
+ }
458
+ }
459
+ function assertionFailureMessage(found, expected, operator = "equals") {
460
+ return `Failed Assertion FOUND['${JSON.stringify(found)}'] !${operator} EXPECTED['${expected ? JSON.stringify(expected) : ""}']`;
461
+ }
462
+ async function runAssertion(state, pointer) {
463
+ const assertion = get(pointer, state.testScript);
464
+ if (!assertion)
465
+ throw new OperationError(outcomeFatal("invalid", `Assertion not found at ${pointer}`));
466
+ const source = getSource(state, assertion);
467
+ if (assertion.resource) {
468
+ if (source === undefined ||
469
+ !("resourceType" in source) ||
470
+ !evaluateOperator(source.resourceType, assertion.resource, assertion.operator)) {
471
+ const result = {
472
+ result: "fail",
473
+ message: assertionFailureMessage(source?.resourceType ?? "InvalidResourceType", assertion.resource, assertion.operator),
474
+ };
475
+ state.logger.error({ pointer, assertion, result });
476
+ return {
477
+ state: { ...state, result: "fail" },
478
+ result,
479
+ };
480
+ }
481
+ }
482
+ if (assertion.expression) {
483
+ const compValue = await deriveComparision(state, assertion);
484
+ const fpEvaluation = (await fhirpath.evaluate(assertion.expression, source))[0];
485
+ if (!evaluateOperator(fpEvaluation, compValue, assertion.operator)) {
486
+ const result = {
487
+ result: "fail",
488
+ message: assertionFailureMessage(fpEvaluation, compValue, assertion.operator),
489
+ };
490
+ state.logger.error({ pointer, assertion, result });
491
+ return {
492
+ state: { ...state, result: "fail" },
493
+ result,
494
+ };
495
+ }
496
+ }
497
+ const result = {
498
+ result: "pass",
499
+ message: "Assertions passed",
500
+ };
501
+ state.logger.info({ pointer, assertion, result });
502
+ return {
503
+ state,
504
+ result,
505
+ };
506
+ }
507
+ function associateResponseRequestVariables(_fixtures, operation, request, response) {
508
+ let fixtures = { ..._fixtures };
509
+ if (operation.responseId) {
510
+ fixtures = {
511
+ ...fixtures,
512
+ [operation.responseId]: { type: "response", data: response },
513
+ };
514
+ }
515
+ if (operation.requestId) {
516
+ fixtures = {
517
+ ...fixtures,
518
+ [operation.requestId]: { type: "request", data: request },
519
+ };
520
+ }
521
+ return fixtures;
522
+ }
523
+ async function runOperation(state, pointer) {
524
+ const operation = get(pointer, state.testScript);
525
+ if (!operation)
526
+ throw new OperationError(outcomeFatal("invalid", `Operation not found at '${pointer}'`));
527
+ try {
528
+ const request = await operationToFHIRRequest(state, pointer);
529
+ const response = await state.client.request({}, request);
530
+ // Hack because async so will wait a bit.
531
+ await new Promise((resolve) => setTimeout(() => resolve(undefined), state.timeout ?? 0));
532
+ const result = {
533
+ result: "pass",
534
+ message: `[SUCCEEDED]<${operation.type?.code}> label: '${operation.label ?? ""}'`,
535
+ };
536
+ state.logger.info({ pointer, operation, result });
537
+ return {
538
+ state: {
539
+ ...state,
540
+ fixtures: associateResponseRequestVariables(state.fixtures, operation, request, response),
541
+ latestRequest: { type: "request", data: request },
542
+ latestResponse: { type: "response", data: response },
543
+ },
544
+ result,
545
+ };
546
+ }
547
+ catch (e) {
548
+ const result = {
549
+ result: "fail",
550
+ message: `[FAILED]<${operation.type?.code}> label: '${operation.label ?? ""}'`,
551
+ outcome: e instanceof OperationError ? e.operationOutcome : undefined,
552
+ };
553
+ if (isResponseError(e)) {
554
+ return {
555
+ state: {
556
+ ...state,
557
+ fixtures: associateResponseRequestVariables(state.fixtures, operation, e.request, e.response),
558
+ latestRequest: { type: "request", data: e.request },
559
+ latestResponse: { type: "response", data: e.response },
560
+ },
561
+ result,
562
+ };
563
+ }
564
+ throw e;
565
+ }
566
+ }
567
+ async function runAction(state, pointer) {
568
+ const action = get(pointer, state.testScript);
569
+ if (action?.operation && action?.assert) {
570
+ throw new OperationError(outcomeFatal("invalid", "Must have either operation or assert but not both."));
571
+ }
572
+ switch (true) {
573
+ case action?.operation !== undefined: {
574
+ const output = await runOperation(state, descend(pointer, "operation"));
575
+ return {
576
+ state: output.state,
577
+ result: { operation: output.result },
578
+ };
579
+ }
580
+ case action?.assert !== undefined: {
581
+ const output = await runAssertion(state, descend(pointer, "assert"));
582
+ return {
583
+ state: output.state,
584
+ result: { assert: output.result },
585
+ };
586
+ }
587
+ default: {
588
+ throw new OperationError(outcomeFatal("code-invalid", "Unreachable case in evaluation action hit."));
589
+ }
590
+ }
591
+ }
592
+ async function runTest(state, pointer) {
593
+ let curState = state;
594
+ const testReports = [];
595
+ const test = get(pointer, state.testScript);
596
+ const actions = test?.action ?? [];
597
+ for (let i = 0; i < actions.length; i++) {
598
+ const output = await runAction({
599
+ ...curState,
600
+ logger: state.logger.child({
601
+ test: test?.name,
602
+ description: test?.description,
603
+ }),
604
+ }, descend(descend(pointer, "action"), i));
605
+ curState = output.state;
606
+ testReports.push(output.result);
607
+ }
608
+ return { state: { ...curState, logger: state.logger }, result: testReports };
609
+ }
610
+ async function runTests(state, pointer) {
611
+ const testResults = [];
612
+ let curState = state;
613
+ const tests = get(pointer, state.testScript) ?? [];
614
+ for (let i = 0; i < tests.length; i++) {
615
+ const output = await runTest(state, descend(pointer, i));
616
+ curState = output.state;
617
+ testResults.push({
618
+ name: get(descend(pointer, i), state.testScript)?.name,
619
+ action: output.result,
620
+ });
621
+ }
622
+ return {
623
+ state: curState.result === "pending"
624
+ ? { ...curState, result: "pass" }
625
+ : curState,
626
+ result: testResults,
627
+ };
628
+ }
629
+ async function runSetup(state, pointer) {
630
+ let curState = state;
631
+ const setupResults = [];
632
+ const actions = get(pointer, state.testScript)?.action ?? [];
633
+ for (let i = 0; i < actions.length; i++) {
634
+ const output = await runAction(curState, descend(descend(pointer, "action"), i));
635
+ curState = output.state;
636
+ setupResults.push(output.result);
637
+ }
638
+ return { state: curState, result: { action: setupResults } };
639
+ }
640
+ async function runTeardown(state, pointer) {
641
+ let curState = state;
642
+ const teardownResults = [];
643
+ const actions = get(pointer, state.testScript)?.action ?? [];
644
+ for (let i = 0; i < actions.length; i++) {
645
+ const output = await runOperation(curState, descend(descend(descend(pointer, "action"), i), "operation"));
646
+ curState = output.state;
647
+ teardownResults.push({ operation: output.result });
648
+ }
649
+ state.logger.info({ message: "teardown results:", teardownResults });
650
+ return { state: curState, result: { action: teardownResults } };
651
+ }
652
+ async function resolveFixtures(state, pointer) {
653
+ for (const fixture of get(descend(pointer, "fixture"), state.testScript) ??
654
+ []) {
655
+ if (!fixture.id) {
656
+ throw new OperationError(outcomeFatal("invalid", "fixture must have an id"));
657
+ }
658
+ const resource = fixture.resource;
659
+ if (!resource) {
660
+ throw new OperationError(outcomeFatal("invalid", "fixture must have a resource"));
661
+ }
662
+ let resolvedResource;
663
+ switch (true) {
664
+ case fixture.resource?.reference?.startsWith("#"): {
665
+ const id = (fixture.resource?.reference ?? "").slice(1);
666
+ resolvedResource = get(descend(pointer, "contained"), state.testScript)?.find((r) => r.id === id);
667
+ break;
668
+ }
669
+ default: {
670
+ const [type, id] = fixture.resource?.reference?.split("/") ?? [];
671
+ if (!type || !id) {
672
+ throw new OperationError(outcomeFatal("invalid", `invalid reference '${fixture.resource?.reference}'`));
673
+ }
674
+ resolvedResource = await state.client.read({}, state.version, type, id);
675
+ }
676
+ }
677
+ if (!resolvedResource) {
678
+ throw new OperationError(outcomeFatal("invalid", `contained resource with reference '${fixture.resource?.reference}' not found`));
679
+ }
680
+ state = {
681
+ ...state,
682
+ fixtures: {
683
+ ...state.fixtures,
684
+ [fixture.id]: {
685
+ type: "resource",
686
+ data: resolvedResource,
687
+ },
688
+ },
689
+ };
690
+ }
691
+ return state;
692
+ }
693
+ /**
694
+ * Execute a TestScript and return results as TestReport.
695
+ * @param client HasteHealth client instance
696
+ * @param version FHIR Version
697
+ * @param testScript The testscript to run.
698
+ * @returns TestReport of results from testscript.
699
+ */
700
+ export async function run(logger, client, version, testScript, timeout = 0) {
701
+ const testReport = {
702
+ testScript: { reference: `TestScript/${testScript.id}` },
703
+ result: "pending",
704
+ resourceType: "TestReport",
705
+ };
706
+ const pointer = fhirPointer(version, "TestScript", testScript.id);
707
+ let state = await resolveFixtures({
708
+ logger,
709
+ result: "pending",
710
+ version,
711
+ fixtures: {},
712
+ client,
713
+ testScript,
714
+ timeout,
715
+ }, pointer);
716
+ try {
717
+ const output = await runSetup(state, descend(pointer, "setup"));
718
+ state = output.state;
719
+ testReport.setup = output.result;
720
+ const testsOutput = await runTests(state, descend(pointer, "test"));
721
+ testReport.test = testsOutput.result;
722
+ state = testsOutput.state;
723
+ testReport.result = state.result;
724
+ return testReport;
725
+ }
726
+ finally {
727
+ const output = await runTeardown(state, descend(pointer, "teardown"));
728
+ state = output.state;
729
+ testReport.result = state.result;
730
+ testReport.teardown = output.result;
731
+ }
732
+ }
733
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@haste-health/testscript-runner",
3
+ "version": "0.8.3",
4
+ "target": "node",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "types": "lib/index.d.ts",
8
+ "dependencies": {
9
+ "@haste-health/client": "workspace:^",
10
+ "@haste-health/fhir-pointer": "workspace:^",
11
+ "@haste-health/fhirpath": "workspace:^",
12
+ "@haste-health/operation-outcomes": "workspace:^",
13
+ "@haste-health/x-fhir-query": "workspace:^",
14
+ "pino": "^9.6.0"
15
+ },
16
+ "devDependencies": {
17
+ "@haste-health/fhir-types": "workspace:^",
18
+ "typescript": "5.9.2"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "publish": "pnpm build && pnpm npm publish --access public --tolerate-republish"
23
+ },
24
+ "files": [
25
+ "lib/**"
26
+ ]
27
+ }