|
1 | 1 | import { beforeAll, expect, test } from 'vitest'; |
2 | 2 |
|
3 | 3 | import { ResultExtractor } from '../src/extractors/result-extractor.js'; |
| 4 | +import { ValueMap } from '../src/extractors/value-map.js'; |
4 | 5 | import { buildExtractor } from '../src/server/extractor-builder.js'; |
5 | 6 |
|
6 | 7 | let extractor: ResultExtractor | null = null; |
@@ -124,6 +125,36 @@ test('singleton list-typed return stays array when singletonListKeys includes re |
124 | 125 | ).toEqual(['a']); |
125 | 126 | }); |
126 | 127 |
|
| 128 | +test('FHIR empty list stays [] when expected is empty list (issue #90)', () => { |
| 129 | + const emptyListParameters = { |
| 130 | + resourceType: 'Parameters', |
| 131 | + parameter: [ |
| 132 | + { |
| 133 | + name: 'return', |
| 134 | + extension: [ |
| 135 | + { |
| 136 | + url: 'http://hl7.org/fhir/StructureDefinition/cqf-cqlType', |
| 137 | + valueString: 'List<System.Any>', |
| 138 | + }, |
| 139 | + ], |
| 140 | + _valueBoolean: { |
| 141 | + extension: [ |
| 142 | + { |
| 143 | + url: 'http://hl7.org/fhir/StructureDefinition/cqf-isEmptyList', |
| 144 | + valueBoolean: true, |
| 145 | + }, |
| 146 | + ], |
| 147 | + }, |
| 148 | + }, |
| 149 | + ], |
| 150 | + }; |
| 151 | + expect( |
| 152 | + extractor!.extract(emptyListParameters, { |
| 153 | + singletonListKeys: ValueMap.singletonListKeysFromExpected([]), |
| 154 | + }) |
| 155 | + ).toEqual([]); |
| 156 | +}); |
| 157 | + |
127 | 158 | test('date response check', () => { |
128 | 159 | expect( |
129 | 160 | extractor!.extract({ |
@@ -286,6 +317,32 @@ test('error response check', () => { |
286 | 317 | ); |
287 | 318 | }); |
288 | 319 |
|
| 320 | +test('evaluation error uses diagnostics when details.text is absent', () => { |
| 321 | + expect( |
| 322 | + extractor!.extract({ |
| 323 | + resourceType: 'Parameters', |
| 324 | + parameter: [ |
| 325 | + { |
| 326 | + name: 'evaluation error', |
| 327 | + resource: { |
| 328 | + resourceType: 'OperationOutcome', |
| 329 | + issue: [{ severity: 'error', diagnostics: 'CQL engine message' }], |
| 330 | + }, |
| 331 | + }, |
| 332 | + ], |
| 333 | + }) |
| 334 | + ).toBe('EvaluationError:CQL engine message'); |
| 335 | +}); |
| 336 | + |
| 337 | +test('evaluation error does not throw when resource shape is minimal', () => { |
| 338 | + expect( |
| 339 | + extractor!.extract({ |
| 340 | + resourceType: 'Parameters', |
| 341 | + parameter: [{ name: 'evaluation error', resource: { resourceType: 'OperationOutcome', issue: [] } }], |
| 342 | + }) |
| 343 | + ).toBe('EvaluationError:{"resourceType":"OperationOutcome","issue":[]}'); |
| 344 | +}); |
| 345 | + |
289 | 346 | test('period datetime response check', () => { |
290 | 347 | expect( |
291 | 348 | extractor!.extract({ |
|
0 commit comments