rdf-test-suite 2.4.0 → 2.6.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/README.md +13 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/TestSuiteRunner.d.ts +9 -0
- package/lib/TestSuiteRunner.js +29 -2
- package/lib/TestSuiteRunner.js.map +1 -1
- package/lib/context-manifest.json +2 -0
- package/lib/testcase/TestCaseHandlers.js +2 -1
- package/lib/testcase/TestCaseHandlers.js.map +1 -1
- package/lib/testcase/sparql/IQueryEngine.d.ts +8 -0
- package/lib/testcase/sparql/IQueryEngine.js.map +1 -1
- package/lib/testcase/sparql/TestCaseQueryEvaluation.d.ts +20 -0
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js +48 -2
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js.map +1 -1
- package/lib/testcase/sparql/TestCaseServiceDescription.d.ts +30 -0
- package/lib/testcase/sparql/TestCaseServiceDescription.js +137 -0
- package/lib/testcase/sparql/TestCaseServiceDescription.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -241,6 +241,18 @@ $ rdf-test-suite myengine.js http://w3c.github.io/rdf-tests/sparql/sparql11/mani
|
|
|
241
241
|
-i '{ "myProperty": "myValue" }'
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
+
For the SPARQL 1.1 Service Description tests, the runner will call the optional
|
|
245
|
+
`startServiceDescriptionEndpoint` method on an `IQueryEngine`, use the returned
|
|
246
|
+
endpoint URL, and invoke its `close` method after the manifest completes. An explicitly
|
|
247
|
+
configured `serviceDescriptionEndpoint` takes precedence,
|
|
248
|
+
which allows testing an endpoint that is already running:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
$ rdf-test-suite myengine.js http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl \
|
|
252
|
+
-s http://www.w3.org/TR/sparql11-service-description/ \
|
|
253
|
+
-i '{ "serviceDescriptionEndpoint": "http://localhost:3000/sparql" }'
|
|
254
|
+
```
|
|
255
|
+
|
|
244
256
|
### Test timeouts
|
|
245
257
|
|
|
246
258
|
By default, all tests are allowed to run 3000 ms.
|
|
@@ -301,7 +313,7 @@ $ rdf-test-suite myengine.js https://w3c.github.io/rdf-tests/sparql/sparql11/man
|
|
|
301
313
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results JSON](http://www.w3.org/TR/sparql11-results-json/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
302
314
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Federated Query](http://www.w3.org/TR/sparql11-federated-query/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
303
315
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Entailment](http://www.w3.org/TR/sparql11-entailment/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
304
|
-
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Service Description](http://www.w3.org/TR/sparql11-service-description/) |
|
|
316
|
+
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Service Description](http://www.w3.org/TR/sparql11-service-description/) | ✔ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
305
317
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Protocol](http://www.w3.org/TR/sparql11-protocol/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
306
318
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 HTTP RDF Update](http://www.w3.org/TR/sparql11-http-rdf-update/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
307
319
|
| [RDF/XML Syntax Tests](https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-xml/) | [RDF 1.1 XML Syntax](https://www.w3.org/TR/rdf-syntax-grammar/) | [`IParser`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/rdfsyntax/IParser.ts) | https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-xml/manifest.ttl |
|
package/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './lib/testcase/sparql/TestCaseCsvResultFormat';
|
|
|
18
18
|
export * from './lib/testcase/sparql/TestCaseNegativeSyntax';
|
|
19
19
|
export * from './lib/testcase/sparql/TestCasePositiveSyntax';
|
|
20
20
|
export * from './lib/testcase/sparql/TestCaseQueryEvaluation';
|
|
21
|
+
export * from './lib/testcase/sparql/TestCaseServiceDescription';
|
|
21
22
|
export * from './lib/testcase/sparql/TestCaseUpdateEvaluation';
|
|
22
23
|
export * from './lib/testcase/ITestCase';
|
|
23
24
|
export * from './lib/testcase/ITestCaseHandler';
|
package/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __exportStar(require("./lib/testcase/sparql/TestCaseCsvResultFormat"), exports);
|
|
|
34
34
|
__exportStar(require("./lib/testcase/sparql/TestCaseNegativeSyntax"), exports);
|
|
35
35
|
__exportStar(require("./lib/testcase/sparql/TestCasePositiveSyntax"), exports);
|
|
36
36
|
__exportStar(require("./lib/testcase/sparql/TestCaseQueryEvaluation"), exports);
|
|
37
|
+
__exportStar(require("./lib/testcase/sparql/TestCaseServiceDescription"), exports);
|
|
37
38
|
__exportStar(require("./lib/testcase/sparql/TestCaseUpdateEvaluation"), exports);
|
|
38
39
|
__exportStar(require("./lib/testcase/ITestCase"), exports);
|
|
39
40
|
__exportStar(require("./lib/testcase/ITestCaseHandler"), exports);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseCsvResultFormat';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,mFAAiE;AACjE,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseCsvResultFormat';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseServiceDescription';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
package/lib/TestSuiteRunner.d.ts
CHANGED
|
@@ -36,6 +36,15 @@ export declare class TestSuiteRunner {
|
|
|
36
36
|
* @return {Promise<ITestResult[]>} A promise resolving to an array of test results.
|
|
37
37
|
*/
|
|
38
38
|
runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Run a manifest, starting an endpoint if the selected specification requires one.
|
|
41
|
+
* @param {string} manifest A manifest.
|
|
42
|
+
* @param handler The handler to run the tests with.
|
|
43
|
+
* @param config The test suite configuration.
|
|
44
|
+
* @param {ITestResult[]} results An array to append the test results to.
|
|
45
|
+
* @return {Promise<void>} A promise resolving when the tests are finished.
|
|
46
|
+
*/
|
|
47
|
+
private runManifestWithEndpoint;
|
|
39
48
|
/**
|
|
40
49
|
* Run the given manifest.
|
|
41
50
|
* @param {string} manifest A manifest.
|
package/lib/TestSuiteRunner.js
CHANGED
|
@@ -52,6 +52,7 @@ const quad = require('rdf-quad');
|
|
|
52
52
|
// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires
|
|
53
53
|
const streamifyArray = require('streamify-array').streamifyArray;
|
|
54
54
|
const DF = new rdf_data_factory_1.DataFactory();
|
|
55
|
+
const SERVICE_DESCRIPTION_SPECIFICATION = 'http://www.w3.org/TR/sparql11-service-description/';
|
|
55
56
|
/**
|
|
56
57
|
* TestSuiteRunner runs a certain test suite manifest.
|
|
57
58
|
*/
|
|
@@ -87,13 +88,39 @@ class TestSuiteRunner {
|
|
|
87
88
|
if (!manifest.specifications || !manifest.specifications[specification]) {
|
|
88
89
|
return [];
|
|
89
90
|
}
|
|
90
|
-
yield this.
|
|
91
|
+
yield this.runManifestWithEndpoint(manifest.specifications[specification], handler, config, results);
|
|
91
92
|
return results;
|
|
92
93
|
}
|
|
93
|
-
yield this.
|
|
94
|
+
yield this.runManifestWithEndpoint(manifest, handler, config, results);
|
|
94
95
|
return results;
|
|
95
96
|
});
|
|
96
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Run a manifest, starting an endpoint if the selected specification requires one.
|
|
100
|
+
* @param {string} manifest A manifest.
|
|
101
|
+
* @param handler The handler to run the tests with.
|
|
102
|
+
* @param config The test suite configuration.
|
|
103
|
+
* @param {ITestResult[]} results An array to append the test results to.
|
|
104
|
+
* @return {Promise<void>} A promise resolving when the tests are finished.
|
|
105
|
+
*/
|
|
106
|
+
runManifestWithEndpoint(manifest, handler, config, results) {
|
|
107
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const engine = handler;
|
|
109
|
+
const customEngineOptions = config.customEngingeOptions;
|
|
110
|
+
if (config.specification === SERVICE_DESCRIPTION_SPECIFICATION &&
|
|
111
|
+
!customEngineOptions.serviceDescriptionEndpoint && engine.startServiceDescriptionEndpoint) {
|
|
112
|
+
const serviceDescription = yield engine.startServiceDescriptionEndpoint();
|
|
113
|
+
try {
|
|
114
|
+
yield this.runManifestConcrete(manifest, handler, Object.assign(Object.assign({}, config), { customEngingeOptions: Object.assign(Object.assign({}, customEngineOptions), { serviceDescriptionEndpoint: serviceDescription.endpoint }) }), results);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
yield serviceDescription.close();
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
yield this.runManifestConcrete(manifest, handler, config, results);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
97
124
|
/**
|
|
98
125
|
* Run the given manifest.
|
|
99
126
|
* @param {string} manifest A manifest.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["TestSuiteRunner.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport * as LogSymbols from 'log-symbols';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { IManifest } from './IManifest';\nimport { ManifestLoader } from './ManifestLoader';\nimport type { ITestCase } from './testcase/ITestCase';\nimport { Util } from './Util';\nimport WriteStream = NodeJS.WriteStream;\nimport Timeout = NodeJS.Timeout;\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst quad = require('rdf-quad');\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst streamifyArray = require('streamify-array').streamifyArray;\n\nconst DF = new DataFactory();\n\nexport interface ITestSuiteConfig {\n exitWithStatusCode0: boolean;\n explicitApproval?: boolean;\n runRejected?: boolean;\n outputFormat: string;\n timeOutDuration: number;\n customEngingeOptions: object;\n specification?: string;\n cachePath?: string;\n testRegex?: RegExp;\n skipRegex?: RegExp;\n urlToFileMapping?: string;\n}\n\n/**\n * TestSuiteRunner runs a certain test suite manifest.\n */\nexport class TestSuiteRunner {\n /**\n * Parse an URL to file mapping string.\n * @param {string} urlToFileMapping An URL to file mapping string\n * @return {{url: string; path: string}[]} A parsed URL to file mapping array.\n */\n public fromUrlToMappingString(urlToFileMapping?: string): { url: string; path: string }[] {\n const urlToFileMappings: { url: string; path: string }[] = [];\n if (urlToFileMapping) {\n const [ url, path ]: string[] = urlToFileMapping.split('~');\n urlToFileMappings.push({ url, path });\n }\n return urlToFileMappings;\n }\n\n /**\n * Run the manifest with the given URL.\n * @param {string} manifestUrl The URL of a manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\n * @return {Promise<ITestResult[]>} A promise resolving to an array of test results.\n */\n public async runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]> {\n const { cachePath, specification, urlToFileMapping } = config;\n const urlToFileMappings = this.fromUrlToMappingString(urlToFileMapping);\n const manifest: IManifest = await new ManifestLoader().from(manifestUrl, { cachePath, urlToFileMappings });\n const results: ITestResult[] = [];\n\n // Only run the tests for the given specification if one was defined.\n if (specification) {\n if (!manifest.specifications || !manifest.specifications[specification]) {\n return [];\n }\n await this.runManifestConcrete(manifest.specifications[specification], handler, config, results);\n return results;\n }\n\n await this.runManifestConcrete(manifest, handler, config, results);\n return results;\n }\n\n /**\n * Run the given manifest.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\n * @param {ITestResult[]} results An array to append the test results to\n * @return {Promise<void>} A promise resolving when the tests are finished.\n */\n public async runManifestConcrete(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ) {\n // Execute all tests in this manifest\n if (manifest.testEntries) {\n for (const test of manifest.testEntries) {\n if ((!config.testRegex || config.testRegex.test(test.uri)) && !(config.skipRegex && config.skipRegex.test(test.uri))) {\n if (!config.runRejected && test.approval === 'http://www.w3.org/ns/rdftest#Rejected') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Rejected Test') });\n } else if (config.explicitApproval && test.approval !== 'http://www.w3.org/ns/rdftest#Approved') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Test not explicitly approved') });\n } else {\n let timeout: Timeout = null;\n const timeStart = process.hrtime();\n let testResultOverride: ITestResultOverride | undefined;\n try {\n await Promise.race([\n test.test(handler, config.customEngingeOptions)\n .then((result) => {\n if (result) {\n testResultOverride = result;\n }\n }),\n new Promise((res, rej) => {\n // Global.setTimeout is used here to avoid browser/node compatibility issues\n timeout = globalThis.setTimeout(\n () => rej(new Error(`Test case '${test.uri}' timed out`)),\n config.timeOutDuration,\n );\n }),\n ]);\n } catch (error) {\n clearTimeout(timeout);\n results.push({ test, ok: false, error: <any> error, skipped: (<any> error).skipped });\n continue;\n }\n const timeEnd = process.hrtime(timeStart);\n clearTimeout(timeout);\n results.push({ test, ok: true, duration: (timeEnd[0] * 1000) + (timeEnd[1] / 1000000), ...testResultOverride });\n }\n }\n }\n }\n\n // Recursively handle all sub-manifests\n if (manifest.subManifests) {\n for (const subManifest of manifest.subManifests) {\n await (this.runManifestConcrete(subManifest, handler, config, results));\n }\n }\n }\n\n /**\n * Print the given test results to a text stream.\n * @param {WriteStream} stdout The output stream to write to.\n * @param {ITestResult[]} results An array of test results.\n * @param {boolean} compact If the results should be printed in compact-mode.\n */\n public resultsToText(stdout: WriteStream, results: ITestResult[], compact: boolean) {\n const failedTests: ITestResult[] = [];\n let success = 0;\n let skipped = 0;\n for (const result of results) {\n if (result.ok) {\n success++;\n stdout.write(`${LogSymbols.success} ${result.test.name} (${result.test.uri})${` ${Util.withColor(`${result.duration}ms`, Util.colorGray)}`}\\n`);\n } else if (result.skipped) {\n skipped++;\n stdout.write(`${LogSymbols.info} ${result.test.name} (${result.test.uri})\\n`);\n } else {\n failedTests.push(result);\n stdout.write(`${LogSymbols.error} ${result.test.name} (${result.test.uri})\\n`);\n }\n }\n\n if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.colorRed)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.colorBlue)}\n\n`);\n }\n }\n\n const skippedString = skipped ? ` (skipped ${skipped})` : '';\n success += skipped;\n if (success === results.length) {\n stdout.write(`${LogSymbols.success} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n } else {\n stdout.write(`${LogSymbols.error} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n }\n }\n\n /**\n * Convert test results to an RDF stream.\n * @param {ITestResult[]} results Test results.\n * @param {IEarlProperties} properties EARL properties.\n * @param {Date} testDate The date at which the tests were executed.\n * @return {Stream} An RDF stream of quads.\n */\n public resultsToEarl(results: ITestResult[], properties: IEarlProperties, testDate: Date): RDF.Stream {\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n const p = require('./prefixes.json');\n const dateRaw = testDate.toISOString();\n const date = `\"${dateRaw}\"^^${p.xsd}dateTime`;\n const quads: RDF.Quad[] = [];\n\n // Describe report\n const report = properties.reportUri || '';\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.foaf}primaryTopic`), DF.namedNode(properties.applicationUri)));\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.dc}issued`), DF.literal(testDate.toISOString(), DF.namedNode(`${p.xsd}dateTime`))));\n for (const author of properties.authors) {\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.foaf}maker`), DF.namedNode(author.uri)));\n }\n\n // Describe application\n const app = properties.applicationUri;\n quads.push(quad(app, `${p.rdf}type`, `${p.earl}Software`));\n quads.push(quad(app, `${p.rdf}type`, `${p.earl}TestSubject`));\n quads.push(quad(app, `${p.rdf}type`, `${p.doap}Project`));\n quads.push(quad(app, `${p.doap}name`, `\"${properties.applicationNameFull}\"`));\n quads.push(quad(app, `${p.dc}title`, `\"${properties.applicationNameFull}\"`));\n if (properties.version) {\n quads.push(quad(app, `${p.doap}release`, '_:b_release'));\n quads.push(quad('_:b_release', `${p.doap}revision`, `\"${properties.version}\"`));\n }\n quads.push(quad(app, `${p.doap}homepage`, properties.applicationHomepageUrl));\n quads.push(quad(app, `${p.doap}license`, properties.licenseUri));\n quads.push(quad(app, `${p.doap}programming-language`, '\"JavaScript\"'));\n for (const spec of properties.specificationUris) {\n quads.push(quad(app, `${p.doap}implements`, spec));\n }\n quads.push(quad(app, `${p.doap}category`, 'http://dbpedia.org/resource/Resource_Description_Framework'));\n quads.push(quad(app, `${p.doap}download-page`, `https://npmjs.org/package/${properties.applicationNameNpm}`));\n if (properties.applicationBugsUrl) {\n quads.push(quad(app, `${p.doap}bug-database`, properties.applicationBugsUrl));\n }\n if (properties.applicationBlogUrl) {\n quads.push(quad(app, `${p.doap}blog`, properties.applicationBlogUrl));\n }\n for (const author of properties.authors) {\n quads.push(quad(app, `${p.doap}developer`, author.uri));\n quads.push(quad(app, `${p.doap}maintainer`, author.uri));\n quads.push(quad(app, `${p.doap}documenter`, author.uri));\n quads.push(quad(app, `${p.doap}maker`, author.uri));\n quads.push(quad(app, `${p.dc}creator`, author.uri));\n }\n quads.push(quad(app, `${p.dc}description`, `\"${properties.applicationDescription}\"@en`));\n quads.push(quad(app, `${p.doap}description`, `\"${properties.applicationDescription}\"@en`));\n\n // Describe authors\n for (const author of properties.authors) {\n quads.push(quad(author.uri, `${p.rdf}type`, `${p.foaf}Person`));\n quads.push(quad(author.uri, `${p.rdf}type`, `${p.earl}Assertor`));\n if (author.name) {\n quads.push(quad(author.uri, `${p.foaf}name`, `\"${author.name}\"`));\n }\n if (author.homepage) {\n quads.push(quad(author.uri, `${p.foaf}homepage`, author.homepage));\n }\n if (author.primaryTopic) {\n quads.push(quad(author.uri, `${p.foaf}primaryTopicOf`, author.primaryTopic));\n }\n }\n\n // Describe test results\n let id = 0;\n for (const result of results) {\n const testUri = result.test.uri;\n quads.push(quad(testUri, `${p.rdf}type`, `${p.earl}TestCriterion`));\n quads.push(quad(testUri, `${p.rdf}type`, `${p.earl}TestCase`));\n quads.push(quad(testUri, `${p.dc}title`, `\"${result.test.name}\"`));\n if (result.test.comment) {\n quads.push(quad(testUri, `${p.dc}description`, `\"${result.test.comment}\"`));\n }\n quads.push(quad(testUri, `${p.earl}assertions`, `_:assertions${id}`));\n quads.push(quad(`_:assertions${id}`, `${p.rdf}first`, `_:assertion${id}`));\n quads.push(quad(`_:assertions${id}`, `${p.rdf}rest`, `${p.rdf}nil`));\n quads.push(quad(`_:assertion${id}`, `${p.rdf}type`, `${p.earl}Assertion`));\n for (const author of properties.authors) {\n quads.push(quad(`_:assertion${id}`, `${p.earl}assertedBy`, author.uri));\n }\n quads.push(quad(`_:assertion${id}`, `${p.earl}test`, testUri));\n quads.push(quad(`_:assertion${id}`, `${p.earl}subject`, app));\n quads.push(quad(`_:assertion${id}`, `${p.earl}mode`, `${p.earl}automatic`));\n quads.push(quad(`_:assertion${id}`, `${p.earl}result`, `_:result${id}`));\n quads.push(quad(`_:result${id}`, `${p.rdf}type`, `${p.earl}TestResult`));\n quads.push(quad(`_:result${id}`, `${p.earl}outcome`, p.earl + (result.ok ? 'passed' : (result.skipped ? 'inapplicable' : 'failed'))));\n quads.push(quad(`_:result${id}`, `${p.dc}date`, date));\n id++;\n }\n\n return streamifyArray(quads);\n }\n\n /**\n * Create an {#link IEarlProperties} data object based on package.json contents.\n * @param packageJson Package.json contents.\n * @return {IEarlProperties} A data object.\n */\n public packageJsonToEarlProperties(packageJson: any): IEarlProperties {\n return {\n applicationBugsUrl: packageJson.bugs && packageJson.bugs.url ? packageJson.bugs.url : packageJson.bugs,\n applicationDescription: packageJson.description,\n applicationHomepageUrl: packageJson.homepage,\n applicationNameFull: packageJson.name,\n applicationNameNpm: packageJson.name,\n applicationUri: packageJson.name ? `https://www.npmjs.com/package/${packageJson.name}/` : null,\n authors: [\n {\n homepage: null,\n name: packageJson.author,\n uri: `https://www.npmjs.com/package/${packageJson.name}/#author`,\n },\n ],\n licenseUri: packageJson.license ? Util.licenseToUri(packageJson.license) : null,\n reportUri: null,\n specificationUris: [],\n version: packageJson.version,\n };\n }\n}\n\nexport interface IEarlProperties {\n reportUri: string;\n authors: IAuthor[];\n licenseUri: string;\n applicationUri: string;\n applicationHomepageUrl: string;\n applicationBugsUrl?: string;\n applicationBlogUrl?: string;\n applicationNameFull: string;\n applicationNameNpm: string;\n applicationDescription: string;\n specificationUris: string[];\n version?: string;\n}\n\nexport interface IAuthor {\n uri: string;\n name?: string;\n homepage?: string;\n primaryTopic?: string;\n}\n\nexport interface ITestResult extends ITestResultOverride {\n test: ITestCase<any>;\n ok: boolean;\n error?: Error;\n skipped?: boolean;\n}\n\nexport interface ITestResultOverride {\n duration?: number; // In ms\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["TestSuiteRunner.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport * as LogSymbols from 'log-symbols';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { IManifest } from './IManifest';\nimport { ManifestLoader } from './ManifestLoader';\nimport type { ITestCase } from './testcase/ITestCase';\nimport type { IQueryEngine } from './testcase/sparql/IQueryEngine';\nimport { Util } from './Util';\nimport WriteStream = NodeJS.WriteStream;\nimport Timeout = NodeJS.Timeout;\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst quad = require('rdf-quad');\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst streamifyArray = require('streamify-array').streamifyArray;\n\nconst DF = new DataFactory();\nconst SERVICE_DESCRIPTION_SPECIFICATION = 'http://www.w3.org/TR/sparql11-service-description/';\n\nexport interface ITestSuiteConfig {\n exitWithStatusCode0: boolean;\n explicitApproval?: boolean;\n runRejected?: boolean;\n outputFormat: string;\n timeOutDuration: number;\n customEngingeOptions: object;\n specification?: string;\n cachePath?: string;\n testRegex?: RegExp;\n skipRegex?: RegExp;\n urlToFileMapping?: string;\n}\n\n/**\n * TestSuiteRunner runs a certain test suite manifest.\n */\nexport class TestSuiteRunner {\n /**\n * Parse an URL to file mapping string.\n * @param {string} urlToFileMapping An URL to file mapping string\n * @return {{url: string; path: string}[]} A parsed URL to file mapping array.\n */\n public fromUrlToMappingString(urlToFileMapping?: string): { url: string; path: string }[] {\n const urlToFileMappings: { url: string; path: string }[] = [];\n if (urlToFileMapping) {\n const [ url, path ]: string[] = urlToFileMapping.split('~');\n urlToFileMappings.push({ url, path });\n }\n return urlToFileMappings;\n }\n\n /**\n * Run the manifest with the given URL.\n * @param {string} manifestUrl The URL of a manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\n * @return {Promise<ITestResult[]>} A promise resolving to an array of test results.\n */\n public async runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]> {\n const { cachePath, specification, urlToFileMapping } = config;\n const urlToFileMappings = this.fromUrlToMappingString(urlToFileMapping);\n const manifest: IManifest = await new ManifestLoader().from(manifestUrl, { cachePath, urlToFileMappings });\n const results: ITestResult[] = [];\n\n // Only run the tests for the given specification if one was defined.\n if (specification) {\n if (!manifest.specifications || !manifest.specifications[specification]) {\n return [];\n }\n await this.runManifestWithEndpoint(manifest.specifications[specification], handler, config, results);\n return results;\n }\n\n await this.runManifestWithEndpoint(manifest, handler, config, results);\n return results;\n }\n\n /**\n * Run a manifest, starting an endpoint if the selected specification requires one.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\n * @param {ITestResult[]} results An array to append the test results to.\n * @return {Promise<void>} A promise resolving when the tests are finished.\n */\n private async runManifestWithEndpoint(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ): Promise<void> {\n const engine = <IQueryEngine> handler;\n const customEngineOptions = <Record<string, unknown>> config.customEngingeOptions;\n if (config.specification === SERVICE_DESCRIPTION_SPECIFICATION &&\n !customEngineOptions.serviceDescriptionEndpoint && engine.startServiceDescriptionEndpoint) {\n const serviceDescription = await engine.startServiceDescriptionEndpoint();\n try {\n await this.runManifestConcrete(manifest, handler, {\n ...config,\n customEngingeOptions: {\n ...customEngineOptions,\n serviceDescriptionEndpoint: serviceDescription.endpoint,\n },\n }, results);\n } finally {\n await serviceDescription.close();\n }\n return;\n }\n\n await this.runManifestConcrete(manifest, handler, config, results);\n }\n\n /**\n * Run the given manifest.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\n * @param {ITestResult[]} results An array to append the test results to\n * @return {Promise<void>} A promise resolving when the tests are finished.\n */\n public async runManifestConcrete(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ) {\n // Execute all tests in this manifest\n if (manifest.testEntries) {\n for (const test of manifest.testEntries) {\n if ((!config.testRegex || config.testRegex.test(test.uri)) && !(config.skipRegex && config.skipRegex.test(test.uri))) {\n if (!config.runRejected && test.approval === 'http://www.w3.org/ns/rdftest#Rejected') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Rejected Test') });\n } else if (config.explicitApproval && test.approval !== 'http://www.w3.org/ns/rdftest#Approved') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Test not explicitly approved') });\n } else {\n let timeout: Timeout = null;\n const timeStart = process.hrtime();\n let testResultOverride: ITestResultOverride | undefined;\n try {\n await Promise.race([\n test.test(handler, config.customEngingeOptions)\n .then((result) => {\n if (result) {\n testResultOverride = result;\n }\n }),\n new Promise((res, rej) => {\n // Global.setTimeout is used here to avoid browser/node compatibility issues\n timeout = globalThis.setTimeout(\n () => rej(new Error(`Test case '${test.uri}' timed out`)),\n config.timeOutDuration,\n );\n }),\n ]);\n } catch (error) {\n clearTimeout(timeout);\n results.push({ test, ok: false, error: <any> error, skipped: (<any> error).skipped });\n continue;\n }\n const timeEnd = process.hrtime(timeStart);\n clearTimeout(timeout);\n results.push({ test, ok: true, duration: (timeEnd[0] * 1000) + (timeEnd[1] / 1000000), ...testResultOverride });\n }\n }\n }\n }\n\n // Recursively handle all sub-manifests\n if (manifest.subManifests) {\n for (const subManifest of manifest.subManifests) {\n await (this.runManifestConcrete(subManifest, handler, config, results));\n }\n }\n }\n\n /**\n * Print the given test results to a text stream.\n * @param {WriteStream} stdout The output stream to write to.\n * @param {ITestResult[]} results An array of test results.\n * @param {boolean} compact If the results should be printed in compact-mode.\n */\n public resultsToText(stdout: WriteStream, results: ITestResult[], compact: boolean) {\n const failedTests: ITestResult[] = [];\n let success = 0;\n let skipped = 0;\n for (const result of results) {\n if (result.ok) {\n success++;\n stdout.write(`${LogSymbols.success} ${result.test.name} (${result.test.uri})${` ${Util.withColor(`${result.duration}ms`, Util.colorGray)}`}\\n`);\n } else if (result.skipped) {\n skipped++;\n stdout.write(`${LogSymbols.info} ${result.test.name} (${result.test.uri})\\n`);\n } else {\n failedTests.push(result);\n stdout.write(`${LogSymbols.error} ${result.test.name} (${result.test.uri})\\n`);\n }\n }\n\n if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.colorRed)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.colorBlue)}\n\n`);\n }\n }\n\n const skippedString = skipped ? ` (skipped ${skipped})` : '';\n success += skipped;\n if (success === results.length) {\n stdout.write(`${LogSymbols.success} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n } else {\n stdout.write(`${LogSymbols.error} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n }\n }\n\n /**\n * Convert test results to an RDF stream.\n * @param {ITestResult[]} results Test results.\n * @param {IEarlProperties} properties EARL properties.\n * @param {Date} testDate The date at which the tests were executed.\n * @return {Stream} An RDF stream of quads.\n */\n public resultsToEarl(results: ITestResult[], properties: IEarlProperties, testDate: Date): RDF.Stream {\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n const p = require('./prefixes.json');\n const dateRaw = testDate.toISOString();\n const date = `\"${dateRaw}\"^^${p.xsd}dateTime`;\n const quads: RDF.Quad[] = [];\n\n // Describe report\n const report = properties.reportUri || '';\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.foaf}primaryTopic`), DF.namedNode(properties.applicationUri)));\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.dc}issued`), DF.literal(testDate.toISOString(), DF.namedNode(`${p.xsd}dateTime`))));\n for (const author of properties.authors) {\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(`${p.foaf}maker`), DF.namedNode(author.uri)));\n }\n\n // Describe application\n const app = properties.applicationUri;\n quads.push(quad(app, `${p.rdf}type`, `${p.earl}Software`));\n quads.push(quad(app, `${p.rdf}type`, `${p.earl}TestSubject`));\n quads.push(quad(app, `${p.rdf}type`, `${p.doap}Project`));\n quads.push(quad(app, `${p.doap}name`, `\"${properties.applicationNameFull}\"`));\n quads.push(quad(app, `${p.dc}title`, `\"${properties.applicationNameFull}\"`));\n if (properties.version) {\n quads.push(quad(app, `${p.doap}release`, '_:b_release'));\n quads.push(quad('_:b_release', `${p.doap}revision`, `\"${properties.version}\"`));\n }\n quads.push(quad(app, `${p.doap}homepage`, properties.applicationHomepageUrl));\n quads.push(quad(app, `${p.doap}license`, properties.licenseUri));\n quads.push(quad(app, `${p.doap}programming-language`, '\"JavaScript\"'));\n for (const spec of properties.specificationUris) {\n quads.push(quad(app, `${p.doap}implements`, spec));\n }\n quads.push(quad(app, `${p.doap}category`, 'http://dbpedia.org/resource/Resource_Description_Framework'));\n quads.push(quad(app, `${p.doap}download-page`, `https://npmjs.org/package/${properties.applicationNameNpm}`));\n if (properties.applicationBugsUrl) {\n quads.push(quad(app, `${p.doap}bug-database`, properties.applicationBugsUrl));\n }\n if (properties.applicationBlogUrl) {\n quads.push(quad(app, `${p.doap}blog`, properties.applicationBlogUrl));\n }\n for (const author of properties.authors) {\n quads.push(quad(app, `${p.doap}developer`, author.uri));\n quads.push(quad(app, `${p.doap}maintainer`, author.uri));\n quads.push(quad(app, `${p.doap}documenter`, author.uri));\n quads.push(quad(app, `${p.doap}maker`, author.uri));\n quads.push(quad(app, `${p.dc}creator`, author.uri));\n }\n quads.push(quad(app, `${p.dc}description`, `\"${properties.applicationDescription}\"@en`));\n quads.push(quad(app, `${p.doap}description`, `\"${properties.applicationDescription}\"@en`));\n\n // Describe authors\n for (const author of properties.authors) {\n quads.push(quad(author.uri, `${p.rdf}type`, `${p.foaf}Person`));\n quads.push(quad(author.uri, `${p.rdf}type`, `${p.earl}Assertor`));\n if (author.name) {\n quads.push(quad(author.uri, `${p.foaf}name`, `\"${author.name}\"`));\n }\n if (author.homepage) {\n quads.push(quad(author.uri, `${p.foaf}homepage`, author.homepage));\n }\n if (author.primaryTopic) {\n quads.push(quad(author.uri, `${p.foaf}primaryTopicOf`, author.primaryTopic));\n }\n }\n\n // Describe test results\n let id = 0;\n for (const result of results) {\n const testUri = result.test.uri;\n quads.push(quad(testUri, `${p.rdf}type`, `${p.earl}TestCriterion`));\n quads.push(quad(testUri, `${p.rdf}type`, `${p.earl}TestCase`));\n quads.push(quad(testUri, `${p.dc}title`, `\"${result.test.name}\"`));\n if (result.test.comment) {\n quads.push(quad(testUri, `${p.dc}description`, `\"${result.test.comment}\"`));\n }\n quads.push(quad(testUri, `${p.earl}assertions`, `_:assertions${id}`));\n quads.push(quad(`_:assertions${id}`, `${p.rdf}first`, `_:assertion${id}`));\n quads.push(quad(`_:assertions${id}`, `${p.rdf}rest`, `${p.rdf}nil`));\n quads.push(quad(`_:assertion${id}`, `${p.rdf}type`, `${p.earl}Assertion`));\n for (const author of properties.authors) {\n quads.push(quad(`_:assertion${id}`, `${p.earl}assertedBy`, author.uri));\n }\n quads.push(quad(`_:assertion${id}`, `${p.earl}test`, testUri));\n quads.push(quad(`_:assertion${id}`, `${p.earl}subject`, app));\n quads.push(quad(`_:assertion${id}`, `${p.earl}mode`, `${p.earl}automatic`));\n quads.push(quad(`_:assertion${id}`, `${p.earl}result`, `_:result${id}`));\n quads.push(quad(`_:result${id}`, `${p.rdf}type`, `${p.earl}TestResult`));\n quads.push(quad(`_:result${id}`, `${p.earl}outcome`, p.earl + (result.ok ? 'passed' : (result.skipped ? 'inapplicable' : 'failed'))));\n quads.push(quad(`_:result${id}`, `${p.dc}date`, date));\n id++;\n }\n\n return streamifyArray(quads);\n }\n\n /**\n * Create an {#link IEarlProperties} data object based on package.json contents.\n * @param packageJson Package.json contents.\n * @return {IEarlProperties} A data object.\n */\n public packageJsonToEarlProperties(packageJson: any): IEarlProperties {\n return {\n applicationBugsUrl: packageJson.bugs && packageJson.bugs.url ? packageJson.bugs.url : packageJson.bugs,\n applicationDescription: packageJson.description,\n applicationHomepageUrl: packageJson.homepage,\n applicationNameFull: packageJson.name,\n applicationNameNpm: packageJson.name,\n applicationUri: packageJson.name ? `https://www.npmjs.com/package/${packageJson.name}/` : null,\n authors: [\n {\n homepage: null,\n name: packageJson.author,\n uri: `https://www.npmjs.com/package/${packageJson.name}/#author`,\n },\n ],\n licenseUri: packageJson.license ? Util.licenseToUri(packageJson.license) : null,\n reportUri: null,\n specificationUris: [],\n version: packageJson.version,\n };\n }\n}\n\nexport interface IEarlProperties {\n reportUri: string;\n authors: IAuthor[];\n licenseUri: string;\n applicationUri: string;\n applicationHomepageUrl: string;\n applicationBugsUrl?: string;\n applicationBlogUrl?: string;\n applicationNameFull: string;\n applicationNameNpm: string;\n applicationDescription: string;\n specificationUris: string[];\n version?: string;\n}\n\nexport interface IAuthor {\n uri: string;\n name?: string;\n homepage?: string;\n primaryTopic?: string;\n}\n\nexport interface ITestResult extends ITestResultOverride {\n test: ITestCase<any>;\n ok: boolean;\n error?: Error;\n skipped?: boolean;\n}\n\nexport interface ITestResultOverride {\n duration?: number; // In ms\n}\n"]}
|
|
@@ -11,6 +11,7 @@ const TestCaseCsvResultFormat_1 = require("./sparql/TestCaseCsvResultFormat");
|
|
|
11
11
|
const TestCaseNegativeSyntax_1 = require("./sparql/TestCaseNegativeSyntax");
|
|
12
12
|
const TestCasePositiveSyntax_1 = require("./sparql/TestCasePositiveSyntax");
|
|
13
13
|
const TestCaseQueryEvaluation_1 = require("./sparql/TestCaseQueryEvaluation");
|
|
14
|
+
const TestCaseServiceDescription_1 = require("./sparql/TestCaseServiceDescription");
|
|
14
15
|
const TestCaseUpdateEvaluation_1 = require("./sparql/TestCaseUpdateEvaluation");
|
|
15
16
|
const TestCaseUnsupported_1 = require("./TestCaseUnsupported");
|
|
16
17
|
module.exports = {
|
|
@@ -27,7 +28,7 @@ module.exports = {
|
|
|
27
28
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11': new TestCasePositiveSyntax_1.TestCasePositiveSyntaxHandler(),
|
|
28
29
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest': new TestCaseUpdateEvaluation_1.TestCaseUpdateEvaluationHandler(),
|
|
29
30
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest': new TestCaseCsvResultFormat_1.TestCaseCsvResultFormatHandler(),
|
|
30
|
-
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest': new
|
|
31
|
+
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest': new TestCaseServiceDescription_1.TestCaseServiceDescriptionHandler(),
|
|
31
32
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement
|
|
32
33
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement
|
|
33
34
|
// RDF/XML test suite
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":";;AAAA,oFAAwF;AACxF,oGAAwG;AACxG,kFAAsF;AACtF,gFAAoF;AACpF,gGAAoG;AACpG,2DAA+D;AAC/D,+DAAmE;AACnE,8EAAkF;AAClF,4EAAgF;AAChF,4EAAgF;AAChF,8EAAkF;AAClF,gFAAoF;AACpF,+DAAmE;AAEnE,MAAM,CAAC,OAAO,GAAG;IACf,oCAAoC;IACpC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,8EAA8E,EAC5E,IAAI,wDAA8B,EAAE;IAEtC,wBAAwB;IACxB,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,0DAA+B,EAAE;IACvC,8EAA8E,EAC5E,IAAI,wDAA8B,EAAE;IACtC,iFAAiF,EAC/E,IAAI,
|
|
1
|
+
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { TestCaseJsonLdFromRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nimport { TestCaseJsonLdFromRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdfNegative';\nimport { TestCaseJsonLdSyntaxHandler } from './rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nimport { TestCaseJsonLdToRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nimport { TestCaseJsonLdToRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nimport { TestCaseEvalHandler } from './rdfsyntax/TestCaseEval';\nimport { TestCaseSyntaxHandler } from './rdfsyntax/TestCaseSyntax';\nimport { TestCaseCsvResultFormatHandler } from './sparql/TestCaseCsvResultFormat';\nimport { TestCaseNegativeSyntaxHandler } from './sparql/TestCaseNegativeSyntax';\nimport { TestCasePositiveSyntaxHandler } from './sparql/TestCasePositiveSyntax';\nimport { TestCaseQueryEvaluationHandler } from './sparql/TestCaseQueryEvaluation';\nimport { TestCaseServiceDescriptionHandler } from './sparql/TestCaseServiceDescription';\nimport { TestCaseUpdateEvaluationHandler } from './sparql/TestCaseUpdateEvaluation';\nimport { TestCaseUnsupportedHandler } from './TestCaseUnsupported';\n\nmodule.exports = {\n // SPARQL 1.0, SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest':\n new TestCaseQueryEvaluationHandler(),\n\n // SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest':\n new TestCaseUpdateEvaluationHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest':\n new TestCaseCsvResultFormatHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest':\n new TestCaseServiceDescriptionHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest':\n new TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest':\n new TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement\n\n // RDF/XML test suite\n 'http://www.w3.org/ns/rdftest#TestXMLEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestXMLNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Triples test suite\n 'http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNTriplesNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Quads test suite\n 'http://www.w3.org/ns/rdftest#TestNQuadsPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNQuadsNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // Turtle test suite\n 'http://www.w3.org/ns/rdftest#TestTurtleEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // TriG test suite\n 'http://www.w3.org/ns/rdftest#TestTrigEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTrigPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // JSON-LD test suite\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdToRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveSyntaxTest':\n new TestCaseJsonLdSyntaxHandler(true),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdToRdfNegativeHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdFromRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdFromRdfNegativeHandler(),\n\n // RDFa test suite\n 'http://rdfa.info/vocabs/rdfa-test#PositiveEvaluationTest':\n new TestCaseEvalHandler(),\n 'http://rdfa.info/vocabs/rdfa-test#NegativeEvaluationTest':\n new TestCaseSyntaxHandler(true), // RDFa test suite never expect errors, just empty documents\n\n // Microdata-RDF test suite\n 'http://www.w3.org/ns/rdftest#TestMicrodataEval':\n new TestCaseEvalHandler({ normalizeUrl: true }),\n 'http://www.w3.org/ns/rdftest#TestMicrodataNegativeSyntax':\n new TestCaseSyntaxHandler(true), // Microdata-RDF test suite never expect errors, just empty documents\n\n // N3 test suite\n 'https://w3c.github.io/N3/tests/test.n3#TestN3PositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3NegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3Eval':\n new TestCaseEvalHandler(),\n\n};\n"]}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type * as RDF from '@rdfjs/types';
|
|
2
|
+
/**
|
|
3
|
+
* A running endpoint for Service Description conformance tests.
|
|
4
|
+
*/
|
|
5
|
+
export interface IServiceDescriptionEndpoint {
|
|
6
|
+
endpoint: string;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}
|
|
2
9
|
/**
|
|
3
10
|
* A query engine handler.
|
|
4
11
|
*/
|
|
@@ -6,6 +13,7 @@ export interface IQueryEngine {
|
|
|
6
13
|
parse: (queryString: string, options: Record<string, any>) => Promise<void>;
|
|
7
14
|
query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;
|
|
8
15
|
queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;
|
|
16
|
+
startServiceDescriptionEndpoint?: () => Promise<IServiceDescriptionEndpoint>;
|
|
9
17
|
}
|
|
10
18
|
/**
|
|
11
19
|
* Super type for all query result types.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A running endpoint for Service Description conformance tests.\n */\nexport interface IServiceDescriptionEndpoint {\n endpoint: string;\n close: () => Promise<void>;\n}\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;\n startServiceDescriptionEndpoint?: () => Promise<IServiceDescriptionEndpoint>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
@@ -61,22 +61,39 @@ export declare class TestCaseQueryEvaluationHandler implements ITestCaseHandler<
|
|
|
61
61
|
* @param options Fetch options.
|
|
62
62
|
*/
|
|
63
63
|
static resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Obtain all service data links for the given query test action.
|
|
66
|
+
* @param action A query test action.
|
|
67
|
+
*/
|
|
68
|
+
static getServiceDataLinks(action: Resource): IServiceDataLink[];
|
|
69
|
+
/**
|
|
70
|
+
* Resolve service data links to a mapping of endpoint URIs to their quads.
|
|
71
|
+
* @param serviceDataLinks Links to service data.
|
|
72
|
+
* @param options Fetch options.
|
|
73
|
+
*/
|
|
74
|
+
static resolveServiceDataLinks(serviceDataLinks: IServiceDataLink[], options?: IFetchOptions): Promise<Record<string, RDF.Quad[]>>;
|
|
64
75
|
resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation>;
|
|
65
76
|
}
|
|
66
77
|
export interface ITestCaseQueryEvaluationProps {
|
|
67
78
|
baseIRI: string;
|
|
68
79
|
queryString: string;
|
|
69
80
|
queryData: RDF.Quad[];
|
|
81
|
+
serviceData: Record<string, RDF.Quad[]>;
|
|
70
82
|
queryResult: IQueryResult;
|
|
71
83
|
laxCardinality: boolean;
|
|
72
84
|
laxComparison: boolean;
|
|
73
85
|
resultSource: IFetchResponse;
|
|
74
86
|
queryDataLinks: IQueryDataLink[];
|
|
87
|
+
serviceDataLinks: IServiceDataLink[];
|
|
75
88
|
}
|
|
76
89
|
export interface IQueryDataLink {
|
|
77
90
|
dataUri: string;
|
|
78
91
|
dataGraph?: RDF.NamedNode;
|
|
79
92
|
}
|
|
93
|
+
export interface IServiceDataLink {
|
|
94
|
+
endpoint: string;
|
|
95
|
+
dataUri: string;
|
|
96
|
+
}
|
|
80
97
|
export declare class TestCaseQueryEvaluation implements ITestCaseSparql {
|
|
81
98
|
readonly type = "sparql";
|
|
82
99
|
readonly approval: string;
|
|
@@ -88,12 +105,15 @@ export declare class TestCaseQueryEvaluation implements ITestCaseSparql {
|
|
|
88
105
|
readonly baseIRI: string;
|
|
89
106
|
readonly queryString: string;
|
|
90
107
|
readonly queryData: RDF.Quad[];
|
|
108
|
+
readonly serviceData: Record<string, RDF.Quad[]>;
|
|
91
109
|
readonly queryResult: IQueryResult;
|
|
92
110
|
readonly laxCardinality: boolean;
|
|
93
111
|
readonly laxComparison: boolean;
|
|
94
112
|
readonly queryDataLinks: IQueryDataLink[];
|
|
113
|
+
readonly serviceDataLinks: IServiceDataLink[];
|
|
95
114
|
readonly resultSource: IFetchResponse;
|
|
96
115
|
constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps);
|
|
97
116
|
static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string;
|
|
117
|
+
static serviceDataLinksToString(serviceDataLinks: IServiceDataLink[]): string;
|
|
98
118
|
test(engine: IQueryEngine, injectArguments: any): Promise<void>;
|
|
99
119
|
}
|
|
@@ -312,6 +312,34 @@ class TestCaseQueryEvaluationHandler {
|
|
|
312
312
|
return queryData;
|
|
313
313
|
});
|
|
314
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* Obtain all service data links for the given query test action.
|
|
317
|
+
* @param action A query test action.
|
|
318
|
+
*/
|
|
319
|
+
static getServiceDataLinks(action) {
|
|
320
|
+
const serviceDataLinks = [];
|
|
321
|
+
for (const serviceData of action.properties.serviceData) {
|
|
322
|
+
serviceDataLinks.push({
|
|
323
|
+
endpoint: serviceData.property.endpoint.value,
|
|
324
|
+
dataUri: serviceData.property.data.value,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return serviceDataLinks;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Resolve service data links to a mapping of endpoint URIs to their quads.
|
|
331
|
+
* @param serviceDataLinks Links to service data.
|
|
332
|
+
* @param options Fetch options.
|
|
333
|
+
*/
|
|
334
|
+
static resolveServiceDataLinks(serviceDataLinks, options) {
|
|
335
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
336
|
+
const serviceData = {};
|
|
337
|
+
for (const link of serviceDataLinks) {
|
|
338
|
+
serviceData[link.endpoint] = yield (0, arrayify_stream_1.arrayifyStream)((yield Util_1.Util.fetchRdf(link.dataUri, Object.assign(Object.assign({}, options), { normalizeUrl: true })))[1]);
|
|
339
|
+
}
|
|
340
|
+
return serviceData;
|
|
341
|
+
});
|
|
342
|
+
}
|
|
315
343
|
resourceToTestCase(resource, testCaseData, options) {
|
|
316
344
|
return __awaiter(this, void 0, void 0, function* () {
|
|
317
345
|
if (!resource.property.action) {
|
|
@@ -326,6 +354,8 @@ class TestCaseQueryEvaluationHandler {
|
|
|
326
354
|
}
|
|
327
355
|
// Determine links to data
|
|
328
356
|
const queryDataLinks = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);
|
|
357
|
+
// Determine links to service data (for federated query tests)
|
|
358
|
+
const serviceDataLinks = TestCaseQueryEvaluationHandler.getServiceDataLinks(action);
|
|
329
359
|
const mf = 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#';
|
|
330
360
|
// Check for lax cardinality property
|
|
331
361
|
let laxCardinality = false;
|
|
@@ -339,12 +369,16 @@ class TestCaseQueryEvaluationHandler {
|
|
|
339
369
|
}
|
|
340
370
|
// Collect all query data
|
|
341
371
|
const queryData = yield TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);
|
|
372
|
+
// Resolve service data for federated queries
|
|
373
|
+
const serviceData = yield TestCaseQueryEvaluationHandler.resolveServiceDataLinks(serviceDataLinks, options);
|
|
342
374
|
const queryResponse = yield Util_1.Util.fetchCached(resource.property.result.value, options);
|
|
343
375
|
return new TestCaseQueryEvaluation(testCaseData, {
|
|
344
376
|
baseIRI: action.property.query.value,
|
|
345
377
|
queryDataLinks,
|
|
378
|
+
serviceDataLinks,
|
|
346
379
|
laxCardinality,
|
|
347
380
|
queryData,
|
|
381
|
+
serviceData,
|
|
348
382
|
queryResult: yield TestCaseQueryEvaluationHandler.parseQueryResult(Util_1.Util.identifyContentType(queryResponse.url, queryResponse.headers), queryResponse.url, queryResponse.body),
|
|
349
383
|
queryString: yield stringifyStream((yield Util_1.Util.fetchCached(action.property.query.value, options)).body),
|
|
350
384
|
resultSource: queryResponse,
|
|
@@ -363,11 +397,21 @@ class TestCaseQueryEvaluation {
|
|
|
363
397
|
static queryDataLinksToString(queryDataLinks) {
|
|
364
398
|
return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\n ');
|
|
365
399
|
}
|
|
400
|
+
static serviceDataLinksToString(serviceDataLinks) {
|
|
401
|
+
if (serviceDataLinks.length === 0) {
|
|
402
|
+
return 'None';
|
|
403
|
+
}
|
|
404
|
+
return serviceDataLinks.map(link => `${link.endpoint} (data: ${link.dataUri})`).join(',\n ');
|
|
405
|
+
}
|
|
366
406
|
test(engine, injectArguments) {
|
|
367
407
|
return __awaiter(this, void 0, void 0, function* () {
|
|
368
|
-
const
|
|
408
|
+
const options = Object.assign({ baseIRI: this.baseIRI, checkOrder: this.queryResult.type === 'bindings' ?
|
|
369
409
|
this.queryResult.checkOrder :
|
|
370
|
-
false, nonLexicalComparison: this.laxComparison, fullTermComparison: this.laxComparison }, injectArguments)
|
|
410
|
+
false, nonLexicalComparison: this.laxComparison, fullTermComparison: this.laxComparison }, injectArguments);
|
|
411
|
+
if (Object.keys(this.serviceData).length > 0) {
|
|
412
|
+
options.serviceData = this.serviceData;
|
|
413
|
+
}
|
|
414
|
+
const result = yield engine.query(this.queryData, this.queryString, options);
|
|
371
415
|
if (!this.queryResult.equals(result, this.laxCardinality)) {
|
|
372
416
|
throw new ErrorTest_1.ErrorTest(`Invalid query evaluation
|
|
373
417
|
|
|
@@ -375,6 +419,8 @@ class TestCaseQueryEvaluation {
|
|
|
375
419
|
|
|
376
420
|
Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}
|
|
377
421
|
|
|
422
|
+
Service links: ${TestCaseQueryEvaluation.serviceDataLinksToString(this.serviceDataLinks)}
|
|
423
|
+
|
|
378
424
|
Result Source: ${this.resultSource.url}
|
|
379
425
|
|
|
380
426
|
Expected: ${this.queryResult.toString()}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,qDAAiD;AACjD,uDAA+C;AAE/C,2CAA6C;AAC7C,2CAA0C;AAC1C,mDAAiE;AAEjE,yCAAqC;AACrC,uDAAoD;AACpD,qDAAkD;AAClD,+CAA4C;AAE5C,qCAAkC;AAKlC,+DAA4D;AAC5D,6DAA0D;AAC1D,yDAAsD;AAEtD,qEAAqE;AACrE,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD,MAAM,EAAE,GAAG,IAAI,8BAAW,EAAE,CAAC;AAE7B;;GAEG;AACH,MAAa,8BAA8B;IACzC;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAO,gBAAgB,CAAC,WAAmB,EAAE,GAAW,EAAE,IAA2B;;YAChG,IAAI,WAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAe,WAAI,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvE,WAAW,GAAG,IAAI,mCAAgB,CAAC,MAAM,IAAA,gCAAc,EAAC,SAAS,CAAC,CAAC,CAAC;YACtE,CAAC;YAAC,WAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,gCAAgC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnF,WAAW,GAAG,gCAAgC,CAAC;gBAC/C,WAAW,GAAG,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,iCAAiC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpF,WAAW,GAAG,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9E,WAAW,GAAG,MAAM,8BAA8B,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,sDAAsD,WAAW,OAAO,GAAG,EAAE,CAAC,CAAC;YACjG,CAAC;YAED,4BAA4B;YAC5B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC9D,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,iDAAiD;gBAC1F,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,iEAAiE,EAAE,CAAC;gBAC1G,OAAO,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;KAAA;IAED;;;;;OAKG;IACI,MAAM,CAAO,kBAAkB,CAAC,IAAoB,EAAE,IAA2B;;YACtF,IAAI,cAAgC,CAAC;YACrC,IAAI,cAAqC,CAAC;YAC1C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACrD,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAI,iCAAe,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzE,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACpD,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,eAAe,GAA0D,OAAO,CAAC,GAAG,CAAC;gBACzF,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;oBACtC,cAAc;yBACX,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;yBACxB,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,CAAC,CAAC;gBACF,IAAA,gCAAc,EAAC,cAAc,CAAC;aAC/B,CAAC,CAAC;YAEH,iDAAiD;YACjD,IAAI,aAAa,GAAU,IAAI,CAAC;YAChC,IAAI,YAAY,GAAU,IAAI,CAAC;YAC/B,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAO,EAAE;oBAC9B,YAAY,GAAG,CAAC,CAAC;oBACjB,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;gBACF,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAO,EAAE;oBAC/B,aAAa,GAAG,CAAC,CAAC;oBAClB,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,uCAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAsB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1I,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCACT,aAAa,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;KAAA;IAED;;;;;OAKG;IACI,MAAM,CAAO,kBAAkB,CAAC,KAAiB;;YACtD,yCAAyC;YACzC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,+DAA+D,EAAE,CAAC;gBAC7G,OAAO,IAAI,uCAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YAClE,CAAC;YAED,gEAAgE;YAChE,MAAM,YAAY,GAAG,IAAI,4BAAe,CAAC;gBACvC,OAAO,EAAE;oBACP,MAAM,EAAE,wDAAwD;oBAChE,QAAQ,EAAE,gBAAgB;oBAC1B,KAAK,EAAE,cAAc;oBACrB,eAAe,EAAE,uBAAuB;oBACxC,SAAS,EAAE,iBAAiB;oBAC5B,KAAK,EAAE,cAAc;oBACrB,QAAQ,EAAE,iBAAiB;iBAC5B;aACF,CAAC,CAAC;YACH,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,SAAS,GAAa,IAAI,CAAC;YAC/B,KAAK,MAAM,YAAY,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAClD,IAAI,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC;qBACrC,GAAG,CAAC,IAAA,yBAAY,EAAC,iEAAiE,CAAC,CAAC,EAAE,CAAC;oBACxF,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAa,SAAS,CAAC,UAAU,CAAC,eAAe;iBAC7D,GAAG,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAErD,kCAAkC;YAClC,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACzC,KAAK,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAC5B,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,gDAAgD;YAChD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,SAAS,CAAC,IAAI,CAAC,CAAC,SAAmB,EAAE,SAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1K,CAAC;YAED,iCAAiC;YACjC,MAAM,KAAK,GAA+B,SAAS,CAAC,GAAG,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAa,EAAE,OAAiB,EAAE,EAAE;gBACvJ,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9E,OAAO,QAAQ,CAAC;YAClB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAER,OAAO,IAAI,yCAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;KAAA;IAED;;;;OAIG;IACI,MAAM,CAAO,qBAAqB,CAAC,IAA2B;;YACnE,MAAM,IAAI,GAAW,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACjD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;oBAC1B,OAAO,IAAI,uCAAkB,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,OAAO,IAAI,uCAAkB,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE1C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;oBAE5B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;wBACpB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;oBACxE,CAAC;oBAED,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpF,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;oBACvD,CAAC;oBAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,qBAAqB,CAAC,CAAC;oBACrF,CAAC;oBAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAA+B,EAAE,CAAC;YAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEpC,MAAM,uBAAuB,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBAElG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,qBAAqB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtH,CAAC;gBAED,MAAM,OAAO,GAA6B,EAAE,CAAC;gBAE7C,KAAK,MAAM,CAAE,CAAC,EAAE,QAAQ,CAAE,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,IAAI,CAAC;4BACH,OAAO,CAAC,QAAQ,CAAC,GAAG,8BAA8B,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBACzE,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BACpB,MAAM,IAAI,KAAK,CACjB,qCAAqC,CAAC,GAAG,CAAC,aAAa,QAAQ,KAAK;gCACpE,6BAA6B,KAAK,uBAAuB,KAAK,CAAC,OAAO,EAAE,CACrE,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,yCAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;KAAA;IAED;;;;OAIG;IACI,MAAM,CAAC,YAAY,CAAC,IAAY;QACrC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAA,6BAAe,EAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAgB;QAC9C,MAAM,cAAc,GAAqB,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,cAAc,CAAC,IAAI,CAAC;gBAClB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK;aACpC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC7B,cAAc,CAAC,IAAI,CAAC;oBAClB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;oBACvC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,IAAI,CAAC;oBAClB,OAAO,EAAE,SAAS,CAAC,KAAK;oBACxB,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAO,qBAAqB,CAAC,cAAgC,EAAE,OAAuB;;YACjG,IAAI,SAAS,GAAe,EAAE,CAAC;YAC/B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;gBAC3C,IAAI,aAAa,GAAe,MAAM,IAAA,gCAAc,EAAC,CAAC,MAAM,WAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/G,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;oBAC5B,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,oBAAQ,EAAC,IAAI,EAAE,CAAC,KAAe,EAAE,GAAiB,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvJ,CAAC;gBACD,SAAS,GAAG,CAAE,GAAG,SAAS,EAAE,GAAG,aAAa,CAAE,CAAC;YACjD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAAE,OAAuB;;YACtG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,0BAA0B;YAC1B,MAAM,cAAc,GAAqB,8BAA8B,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAElG,MAAM,EAAE,GAAG,2DAA2D,CAAC;YAEvE,qCAAqC;YACrC,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,KAAK,GAAG,EAAE,gBAAgB,EAAE,CAAC;gBAC/G,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,kDAAkD;YAClD,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,wBAAwB,CAAC,EAAE,CAAC;gBAC9H,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAe,MAAM,8BAA8B,CAAC,qBAAqB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAElH,MAAM,aAAa,GAAG,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtF,OAAO,IAAI,uBAAuB,CAChC,YAAY,EACZ;gBACE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;gBACpC,cAAc;gBACd,cAAc;gBACd,SAAS;gBACT,WAAW,EAAE,MAAM,8BAA8B,CAAC,gBAAgB,CAChE,WAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,EAClE,aAAa,CAAC,GAAG,EACjB,aAAa,CAAC,IAAI,CACnB;gBACD,WAAW,EAAE,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvG,YAAY,EAAE,aAAa;gBAC3B,aAAa;aACd,CACF,CAAC;QACJ,CAAC;KAAA;CACF;AAvWD,wEAuWC;AAkBD,MAAa,uBAAuB;IAkBlC,YAAY,YAA2B,EAAE,KAAoC;QAjB7D,SAAI,GAAG,QAAQ,CAAC;QAkB9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,sBAAsB,CAAC,cAAgC;QACnE,OAAO,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,aAAa,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1K,CAAC;IAEY,IAAI,CAAC,MAAoB,EAAE,eAAoB;;YAC1D,MAAM,MAAM,GAAiB,MAAM,MAAM,CAAC,KAAK,CAC7C,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,kBAEd,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;oBAChD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBAC7B,KAAK,EACP,oBAAoB,EAAE,IAAI,CAAC,aAAa,EACxC,kBAAkB,EAAE,IAAI,CAAC,aAAa,IACnC,eAAe,EAErB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,qBAAS,CAAC;;cAEZ,IAAI,CAAC,WAAW;;gBAEd,uBAAuB,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC;;mBAEhE,IAAI,CAAC,YAAY,CAAC,GAAG;;cAE1B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;YAE7B,MAAM,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;YACC,CAAC;QACH,CAAC;KAAA;CACF;AAxDD,0DAwDC","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport { stringToTerm as stringToTtlTerm } from 'rdf-string-ttl';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings, IQueryResultBoolean } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json') || url.endsWith('.srj')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings | IQueryResultBoolean>} A promise resolving to a bindings or boolean results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings | IQueryResultBoolean> {\n // Check for a boolean result (ASK query)\n if (quads[1] && quads[1].predicate.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#boolean') {\n return new QueryResultBoolean(quads[1].object.value === 'true');\n }\n\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Parses query results from a SPARQL TSV stream.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult> {\n const text: string = await stringifyStream(data);\n const lines = text.replace(/\\r?\\n$/u, '').split(/\\r?\\n/u);\n\n if (lines.length === 1) {\n const singleLine = lines[0].trim().toLowerCase();\n if (singleLine === 'true') {\n return new QueryResultBoolean(true);\n }\n if (singleLine === 'false') {\n return new QueryResultBoolean(false);\n }\n }\n\n const variables: string[] = [];\n\n if (lines[0].trim() !== '') {\n const rawVariables = lines[0].split('\\t');\n\n for (const raw of rawVariables) {\n const variable = raw.trim();\n\n if (variable === '') {\n throw new Error('Invalid TSV result: Empty column on the first row.');\n }\n\n if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {\n throw new Error(`Invalid TSV variable: ${variable}`);\n }\n\n if (variables.includes(variable)) {\n throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);\n }\n\n variables.push(variable);\n }\n }\n\n const value: Record<string, RDF.Term>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const fields = lines[i].split('\\t');\n\n const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';\n\n if (fields.length !== variables.length && !isZeroVariableResultRow) {\n throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);\n }\n\n const binding: Record<string, RDF.Term> = {};\n\n for (const [ j, variable ] of variables.entries()) {\n const field = fields[j].trim();\n\n if (field.length > 0) {\n try {\n binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);\n } catch (error: any) {\n throw new Error(\n `Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +\n `Invalid Turtle syntax in \"${field}\".\\nOriginal error: ${error.message}`,\n );\n }\n }\n }\n value.push(binding);\n }\n\n return new QueryResultBindings(variables, value, false);\n }\n\n /**\n * Parse a single field from a SPARQL TSV result into an RDF term.\n * @param {string} term The TSV field value.\n * @return {RDF.Term} The corresponding RDF term.\n */\n public static parseTsvTerm(term: string): RDF.Term {\n if (/^[+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+)$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));\n }\n if (term === 'true' || term === 'false') {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));\n }\n\n return stringToTtlTerm(term);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(graphData.property.label.value),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(graphData.value),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, options))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n const mf = 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#';\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value === `${mf}LaxCardinality`) {\n laxCardinality = true;\n }\n\n // Check for mf:requires mf:StringSimpleLiteralCmp\n let laxComparison = false;\n if (resource.property.requires && resource.properties.requires.map(r => r.term.value).includes(`${mf}StringSimpleLiteralCmp`)) {\n laxComparison = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: action.property.query.value,\n queryDataLinks,\n laxCardinality,\n queryData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n laxComparison,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: boolean;\n laxComparison: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly laxComparison: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const result: IQueryResult = await engine.query(\n this.queryData,\n this.queryString,\n {\n baseIRI: this.baseIRI,\n checkOrder: this.queryResult.type === 'bindings' ?\n this.queryResult.checkOrder :\n false,\n nonLexicalComparison: this.laxComparison,\n fullTermComparison: this.laxComparison,\n ...injectArguments,\n },\n );\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport { stringToTerm as stringToTtlTerm } from 'rdf-string-ttl';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings, IQueryResultBoolean } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json') || url.endsWith('.srj')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings | IQueryResultBoolean>} A promise resolving to a bindings or boolean results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings | IQueryResultBoolean> {\n // Check for a boolean result (ASK query)\n if (quads[1] && quads[1].predicate.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#boolean') {\n return new QueryResultBoolean(quads[1].object.value === 'true');\n }\n\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Parses query results from a SPARQL TSV stream.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult> {\n const text: string = await stringifyStream(data);\n const lines = text.replace(/\\r?\\n$/u, '').split(/\\r?\\n/u);\n\n if (lines.length === 1) {\n const singleLine = lines[0].trim().toLowerCase();\n if (singleLine === 'true') {\n return new QueryResultBoolean(true);\n }\n if (singleLine === 'false') {\n return new QueryResultBoolean(false);\n }\n }\n\n const variables: string[] = [];\n\n if (lines[0].trim() !== '') {\n const rawVariables = lines[0].split('\\t');\n\n for (const raw of rawVariables) {\n const variable = raw.trim();\n\n if (variable === '') {\n throw new Error('Invalid TSV result: Empty column on the first row.');\n }\n\n if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {\n throw new Error(`Invalid TSV variable: ${variable}`);\n }\n\n if (variables.includes(variable)) {\n throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);\n }\n\n variables.push(variable);\n }\n }\n\n const value: Record<string, RDF.Term>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const fields = lines[i].split('\\t');\n\n const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';\n\n if (fields.length !== variables.length && !isZeroVariableResultRow) {\n throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);\n }\n\n const binding: Record<string, RDF.Term> = {};\n\n for (const [ j, variable ] of variables.entries()) {\n const field = fields[j].trim();\n\n if (field.length > 0) {\n try {\n binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);\n } catch (error: any) {\n throw new Error(\n `Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +\n `Invalid Turtle syntax in \"${field}\".\\nOriginal error: ${error.message}`,\n );\n }\n }\n }\n value.push(binding);\n }\n\n return new QueryResultBindings(variables, value, false);\n }\n\n /**\n * Parse a single field from a SPARQL TSV result into an RDF term.\n * @param {string} term The TSV field value.\n * @return {RDF.Term} The corresponding RDF term.\n */\n public static parseTsvTerm(term: string): RDF.Term {\n if (/^[+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+)$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));\n }\n if (term === 'true' || term === 'false') {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));\n }\n\n return stringToTtlTerm(term);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(graphData.property.label.value),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(graphData.value),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, options))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n /**\n * Obtain all service data links for the given query test action.\n * @param action A query test action.\n */\n public static getServiceDataLinks(action: Resource): IServiceDataLink[] {\n const serviceDataLinks: IServiceDataLink[] = [];\n for (const serviceData of action.properties.serviceData) {\n serviceDataLinks.push({\n endpoint: serviceData.property.endpoint.value,\n dataUri: serviceData.property.data.value,\n });\n }\n return serviceDataLinks;\n }\n\n /**\n * Resolve service data links to a mapping of endpoint URIs to their quads.\n * @param serviceDataLinks Links to service data.\n * @param options Fetch options.\n */\n public static async resolveServiceDataLinks(serviceDataLinks: IServiceDataLink[], options?: IFetchOptions): Promise<Record<string, RDF.Quad[]>> {\n const serviceData: Record<string, RDF.Quad[]> = {};\n for (const link of serviceDataLinks) {\n serviceData[link.endpoint] = await arrayifyStream((await Util.fetchRdf(link.dataUri, { ...options, normalizeUrl: true }))[1]);\n }\n return serviceData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n // Determine links to service data (for federated query tests)\n const serviceDataLinks: IServiceDataLink[] = TestCaseQueryEvaluationHandler.getServiceDataLinks(action);\n\n const mf = 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#';\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value === `${mf}LaxCardinality`) {\n laxCardinality = true;\n }\n\n // Check for mf:requires mf:StringSimpleLiteralCmp\n let laxComparison = false;\n if (resource.property.requires && resource.properties.requires.map(r => r.term.value).includes(`${mf}StringSimpleLiteralCmp`)) {\n laxComparison = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n // Resolve service data for federated queries\n const serviceData: Record<string, RDF.Quad[]> = await TestCaseQueryEvaluationHandler.resolveServiceDataLinks(serviceDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: action.property.query.value,\n queryDataLinks,\n serviceDataLinks,\n laxCardinality,\n queryData,\n serviceData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n laxComparison,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n serviceData: Record<string, RDF.Quad[]>;\n queryResult: IQueryResult;\n laxCardinality: boolean;\n laxComparison: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n serviceDataLinks: IServiceDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport interface IServiceDataLink {\n endpoint: string;\n dataUri: string;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly serviceData: Record<string, RDF.Quad[]>;\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly laxComparison: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly serviceDataLinks: IServiceDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public static serviceDataLinksToString(serviceDataLinks: IServiceDataLink[]): string {\n if (serviceDataLinks.length === 0) {\n return 'None';\n }\n return serviceDataLinks.map(link => `${link.endpoint} (data: ${link.dataUri})`).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const options: Record<string, any> = {\n baseIRI: this.baseIRI,\n checkOrder: this.queryResult.type === 'bindings' ?\n this.queryResult.checkOrder :\n false,\n nonLexicalComparison: this.laxComparison,\n fullTermComparison: this.laxComparison,\n ...injectArguments,\n };\n if (Object.keys(this.serviceData).length > 0) {\n options.serviceData = this.serviceData;\n }\n const result: IQueryResult = await engine.query(this.queryData, this.queryString, options);\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Service links: ${TestCaseQueryEvaluation.serviceDataLinksToString(this.serviceDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Resource } from 'rdf-object';
|
|
2
|
+
import type { ITestCaseData } from '../ITestCase';
|
|
3
|
+
import type { ITestCaseHandler } from '../ITestCaseHandler';
|
|
4
|
+
import type { IQueryEngine } from './IQueryEngine';
|
|
5
|
+
import type { ITestCaseSparql } from './ITestCaseSparql';
|
|
6
|
+
export interface IServiceDescriptionTestOptions {
|
|
7
|
+
/** The SPARQL endpoint whose service description is under test. */
|
|
8
|
+
serviceDescriptionEndpoint?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TestCaseServiceDescriptionHandler implements ITestCaseHandler<TestCaseServiceDescription> {
|
|
14
|
+
resourceToTestCase(_resource: Resource, testCaseData: ITestCaseData): Promise<TestCaseServiceDescription>;
|
|
15
|
+
}
|
|
16
|
+
export declare class TestCaseServiceDescription implements ITestCaseSparql {
|
|
17
|
+
readonly type = "sparql";
|
|
18
|
+
readonly approval: string;
|
|
19
|
+
readonly approvedBy: string;
|
|
20
|
+
readonly comment: string;
|
|
21
|
+
readonly types: string[];
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly uri: string;
|
|
24
|
+
constructor(testCaseData: ITestCaseData);
|
|
25
|
+
test(_engine: IQueryEngine, injectArguments: IServiceDescriptionTestOptions): Promise<void>;
|
|
26
|
+
private static getEndpoint;
|
|
27
|
+
private static getServiceDescription;
|
|
28
|
+
private static validateSchema;
|
|
29
|
+
private static termKey;
|
|
30
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TestCaseServiceDescription = exports.TestCaseServiceDescriptionHandler = void 0;
|
|
13
|
+
const arrayify_stream_1 = require("arrayify-stream");
|
|
14
|
+
const ErrorTest_1 = require("../../ErrorTest");
|
|
15
|
+
const Util_1 = require("../../Util");
|
|
16
|
+
const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
|
|
17
|
+
const SD = 'http://www.w3.org/ns/sparql-service-description#';
|
|
18
|
+
/**
|
|
19
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.
|
|
20
|
+
*/
|
|
21
|
+
class TestCaseServiceDescriptionHandler {
|
|
22
|
+
resourceToTestCase(_resource, testCaseData) {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
return new TestCaseServiceDescription(testCaseData);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.TestCaseServiceDescriptionHandler = TestCaseServiceDescriptionHandler;
|
|
29
|
+
class TestCaseServiceDescription {
|
|
30
|
+
constructor(testCaseData) {
|
|
31
|
+
this.type = 'sparql';
|
|
32
|
+
Object.assign(this, testCaseData);
|
|
33
|
+
}
|
|
34
|
+
test(_engine, injectArguments) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
const endpoint = TestCaseServiceDescription.getEndpoint(injectArguments);
|
|
37
|
+
switch (this.name) {
|
|
38
|
+
case 'GET on endpoint returns RDF':
|
|
39
|
+
yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
40
|
+
return;
|
|
41
|
+
case 'Service description contains a matching sd:endpoint triple': {
|
|
42
|
+
const serviceDescription = yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
43
|
+
if (!serviceDescription.some(quad => quad.predicate.value === `${SD}endpoint` &&
|
|
44
|
+
quad.object.termType === 'NamedNode' && quad.object.value === endpoint)) {
|
|
45
|
+
throw new ErrorTest_1.ErrorTest(`Service description at ${endpoint} does not contain a matching sd:endpoint triple.`);
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
case 'Service description conforms to schema': {
|
|
50
|
+
const serviceDescription = yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
51
|
+
TestCaseServiceDescription.validateSchema(serviceDescription, endpoint);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
throw new ErrorTest_1.ErrorTest(`Unsupported SPARQL service-description test: ${this.name}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
static getEndpoint(injectArguments) {
|
|
60
|
+
const endpoint = injectArguments && injectArguments.serviceDescriptionEndpoint;
|
|
61
|
+
if (!endpoint) {
|
|
62
|
+
throw new ErrorTest_1.ErrorTest('Service-description tests require an endpoint from startServiceDescriptionEndpoint or the serviceDescriptionEndpoint option.');
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const url = new URL(endpoint);
|
|
66
|
+
if (url.search || url.hash) {
|
|
67
|
+
throw new Error('The endpoint URL must not contain query parameters or a fragment');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new ErrorTest_1.ErrorTest(`Invalid serviceDescriptionEndpoint: ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
return endpoint;
|
|
74
|
+
}
|
|
75
|
+
static getServiceDescription(endpoint) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
try {
|
|
78
|
+
const response = yield Util_1.Util.fetchCached(endpoint, {}, {
|
|
79
|
+
headers: {
|
|
80
|
+
accept: 'text/turtle, application/rdf+xml;q=0.9, application/ld+json;q=0.8',
|
|
81
|
+
},
|
|
82
|
+
method: 'GET',
|
|
83
|
+
});
|
|
84
|
+
const contentType = Util_1.Util.identifyContentType(response.url, response.headers);
|
|
85
|
+
return yield (0, arrayify_stream_1.arrayifyStream)(Util_1.Util.parseRdfRaw(contentType, endpoint, response.body));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new ErrorTest_1.ErrorTest(`Could not retrieve an RDF service description from ${endpoint}: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
static validateSchema(serviceDescription, endpoint) {
|
|
93
|
+
const namedGraphs = new Set();
|
|
94
|
+
const namedGraphsWithName = new Set();
|
|
95
|
+
const datasets = new Set();
|
|
96
|
+
const datasetsWithDefaultGraph = new Set();
|
|
97
|
+
for (const quad of serviceDescription) {
|
|
98
|
+
const subject = TestCaseServiceDescription.termKey(quad.subject);
|
|
99
|
+
if (quad.predicate.value === `${SD}endpoint` && quad.object.termType !== 'NamedNode') {
|
|
100
|
+
throw new ErrorTest_1.ErrorTest(`The sd:endpoint value in the service description at ${endpoint} must be an IRI.`);
|
|
101
|
+
}
|
|
102
|
+
if (quad.predicate.value === `${SD}name`) {
|
|
103
|
+
if (quad.object.termType !== 'NamedNode') {
|
|
104
|
+
throw new ErrorTest_1.ErrorTest(`The sd:name value in the service description at ${endpoint} must be an IRI.`);
|
|
105
|
+
}
|
|
106
|
+
namedGraphsWithName.add(subject);
|
|
107
|
+
}
|
|
108
|
+
if (quad.predicate.value === `${SD}namedGraph`) {
|
|
109
|
+
namedGraphs.add(TestCaseServiceDescription.termKey(quad.object));
|
|
110
|
+
}
|
|
111
|
+
if (quad.predicate.value === `${SD}defaultGraph`) {
|
|
112
|
+
datasetsWithDefaultGraph.add(subject);
|
|
113
|
+
}
|
|
114
|
+
if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}NamedGraph`) {
|
|
115
|
+
namedGraphs.add(subject);
|
|
116
|
+
}
|
|
117
|
+
if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}Dataset`) {
|
|
118
|
+
datasets.add(subject);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const namedGraph of namedGraphs) {
|
|
122
|
+
if (!namedGraphsWithName.has(namedGraph)) {
|
|
123
|
+
throw new ErrorTest_1.ErrorTest(`Each sd:NamedGraph in the service description at ${endpoint} must have an sd:name.`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const dataset of datasets) {
|
|
127
|
+
if (!datasetsWithDefaultGraph.has(dataset)) {
|
|
128
|
+
throw new ErrorTest_1.ErrorTest(`Each sd:Dataset in the service description at ${endpoint} must have an sd:defaultGraph.`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
static termKey(term) {
|
|
133
|
+
return `${term.termType}:${term.value}`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.TestCaseServiceDescription = TestCaseServiceDescription;
|
|
137
|
+
//# sourceMappingURL=TestCaseServiceDescription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestCaseServiceDescription.js","sourceRoot":"","sources":["TestCaseServiceDescription.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport type { Resource } from 'rdf-object';\nimport { ErrorTest } from '../../ErrorTest';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\n\nconst RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';\nconst SD = 'http://www.w3.org/ns/sparql-service-description#';\n\nexport interface IServiceDescriptionTestOptions {\n /** The SPARQL endpoint whose service description is under test. */\n serviceDescriptionEndpoint?: string;\n}\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.\n */\nexport class TestCaseServiceDescriptionHandler implements ITestCaseHandler<TestCaseServiceDescription> {\n public async resourceToTestCase(_resource: Resource, testCaseData: ITestCaseData): Promise<TestCaseServiceDescription> {\n return new TestCaseServiceDescription(testCaseData);\n }\n}\n\nexport class TestCaseServiceDescription implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public constructor(testCaseData: ITestCaseData) {\n Object.assign(this, testCaseData);\n }\n\n public async test(_engine: IQueryEngine, injectArguments: IServiceDescriptionTestOptions): Promise<void> {\n const endpoint = TestCaseServiceDescription.getEndpoint(injectArguments);\n\n switch (this.name) {\n case 'GET on endpoint returns RDF':\n await TestCaseServiceDescription.getServiceDescription(endpoint);\n return;\n case 'Service description contains a matching sd:endpoint triple': {\n const serviceDescription = await TestCaseServiceDescription.getServiceDescription(endpoint);\n if (!serviceDescription.some(quad => quad.predicate.value === `${SD}endpoint` &&\n quad.object.termType === 'NamedNode' && quad.object.value === endpoint)) {\n throw new ErrorTest(`Service description at ${endpoint} does not contain a matching sd:endpoint triple.`);\n }\n return;\n }\n case 'Service description conforms to schema': {\n const serviceDescription = await TestCaseServiceDescription.getServiceDescription(endpoint);\n TestCaseServiceDescription.validateSchema(serviceDescription, endpoint);\n return;\n }\n default:\n throw new ErrorTest(`Unsupported SPARQL service-description test: ${this.name}`);\n }\n }\n\n private static getEndpoint(injectArguments: IServiceDescriptionTestOptions): string {\n const endpoint = injectArguments && injectArguments.serviceDescriptionEndpoint;\n if (!endpoint) {\n throw new ErrorTest('Service-description tests require an endpoint from startServiceDescriptionEndpoint or the serviceDescriptionEndpoint option.');\n }\n try {\n const url = new URL(endpoint);\n if (url.search || url.hash) {\n throw new Error('The endpoint URL must not contain query parameters or a fragment');\n }\n } catch (error) {\n throw new ErrorTest(`Invalid serviceDescriptionEndpoint: ${(error as Error).message}`);\n }\n return endpoint;\n }\n\n private static async getServiceDescription(endpoint: string): Promise<RDF.Quad[]> {\n try {\n const response = await Util.fetchCached(endpoint, {}, {\n headers: {\n accept: 'text/turtle, application/rdf+xml;q=0.9, application/ld+json;q=0.8',\n },\n method: 'GET',\n });\n const contentType = Util.identifyContentType(response.url, response.headers);\n return await arrayifyStream(Util.parseRdfRaw(contentType, endpoint, response.body));\n } catch (error) {\n throw new ErrorTest(`Could not retrieve an RDF service description from ${endpoint}: ${(error as Error).message}`);\n }\n }\n\n private static validateSchema(serviceDescription: RDF.Quad[], endpoint: string): void {\n const namedGraphs = new Set<string>();\n const namedGraphsWithName = new Set<string>();\n const datasets = new Set<string>();\n const datasetsWithDefaultGraph = new Set<string>();\n\n for (const quad of serviceDescription) {\n const subject = TestCaseServiceDescription.termKey(quad.subject);\n if (quad.predicate.value === `${SD}endpoint` && quad.object.termType !== 'NamedNode') {\n throw new ErrorTest(`The sd:endpoint value in the service description at ${endpoint} must be an IRI.`);\n }\n if (quad.predicate.value === `${SD}name`) {\n if (quad.object.termType !== 'NamedNode') {\n throw new ErrorTest(`The sd:name value in the service description at ${endpoint} must be an IRI.`);\n }\n namedGraphsWithName.add(subject);\n }\n if (quad.predicate.value === `${SD}namedGraph`) {\n namedGraphs.add(TestCaseServiceDescription.termKey(quad.object));\n }\n if (quad.predicate.value === `${SD}defaultGraph`) {\n datasetsWithDefaultGraph.add(subject);\n }\n if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}NamedGraph`) {\n namedGraphs.add(subject);\n }\n if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}Dataset`) {\n datasets.add(subject);\n }\n }\n\n for (const namedGraph of namedGraphs) {\n if (!namedGraphsWithName.has(namedGraph)) {\n throw new ErrorTest(`Each sd:NamedGraph in the service description at ${endpoint} must have an sd:name.`);\n }\n }\n for (const dataset of datasets) {\n if (!datasetsWithDefaultGraph.has(dataset)) {\n throw new ErrorTest(`Each sd:Dataset in the service description at ${endpoint} must have an sd:defaultGraph.`);\n }\n }\n }\n\n private static termKey(term: RDF.Term): string {\n return `${term.termType}:${term.value}`;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rdf-test-suite",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
|
|
5
5
|
"description": "Executes the RDF and SPARQL test suites.",
|
|
6
6
|
"typings": "index",
|