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.
Files changed (135) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +346 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +85 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/fhirpath/transpiler.d.ts +18 -0
  8. package/dist/fhirpath/transpiler.d.ts.map +1 -0
  9. package/dist/fhirpath/transpiler.js +82 -0
  10. package/dist/fhirpath/transpiler.js.map +1 -0
  11. package/dist/fhirpath/visitor.d.ts +153 -0
  12. package/dist/fhirpath/visitor.d.ts.map +1 -0
  13. package/dist/fhirpath/visitor.js +1295 -0
  14. package/dist/fhirpath/visitor.js.map +1 -0
  15. package/dist/generated/grammar/fhirpathLexer.d.ts +88 -0
  16. package/dist/generated/grammar/fhirpathLexer.d.ts.map +1 -0
  17. package/dist/generated/grammar/fhirpathLexer.js +598 -0
  18. package/dist/generated/grammar/fhirpathLexer.js.map +1 -0
  19. package/dist/generated/grammar/fhirpathListener.d.ts +589 -0
  20. package/dist/generated/grammar/fhirpathListener.d.ts.map +1 -0
  21. package/dist/generated/grammar/fhirpathListener.js +4 -0
  22. package/dist/generated/grammar/fhirpathListener.js.map +1 -0
  23. package/dist/generated/grammar/fhirpathParser.d.ts +470 -0
  24. package/dist/generated/grammar/fhirpathParser.d.ts.map +1 -0
  25. package/dist/generated/grammar/fhirpathParser.js +3022 -0
  26. package/dist/generated/grammar/fhirpathParser.js.map +1 -0
  27. package/dist/generated/grammar/fhirpathVisitor.d.ts +372 -0
  28. package/dist/generated/grammar/fhirpathVisitor.d.ts.map +1 -0
  29. package/dist/generated/grammar/fhirpathVisitor.js +4 -0
  30. package/dist/generated/grammar/fhirpathVisitor.js.map +1 -0
  31. package/dist/index.d.ts +28 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +42 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/load.d.ts +14 -0
  36. package/dist/load.d.ts.map +1 -0
  37. package/dist/load.js +115 -0
  38. package/dist/load.js.map +1 -0
  39. package/dist/loader/connection.d.ts +36 -0
  40. package/dist/loader/connection.d.ts.map +1 -0
  41. package/dist/loader/connection.js +106 -0
  42. package/dist/loader/connection.js.map +1 -0
  43. package/dist/loader/discovery.d.ts +38 -0
  44. package/dist/loader/discovery.d.ts.map +1 -0
  45. package/dist/loader/discovery.js +107 -0
  46. package/dist/loader/discovery.js.map +1 -0
  47. package/dist/loader/index.d.ts +24 -0
  48. package/dist/loader/index.d.ts.map +1 -0
  49. package/dist/loader/index.js +193 -0
  50. package/dist/loader/index.js.map +1 -0
  51. package/dist/loader/progress.d.ts +70 -0
  52. package/dist/loader/progress.d.ts.map +1 -0
  53. package/dist/loader/progress.js +206 -0
  54. package/dist/loader/progress.js.map +1 -0
  55. package/dist/loader/stream.d.ts +21 -0
  56. package/dist/loader/stream.d.ts.map +1 -0
  57. package/dist/loader/stream.js +103 -0
  58. package/dist/loader/stream.js.map +1 -0
  59. package/dist/loader/tables.d.ts +43 -0
  60. package/dist/loader/tables.d.ts.map +1 -0
  61. package/dist/loader/tables.js +88 -0
  62. package/dist/loader/tables.js.map +1 -0
  63. package/dist/loader/types.d.ts +134 -0
  64. package/dist/loader/types.d.ts.map +1 -0
  65. package/dist/loader/types.js +8 -0
  66. package/dist/loader/types.js.map +1 -0
  67. package/dist/parser.d.ts +60 -0
  68. package/dist/parser.d.ts.map +1 -0
  69. package/dist/parser.js +226 -0
  70. package/dist/parser.js.map +1 -0
  71. package/dist/queryGenerator/ColumnExpressionGenerator.d.ts +52 -0
  72. package/dist/queryGenerator/ColumnExpressionGenerator.d.ts.map +1 -0
  73. package/dist/queryGenerator/ColumnExpressionGenerator.js +144 -0
  74. package/dist/queryGenerator/ColumnExpressionGenerator.js.map +1 -0
  75. package/dist/queryGenerator/ForEachProcessor.d.ts +127 -0
  76. package/dist/queryGenerator/ForEachProcessor.d.ts.map +1 -0
  77. package/dist/queryGenerator/ForEachProcessor.js +351 -0
  78. package/dist/queryGenerator/ForEachProcessor.js.map +1 -0
  79. package/dist/queryGenerator/PathParser.d.ts +64 -0
  80. package/dist/queryGenerator/PathParser.d.ts.map +1 -0
  81. package/dist/queryGenerator/PathParser.js +164 -0
  82. package/dist/queryGenerator/PathParser.js.map +1 -0
  83. package/dist/queryGenerator/SelectClauseBuilder.d.ts +63 -0
  84. package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -0
  85. package/dist/queryGenerator/SelectClauseBuilder.js +196 -0
  86. package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -0
  87. package/dist/queryGenerator/SelectCombinationExpander.d.ts +42 -0
  88. package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +1 -0
  89. package/dist/queryGenerator/SelectCombinationExpander.js +95 -0
  90. package/dist/queryGenerator/SelectCombinationExpander.js.map +1 -0
  91. package/dist/queryGenerator/WhereClauseBuilder.d.ts +20 -0
  92. package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -0
  93. package/dist/queryGenerator/WhereClauseBuilder.js +63 -0
  94. package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -0
  95. package/dist/queryGenerator/index.d.ts +10 -0
  96. package/dist/queryGenerator/index.d.ts.map +1 -0
  97. package/dist/queryGenerator/index.js +19 -0
  98. package/dist/queryGenerator/index.js.map +1 -0
  99. package/dist/queryGenerator.d.ts +61 -0
  100. package/dist/queryGenerator.d.ts.map +1 -0
  101. package/dist/queryGenerator.js +187 -0
  102. package/dist/queryGenerator.js.map +1 -0
  103. package/dist/tests/sqlOnFhir.test.d.ts +11 -0
  104. package/dist/tests/sqlOnFhir.test.d.ts.map +1 -0
  105. package/dist/tests/sqlOnFhir.test.js +24 -0
  106. package/dist/tests/sqlOnFhir.test.js.map +1 -0
  107. package/dist/tests/utils/database.d.ts +38 -0
  108. package/dist/tests/utils/database.d.ts.map +1 -0
  109. package/dist/tests/utils/database.js +258 -0
  110. package/dist/tests/utils/database.js.map +1 -0
  111. package/dist/tests/utils/generator.d.ts +58 -0
  112. package/dist/tests/utils/generator.d.ts.map +1 -0
  113. package/dist/tests/utils/generator.js +195 -0
  114. package/dist/tests/utils/generator.js.map +1 -0
  115. package/dist/tests/utils/reporter.d.ts +83 -0
  116. package/dist/tests/utils/reporter.d.ts.map +1 -0
  117. package/dist/tests/utils/reporter.js +245 -0
  118. package/dist/tests/utils/reporter.js.map +1 -0
  119. package/dist/tests/utils/sqlOnFhir.d.ts +33 -0
  120. package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -0
  121. package/dist/tests/utils/sqlOnFhir.js +281 -0
  122. package/dist/tests/utils/sqlOnFhir.js.map +1 -0
  123. package/dist/tests/utils/testContext.d.ts +18 -0
  124. package/dist/tests/utils/testContext.d.ts.map +1 -0
  125. package/dist/tests/utils/testContext.js +25 -0
  126. package/dist/tests/utils/testContext.js.map +1 -0
  127. package/dist/tests/utils/types.d.ts +31 -0
  128. package/dist/tests/utils/types.d.ts.map +1 -0
  129. package/dist/tests/utils/types.js +9 -0
  130. package/dist/tests/utils/types.js.map +1 -0
  131. package/dist/types.d.ts +288 -0
  132. package/dist/types.d.ts.map +1 -0
  133. package/dist/types.js +6 -0
  134. package/dist/types.js.map +1 -0
  135. 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