sof-mssql 1.0.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.
- package/LICENSE +202 -0
- package/README.md +346 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +85 -0
- package/dist/cli.js.map +1 -0
- package/dist/fhirpath/transpiler.d.ts +18 -0
- package/dist/fhirpath/transpiler.d.ts.map +1 -0
- package/dist/fhirpath/transpiler.js +82 -0
- package/dist/fhirpath/transpiler.js.map +1 -0
- package/dist/fhirpath/visitor.d.ts +153 -0
- package/dist/fhirpath/visitor.d.ts.map +1 -0
- package/dist/fhirpath/visitor.js +1295 -0
- package/dist/fhirpath/visitor.js.map +1 -0
- package/dist/generated/grammar/fhirpathLexer.d.ts +88 -0
- package/dist/generated/grammar/fhirpathLexer.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathLexer.js +598 -0
- package/dist/generated/grammar/fhirpathLexer.js.map +1 -0
- package/dist/generated/grammar/fhirpathListener.d.ts +589 -0
- package/dist/generated/grammar/fhirpathListener.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathListener.js +4 -0
- package/dist/generated/grammar/fhirpathListener.js.map +1 -0
- package/dist/generated/grammar/fhirpathParser.d.ts +470 -0
- package/dist/generated/grammar/fhirpathParser.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathParser.js +3022 -0
- package/dist/generated/grammar/fhirpathParser.js.map +1 -0
- package/dist/generated/grammar/fhirpathVisitor.d.ts +372 -0
- package/dist/generated/grammar/fhirpathVisitor.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathVisitor.js +4 -0
- package/dist/generated/grammar/fhirpathVisitor.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/load.d.ts +14 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +115 -0
- package/dist/load.js.map +1 -0
- package/dist/loader/connection.d.ts +36 -0
- package/dist/loader/connection.d.ts.map +1 -0
- package/dist/loader/connection.js +106 -0
- package/dist/loader/connection.js.map +1 -0
- package/dist/loader/discovery.d.ts +38 -0
- package/dist/loader/discovery.d.ts.map +1 -0
- package/dist/loader/discovery.js +107 -0
- package/dist/loader/discovery.js.map +1 -0
- package/dist/loader/index.d.ts +24 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +193 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/progress.d.ts +70 -0
- package/dist/loader/progress.d.ts.map +1 -0
- package/dist/loader/progress.js +206 -0
- package/dist/loader/progress.js.map +1 -0
- package/dist/loader/stream.d.ts +21 -0
- package/dist/loader/stream.d.ts.map +1 -0
- package/dist/loader/stream.js +103 -0
- package/dist/loader/stream.js.map +1 -0
- package/dist/loader/tables.d.ts +43 -0
- package/dist/loader/tables.d.ts.map +1 -0
- package/dist/loader/tables.js +88 -0
- package/dist/loader/tables.js.map +1 -0
- package/dist/loader/types.d.ts +134 -0
- package/dist/loader/types.d.ts.map +1 -0
- package/dist/loader/types.js +8 -0
- package/dist/loader/types.js.map +1 -0
- package/dist/parser.d.ts +60 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +226 -0
- package/dist/parser.js.map +1 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.d.ts +52 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.d.ts.map +1 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.js +144 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.js.map +1 -0
- package/dist/queryGenerator/ForEachProcessor.d.ts +127 -0
- package/dist/queryGenerator/ForEachProcessor.d.ts.map +1 -0
- package/dist/queryGenerator/ForEachProcessor.js +351 -0
- package/dist/queryGenerator/ForEachProcessor.js.map +1 -0
- package/dist/queryGenerator/PathParser.d.ts +64 -0
- package/dist/queryGenerator/PathParser.d.ts.map +1 -0
- package/dist/queryGenerator/PathParser.js +164 -0
- package/dist/queryGenerator/PathParser.js.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts +63 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.js +196 -0
- package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -0
- package/dist/queryGenerator/SelectCombinationExpander.d.ts +42 -0
- package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +1 -0
- package/dist/queryGenerator/SelectCombinationExpander.js +95 -0
- package/dist/queryGenerator/SelectCombinationExpander.js.map +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts +20 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.js +63 -0
- package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -0
- package/dist/queryGenerator/index.d.ts +10 -0
- package/dist/queryGenerator/index.d.ts.map +1 -0
- package/dist/queryGenerator/index.js +19 -0
- package/dist/queryGenerator/index.js.map +1 -0
- package/dist/queryGenerator.d.ts +61 -0
- package/dist/queryGenerator.d.ts.map +1 -0
- package/dist/queryGenerator.js +187 -0
- package/dist/queryGenerator.js.map +1 -0
- package/dist/tests/sqlOnFhir.test.d.ts +11 -0
- package/dist/tests/sqlOnFhir.test.d.ts.map +1 -0
- package/dist/tests/sqlOnFhir.test.js +24 -0
- package/dist/tests/sqlOnFhir.test.js.map +1 -0
- package/dist/tests/utils/database.d.ts +38 -0
- package/dist/tests/utils/database.d.ts.map +1 -0
- package/dist/tests/utils/database.js +258 -0
- package/dist/tests/utils/database.js.map +1 -0
- package/dist/tests/utils/generator.d.ts +58 -0
- package/dist/tests/utils/generator.d.ts.map +1 -0
- package/dist/tests/utils/generator.js +195 -0
- package/dist/tests/utils/generator.js.map +1 -0
- package/dist/tests/utils/reporter.d.ts +83 -0
- package/dist/tests/utils/reporter.d.ts.map +1 -0
- package/dist/tests/utils/reporter.js +245 -0
- package/dist/tests/utils/reporter.js.map +1 -0
- package/dist/tests/utils/sqlOnFhir.d.ts +33 -0
- package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -0
- package/dist/tests/utils/sqlOnFhir.js +281 -0
- package/dist/tests/utils/sqlOnFhir.js.map +1 -0
- package/dist/tests/utils/testContext.d.ts +18 -0
- package/dist/tests/utils/testContext.d.ts.map +1 -0
- package/dist/tests/utils/testContext.js +25 -0
- package/dist/tests/utils/testContext.js.map +1 -0
- package/dist/tests/utils/types.d.ts +31 -0
- package/dist/tests/utils/types.d.ts.map +1 -0
- package/dist/tests/utils/types.js +9 -0
- package/dist/tests/utils/types.js.map +1 -0
- package/dist/types.d.ts +288 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom Vitest reporter for SQL-on-FHIR test result collection.
|
|
4
|
+
*
|
|
5
|
+
* Collects test results during Vitest execution and formats them according
|
|
6
|
+
* to the FHIR sql-on-fhir-v2 test report schema. Results are stored globally
|
|
7
|
+
* and can be accessed after test completion for report generation.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
/**
|
|
13
|
+
* Custom Vitest reporter that collects SQL-on-FHIR test results.
|
|
14
|
+
*/
|
|
15
|
+
class SqlOnFhirReporter {
|
|
16
|
+
options;
|
|
17
|
+
testReport = {};
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.options = {
|
|
20
|
+
outputPath: "out/test-report.json",
|
|
21
|
+
autoWriteReport: true,
|
|
22
|
+
printSummary: true,
|
|
23
|
+
...options,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Called when all tests have finished running.
|
|
28
|
+
* @deprecated use onTestRunEnd instead
|
|
29
|
+
*/
|
|
30
|
+
onFinished(files, _errors, _coverage) {
|
|
31
|
+
if (!files)
|
|
32
|
+
return;
|
|
33
|
+
// Collect results from global storage set by dynamic tests
|
|
34
|
+
if (typeof global !== "undefined" && global.testResults) {
|
|
35
|
+
this.testReport = global.testResults;
|
|
36
|
+
}
|
|
37
|
+
// Also collect from Vitest task results as fallback
|
|
38
|
+
this.collectFromVitestTasks(files);
|
|
39
|
+
// Print summary if enabled
|
|
40
|
+
if (this.options.printSummary) {
|
|
41
|
+
this.printTestSummary(files);
|
|
42
|
+
}
|
|
43
|
+
// Write report file if enabled
|
|
44
|
+
if (this.options.autoWriteReport && this.options.outputPath) {
|
|
45
|
+
this.writeReport(this.options.outputPath);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Print a summary of test results to the console.
|
|
50
|
+
*/
|
|
51
|
+
printTestSummary(files) {
|
|
52
|
+
const stats = this.calculateTestStatistics(files);
|
|
53
|
+
if (stats.skipped > 0) {
|
|
54
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
55
|
+
console.log("SQL on FHIR Test Summary");
|
|
56
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
57
|
+
console.log(`Passed: ${stats.passed}`);
|
|
58
|
+
console.log(`Failed: ${stats.failed}`);
|
|
59
|
+
console.log(`Skipped: ${stats.skipped}`);
|
|
60
|
+
console.log(`Total: ${stats.total}`);
|
|
61
|
+
// Check for test name pattern filtering (used in CI)
|
|
62
|
+
if (process.argv.some((arg) => arg.includes("testNamePattern"))) {
|
|
63
|
+
console.log("\nNote: Tests tagged with #experimental were excluded from this run.");
|
|
64
|
+
console.log("These tests cover features outside the scope of this implementation.");
|
|
65
|
+
}
|
|
66
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Calculate test statistics from Vitest task results.
|
|
71
|
+
*/
|
|
72
|
+
calculateTestStatistics(files) {
|
|
73
|
+
let passed = 0;
|
|
74
|
+
let failed = 0;
|
|
75
|
+
let skipped = 0;
|
|
76
|
+
for (const file of files) {
|
|
77
|
+
if (!file.tasks)
|
|
78
|
+
continue;
|
|
79
|
+
for (const task of file.tasks) {
|
|
80
|
+
const stats = this.countTestsInTask(task);
|
|
81
|
+
passed += stats.passed;
|
|
82
|
+
failed += stats.failed;
|
|
83
|
+
skipped += stats.skipped;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
passed,
|
|
88
|
+
failed,
|
|
89
|
+
skipped,
|
|
90
|
+
total: passed + failed + skipped,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Recursively count test results in a task.
|
|
95
|
+
*/
|
|
96
|
+
countTestsInTask(task) {
|
|
97
|
+
let passed = 0;
|
|
98
|
+
let failed = 0;
|
|
99
|
+
let skipped = 0;
|
|
100
|
+
if (task.type === "test") {
|
|
101
|
+
if (task.mode === "skip" || task.result?.state === "skip") {
|
|
102
|
+
skipped++;
|
|
103
|
+
}
|
|
104
|
+
else if (task.result?.state === "pass") {
|
|
105
|
+
passed++;
|
|
106
|
+
}
|
|
107
|
+
else if (task.result?.state === "fail") {
|
|
108
|
+
failed++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if ("tasks" in task && task.tasks) {
|
|
112
|
+
for (const subtask of task.tasks) {
|
|
113
|
+
const stats = this.countTestsInTask(subtask);
|
|
114
|
+
passed += stats.passed;
|
|
115
|
+
failed += stats.failed;
|
|
116
|
+
skipped += stats.skipped;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { passed, failed, skipped };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Write the test report to a JSON file.
|
|
123
|
+
*/
|
|
124
|
+
writeReport(outputPath) {
|
|
125
|
+
try {
|
|
126
|
+
// Ensure the output directory exists
|
|
127
|
+
const outputDir = (0, path_1.dirname)(outputPath);
|
|
128
|
+
(0, fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
129
|
+
const reportJson = JSON.stringify(this.testReport, null, 2);
|
|
130
|
+
(0, fs_1.writeFileSync)(outputPath, reportJson, "utf8");
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error(`Failed to write test report to ${outputPath}:`, error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Collect test results from Vitest task results as fallback.
|
|
138
|
+
* Groups tests by their source file (e.g., "basic.json", "collection.json").
|
|
139
|
+
*/
|
|
140
|
+
collectFromVitestTasks(files) {
|
|
141
|
+
for (const file of files) {
|
|
142
|
+
if (!file.tasks)
|
|
143
|
+
continue;
|
|
144
|
+
for (const task of file.tasks) {
|
|
145
|
+
if (task.type === "suite" &&
|
|
146
|
+
task.name === "SQL on FHIR compliance tests") {
|
|
147
|
+
this.collectTestsFromParentSuite(task);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Collect tests from the parent "SQL on FHIR compliance tests" suite.
|
|
154
|
+
* Processes child suites and groups tests by filename.
|
|
155
|
+
*/
|
|
156
|
+
collectTestsFromParentSuite(parentSuite) {
|
|
157
|
+
if (!("tasks" in parentSuite) || !parentSuite.tasks)
|
|
158
|
+
return;
|
|
159
|
+
// The parent suite contains child suites for each test file
|
|
160
|
+
// (e.g., "basic", "collection", "foreach")
|
|
161
|
+
for (const childSuite of parentSuite.tasks) {
|
|
162
|
+
if (childSuite.type !== "suite")
|
|
163
|
+
continue;
|
|
164
|
+
// Derive filename from suite name (e.g., "basic" → "basic.json")
|
|
165
|
+
const fileName = `${childSuite.name}.json`;
|
|
166
|
+
const suiteTests = this.collectTestsFromSuite(childSuite, false);
|
|
167
|
+
if (suiteTests.length > 0) {
|
|
168
|
+
this.testReport[fileName] = {
|
|
169
|
+
tests: suiteTests,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Collect test results from a test suite.
|
|
176
|
+
*
|
|
177
|
+
* Note: This is a fallback mechanism. The primary test result collection
|
|
178
|
+
* happens in the DynamicVitestGenerator which stores results in global.testResults.
|
|
179
|
+
* This method extracts the plain test title from the formatted test name.
|
|
180
|
+
*
|
|
181
|
+
* @param suite The test suite to collect from
|
|
182
|
+
* @param recursive Whether to recursively collect from nested suites
|
|
183
|
+
*/
|
|
184
|
+
collectTestsFromSuite(suite, recursive = true) {
|
|
185
|
+
const tests = [];
|
|
186
|
+
if ("tasks" in suite && suite.tasks) {
|
|
187
|
+
for (const task of suite.tasks) {
|
|
188
|
+
if (task.type === "test") {
|
|
189
|
+
// Extract plain title from formatted name: "(suite) title #tag" -> "title"
|
|
190
|
+
const plainTitle = this.extractPlainTitle(task.name);
|
|
191
|
+
tests.push({
|
|
192
|
+
name: plainTitle,
|
|
193
|
+
result: {
|
|
194
|
+
passed: task.result?.state === "pass",
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
else if (task.type === "suite" && recursive) {
|
|
199
|
+
// Recursively collect from nested suites only if recursive is true
|
|
200
|
+
tests.push(...this.collectTestsFromSuite(task, recursive));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return tests;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Extract the plain test title from a formatted test name.
|
|
208
|
+
* Formatted: "(suite) title #tag1 #tag2"
|
|
209
|
+
* Plain: "title"
|
|
210
|
+
*/
|
|
211
|
+
extractPlainTitle(formattedName) {
|
|
212
|
+
// Remove suite prefix: "(suite) " -> ""
|
|
213
|
+
let title = formattedName.replace(/^\([^)]+\)\s+/, "");
|
|
214
|
+
// Remove tags: " #tag1 #tag2" -> ""
|
|
215
|
+
title = title.replace(/\s+#\S+/g, "");
|
|
216
|
+
return title.trim();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Clear the collected test results.
|
|
220
|
+
*/
|
|
221
|
+
clearResults() {
|
|
222
|
+
this.testReport = {};
|
|
223
|
+
if (typeof global !== "undefined") {
|
|
224
|
+
global.testResults = {};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Optional Vitest reporter methods (can be implemented as needed)
|
|
228
|
+
onInit(_ctx) {
|
|
229
|
+
// Clear results when reporter initializes
|
|
230
|
+
this.clearResults();
|
|
231
|
+
}
|
|
232
|
+
onUserConsoleLog(_log) {
|
|
233
|
+
// Pass through console logs
|
|
234
|
+
}
|
|
235
|
+
onWatcherStart() {
|
|
236
|
+
// Called when in watch mode
|
|
237
|
+
}
|
|
238
|
+
onWatcherRerun(_files, _trigger) {
|
|
239
|
+
// Called on file changes in watch mode
|
|
240
|
+
this.clearResults();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Used in vitest.config.ts as a custom reporter
|
|
244
|
+
exports.default = SqlOnFhirReporter;
|
|
245
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/tests/utils/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for SQL-on-FHIR Vitest tests.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for ViewDefinition transpilation, SQL execution,
|
|
5
|
+
* result comparison, and other common test operations.
|
|
6
|
+
*/
|
|
7
|
+
import { ViewDefinition } from "../../types";
|
|
8
|
+
/**
|
|
9
|
+
* Result of executing a ViewDefinition with column metadata.
|
|
10
|
+
*/
|
|
11
|
+
export interface ViewDefinitionResult {
|
|
12
|
+
results: any[];
|
|
13
|
+
columns: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute a ViewDefinition against the database and return the results with column metadata.
|
|
17
|
+
*
|
|
18
|
+
* @param viewDefinition - The ViewDefinition to transpile and execute
|
|
19
|
+
* @param testId - Unique test identifier for data isolation
|
|
20
|
+
* @returns Object containing results array and column names in SQL order
|
|
21
|
+
*/
|
|
22
|
+
export declare function executeViewDefinition(viewDefinition: ViewDefinition, testId: string): Promise<ViewDefinitionResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Compare actual results with expected results, handling various data types and formats.
|
|
25
|
+
*
|
|
26
|
+
* @param actualResults - The actual query results
|
|
27
|
+
* @param expectedResults - The expected results from the test case
|
|
28
|
+
* @param expectedColumns - Optional array of expected column names
|
|
29
|
+
* @param actualColumns - Optional array of actual column names from SQL metadata
|
|
30
|
+
* @returns true if results match, false otherwise
|
|
31
|
+
*/
|
|
32
|
+
export declare function compareResults(actualResults: any[], expectedResults: any[], expectedColumns?: string[], actualColumns?: string[]): boolean;
|
|
33
|
+
//# sourceMappingURL=sqlOnFhir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkB7C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAqC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,GAAG,EAAE,EACpB,eAAe,EAAE,GAAG,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAkDT"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared utilities for SQL-on-FHIR Vitest tests.
|
|
4
|
+
*
|
|
5
|
+
* Provides functions for ViewDefinition transpilation, SQL execution,
|
|
6
|
+
* result comparison, and other common test operations.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.executeViewDefinition = executeViewDefinition;
|
|
10
|
+
exports.compareResults = compareResults;
|
|
11
|
+
const mssql_1 = require("mssql");
|
|
12
|
+
const queryGenerator_1 = require("../../queryGenerator");
|
|
13
|
+
const database_1 = require("./database");
|
|
14
|
+
let queryGeneratorInstance = null;
|
|
15
|
+
/**
|
|
16
|
+
* Get or create the QueryGenerator instance with database configuration.
|
|
17
|
+
*/
|
|
18
|
+
function getQueryGeneratorInstance() {
|
|
19
|
+
queryGeneratorInstance ??= new queryGenerator_1.QueryGenerator({
|
|
20
|
+
tableName: process.env.MSSQL_TEST_TABLE ?? "fhir_resources_test",
|
|
21
|
+
schemaName: process.env.MSSQL_SCHEMA ?? "dbo",
|
|
22
|
+
resourceIdColumn: "id",
|
|
23
|
+
resourceJsonColumn: "json",
|
|
24
|
+
});
|
|
25
|
+
return queryGeneratorInstance;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute a ViewDefinition against the database and return the results with column metadata.
|
|
29
|
+
*
|
|
30
|
+
* @param viewDefinition - The ViewDefinition to transpile and execute
|
|
31
|
+
* @param testId - Unique test identifier for data isolation
|
|
32
|
+
* @returns Object containing results array and column names in SQL order
|
|
33
|
+
*/
|
|
34
|
+
async function executeViewDefinition(viewDefinition, testId) {
|
|
35
|
+
try {
|
|
36
|
+
// Get database connection
|
|
37
|
+
const pool = (0, database_1.getDatabasePool)();
|
|
38
|
+
const queryGenerator = getQueryGeneratorInstance();
|
|
39
|
+
// Generate T-SQL query with test_id filter
|
|
40
|
+
const transpilationResult = queryGenerator.generateQuery(viewDefinition, testId);
|
|
41
|
+
const sql = transpilationResult.sql;
|
|
42
|
+
// Log the generated SQL for debugging
|
|
43
|
+
console.log("Generated SQL:", sql);
|
|
44
|
+
// Execute the query
|
|
45
|
+
const request = new mssql_1.Request(pool);
|
|
46
|
+
const queryResult = await request.query(sql);
|
|
47
|
+
// Extract column names from the query result metadata
|
|
48
|
+
// This preserves the actual SQL column order
|
|
49
|
+
const columns = Object.keys(queryResult.recordset.columns || {});
|
|
50
|
+
// Extract boolean column names from ViewDefinition
|
|
51
|
+
const booleanColumns = extractBooleanColumns(viewDefinition);
|
|
52
|
+
// Parse JSON strings and convert boolean columns in results
|
|
53
|
+
return {
|
|
54
|
+
results: parseJsonStringsInResults(queryResult.recordset, booleanColumns),
|
|
55
|
+
columns,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw new Error(`Failed to execute ViewDefinition: ${error instanceof Error ? error.message : String(error)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Compare actual results with expected results, handling various data types and formats.
|
|
64
|
+
*
|
|
65
|
+
* @param actualResults - The actual query results
|
|
66
|
+
* @param expectedResults - The expected results from the test case
|
|
67
|
+
* @param expectedColumns - Optional array of expected column names
|
|
68
|
+
* @param actualColumns - Optional array of actual column names from SQL metadata
|
|
69
|
+
* @returns true if results match, false otherwise
|
|
70
|
+
*/
|
|
71
|
+
function compareResults(actualResults, expectedResults, expectedColumns, actualColumns) {
|
|
72
|
+
// Check column ordering if specified
|
|
73
|
+
if (expectedColumns && expectedColumns.length > 0) {
|
|
74
|
+
// Use actualColumns from SQL metadata if provided, otherwise fall back to Object.keys
|
|
75
|
+
const columnsToCheck = actualColumns ??
|
|
76
|
+
(actualResults.length > 0 ? Object.keys(actualResults[0]) : []);
|
|
77
|
+
if (!arraysEqual(columnsToCheck, expectedColumns)) {
|
|
78
|
+
console.log("Column mismatch:");
|
|
79
|
+
console.log(" Expected:", expectedColumns);
|
|
80
|
+
console.log(" Actual: ", columnsToCheck);
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Normalize objects by sorting keys before comparing
|
|
85
|
+
const normalizeObject = (obj) => {
|
|
86
|
+
if (obj === null || typeof obj !== "object")
|
|
87
|
+
return obj;
|
|
88
|
+
if (Array.isArray(obj))
|
|
89
|
+
return obj.map(normalizeObject);
|
|
90
|
+
const sorted = {};
|
|
91
|
+
Object.keys(obj)
|
|
92
|
+
.sort((a, b) => a.localeCompare(b))
|
|
93
|
+
.forEach((key) => {
|
|
94
|
+
sorted[key] = normalizeObject(obj[key]);
|
|
95
|
+
});
|
|
96
|
+
return sorted;
|
|
97
|
+
};
|
|
98
|
+
// Sort both arrays to ignore row ordering, using normalized objects for consistent sorting
|
|
99
|
+
const sortedActual = [...actualResults]
|
|
100
|
+
.map(normalizeObject)
|
|
101
|
+
.sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));
|
|
102
|
+
const sortedExpected = [...expectedResults]
|
|
103
|
+
.map(normalizeObject)
|
|
104
|
+
.sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));
|
|
105
|
+
// Check if lengths match
|
|
106
|
+
if (sortedActual.length !== sortedExpected.length) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
// Compare each result object
|
|
110
|
+
for (let i = 0; i < sortedActual.length; i++) {
|
|
111
|
+
if (!deepEqual(sortedActual[i], sortedExpected[i])) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Deep equality comparison with special handling for FHIR data types.
|
|
119
|
+
*/
|
|
120
|
+
function deepEqual(a, b) {
|
|
121
|
+
if (a === b)
|
|
122
|
+
return true;
|
|
123
|
+
if (bothNullOrUndefined(a, b))
|
|
124
|
+
return true;
|
|
125
|
+
if (eitherNullOrUndefined(a, b))
|
|
126
|
+
return false;
|
|
127
|
+
if (typeof a !== typeof b) {
|
|
128
|
+
return handleBooleanNumberConversion(a, b);
|
|
129
|
+
}
|
|
130
|
+
if (typeof a === "object") {
|
|
131
|
+
return compareObjects(a, b);
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if both values are null or undefined.
|
|
137
|
+
*/
|
|
138
|
+
function bothNullOrUndefined(a, b) {
|
|
139
|
+
return (a === null || a === undefined) && (b === null || b === undefined);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if either value is null or undefined (but not both).
|
|
143
|
+
*/
|
|
144
|
+
function eitherNullOrUndefined(a, b) {
|
|
145
|
+
return a === null || a === undefined || b === null || b === undefined;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Handle boolean/number conversions for SQL Server BIT columns.
|
|
149
|
+
*/
|
|
150
|
+
function handleBooleanNumberConversion(a, b) {
|
|
151
|
+
if (typeof a === "boolean" && typeof b === "number") {
|
|
152
|
+
return (a ? 1 : 0) === b;
|
|
153
|
+
}
|
|
154
|
+
if (typeof b === "boolean" && typeof a === "number") {
|
|
155
|
+
return (b ? 1 : 0) === a;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Compare objects (arrays or plain objects).
|
|
161
|
+
*/
|
|
162
|
+
function compareObjects(a, b) {
|
|
163
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
164
|
+
return false;
|
|
165
|
+
if (Array.isArray(a)) {
|
|
166
|
+
return compareArrays(a, b);
|
|
167
|
+
}
|
|
168
|
+
return comparePlainObjects(a, b);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Compare two arrays element by element.
|
|
172
|
+
*/
|
|
173
|
+
function compareArrays(a, b) {
|
|
174
|
+
if (a.length !== b.length)
|
|
175
|
+
return false;
|
|
176
|
+
for (let i = 0; i < a.length; i++) {
|
|
177
|
+
if (!deepEqual(a[i], b[i]))
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Compare two plain objects key by key.
|
|
184
|
+
*/
|
|
185
|
+
function comparePlainObjects(a, b) {
|
|
186
|
+
const keysA = Object.keys(a);
|
|
187
|
+
const keysB = Object.keys(b);
|
|
188
|
+
if (keysA.length !== keysB.length)
|
|
189
|
+
return false;
|
|
190
|
+
return keysA.every((key) => deepEqual(a[key], b[key]));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if two arrays are equal (same elements in same order).
|
|
194
|
+
*/
|
|
195
|
+
function arraysEqual(a, b) {
|
|
196
|
+
if (a.length !== b.length)
|
|
197
|
+
return false;
|
|
198
|
+
return a.every((val, i) => val === b[i]);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Extract boolean column names from ViewDefinition.
|
|
202
|
+
*
|
|
203
|
+
* @param viewDefinition - The ViewDefinition to extract from
|
|
204
|
+
* @returns Set of column names that are declared as boolean type
|
|
205
|
+
*/
|
|
206
|
+
function extractBooleanColumns(viewDefinition) {
|
|
207
|
+
const booleanColumns = new Set();
|
|
208
|
+
// Recursively extract columns from select definitions
|
|
209
|
+
function extractFromSelect(selectDef) {
|
|
210
|
+
if (selectDef.column) {
|
|
211
|
+
for (const col of selectDef.column) {
|
|
212
|
+
if (col.type === "boolean") {
|
|
213
|
+
booleanColumns.add(col.name);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (selectDef.select) {
|
|
218
|
+
for (const nestedSelect of selectDef.select) {
|
|
219
|
+
extractFromSelect(nestedSelect);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (selectDef.forEach) {
|
|
223
|
+
for (const forEachDef of selectDef.forEach) {
|
|
224
|
+
extractFromSelect(forEachDef);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (selectDef.unionAll) {
|
|
228
|
+
for (const unionDef of selectDef.unionAll) {
|
|
229
|
+
extractFromSelect(unionDef);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (viewDefinition.select) {
|
|
234
|
+
for (const selectDef of viewDefinition.select) {
|
|
235
|
+
extractFromSelect(selectDef);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return booleanColumns;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Parse JSON strings in query results into actual arrays/objects.
|
|
242
|
+
* Also converts numeric boolean values (0/1) to actual booleans for columns marked as boolean type.
|
|
243
|
+
*
|
|
244
|
+
* SQL Server may return some values as JSON strings that need to be parsed.
|
|
245
|
+
* SQL Server also returns CASE expressions as TINYINT (0/1) instead of boolean.
|
|
246
|
+
*
|
|
247
|
+
* @param results - The query results to parse
|
|
248
|
+
* @param booleanColumns - Set of column names that should be treated as booleans
|
|
249
|
+
*/
|
|
250
|
+
function parseJsonStringsInResults(results, booleanColumns) {
|
|
251
|
+
return results.map((row) => {
|
|
252
|
+
const parsedRow = {};
|
|
253
|
+
for (const [key, value] of Object.entries(row)) {
|
|
254
|
+
// Convert numeric boolean values to actual booleans
|
|
255
|
+
if (booleanColumns.has(key) && typeof value === "number") {
|
|
256
|
+
parsedRow[key] = Boolean(value);
|
|
257
|
+
}
|
|
258
|
+
else if (typeof value === "string" && looksLikeJson(value)) {
|
|
259
|
+
try {
|
|
260
|
+
parsedRow[key] = JSON.parse(value);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// If parsing fails, keep the original string
|
|
264
|
+
parsedRow[key] = value;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
parsedRow[key] = value;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return parsedRow;
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Check if a string looks like JSON (starts with [ or {).
|
|
276
|
+
*/
|
|
277
|
+
function looksLikeJson(value) {
|
|
278
|
+
const trimmed = value.trim();
|
|
279
|
+
return trimmed.startsWith("[") || trimmed.startsWith("{");
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=sqlOnFhir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.js","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test context management for parallel test execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides unique test IDs for database isolation during concurrent test runs.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Generate a unique test ID for database isolation.
|
|
8
|
+
*
|
|
9
|
+
* The test ID is composed of:
|
|
10
|
+
* - Process ID (to handle multi-process execution)
|
|
11
|
+
* - Timestamp (for temporal uniqueness)
|
|
12
|
+
* - Counter (for uniqueness within same millisecond)
|
|
13
|
+
* - UUID (for guaranteed uniqueness)
|
|
14
|
+
*
|
|
15
|
+
* @returns Unique test identifier
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateTestId(): string;
|
|
18
|
+
//# sourceMappingURL=testContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContext.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/testContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test context management for parallel test execution.
|
|
4
|
+
*
|
|
5
|
+
* Provides unique test IDs for database isolation during concurrent test runs.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateTestId = generateTestId;
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
let testIdCounter = 0;
|
|
11
|
+
/**
|
|
12
|
+
* Generate a unique test ID for database isolation.
|
|
13
|
+
*
|
|
14
|
+
* The test ID is composed of:
|
|
15
|
+
* - Process ID (to handle multi-process execution)
|
|
16
|
+
* - Timestamp (for temporal uniqueness)
|
|
17
|
+
* - Counter (for uniqueness within same millisecond)
|
|
18
|
+
* - UUID (for guaranteed uniqueness)
|
|
19
|
+
*
|
|
20
|
+
* @returns Unique test identifier
|
|
21
|
+
*/
|
|
22
|
+
function generateTestId() {
|
|
23
|
+
return `test_${process.pid}_${Date.now()}_${testIdCounter++}_${(0, crypto_1.randomUUID)()}`;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=testContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContext.js","sourceRoot":"","sources":["../../../src/tests/utils/testContext.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAiBH,wCAEC;AAjBD,mCAAoC;AAEpC,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB;;;;;;;;;;GAUG;AACH,SAAgB,cAAc;IAC5B,OAAO,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,IAAI,IAAA,mBAAU,GAAE,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for test reporting.
|
|
3
|
+
*
|
|
4
|
+
* Matches the SQL on FHIR test report schema:
|
|
5
|
+
* https://raw.githubusercontent.com/FHIR/sql-on-fhir-v2/refs/heads/master/test_report/test-report.schema.json
|
|
6
|
+
*/
|
|
7
|
+
export interface TestReportEntry {
|
|
8
|
+
/** The name/description of the test case. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** The test execution result. */
|
|
11
|
+
result: {
|
|
12
|
+
/** Whether the test passed (true) or failed (false). */
|
|
13
|
+
passed: boolean;
|
|
14
|
+
/** Optional error message if the test failed. */
|
|
15
|
+
error?: string;
|
|
16
|
+
/** Optional additional details about the test result. */
|
|
17
|
+
details?: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface TestReportSuite {
|
|
21
|
+
/** Array of test cases within this test suite. */
|
|
22
|
+
tests: TestReportEntry[];
|
|
23
|
+
}
|
|
24
|
+
export interface TestReport {
|
|
25
|
+
/**
|
|
26
|
+
* Each property represents a test suite file (e.g., 'basic.json', 'common.json').
|
|
27
|
+
* The report should be a flat object where each key represents a test suite file.
|
|
28
|
+
*/
|
|
29
|
+
[suiteName: string]: TestReportSuite;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|