rdf-test-suite 2.3.3 → 2.5.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.
@@ -23,12 +23,15 @@
23
23
  "name": "mf:name",
24
24
  "result": "mf:result",
25
25
  "resultCardinality": "mf:resultCardinality",
26
+ "requires": "mf:requires",
26
27
 
27
28
  "q": "http://www.w3.org/2001/sw/DataAccess/tests/test-query#",
28
29
  "data": "q:data",
29
30
  "graph": "q:graph",
30
31
  "graphData": "q:graphData",
31
32
  "query": "q:query",
33
+ "serviceData": "q:serviceData",
34
+ "endpoint": "q:endpoint",
32
35
 
33
36
  "ut": "http://www.w3.org/2009/sparql/tests/test-update#",
34
37
  "updateQuery": "ut:request",
@@ -61,21 +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;
84
+ laxComparison: boolean;
72
85
  resultSource: IFetchResponse;
73
86
  queryDataLinks: IQueryDataLink[];
87
+ serviceDataLinks: IServiceDataLink[];
74
88
  }
75
89
  export interface IQueryDataLink {
76
90
  dataUri: string;
77
91
  dataGraph?: RDF.NamedNode;
78
92
  }
93
+ export interface IServiceDataLink {
94
+ endpoint: string;
95
+ dataUri: string;
96
+ }
79
97
  export declare class TestCaseQueryEvaluation implements ITestCaseSparql {
80
98
  readonly type = "sparql";
81
99
  readonly approval: string;
@@ -87,11 +105,15 @@ export declare class TestCaseQueryEvaluation implements ITestCaseSparql {
87
105
  readonly baseIRI: string;
88
106
  readonly queryString: string;
89
107
  readonly queryData: RDF.Quad[];
108
+ readonly serviceData: Record<string, RDF.Quad[]>;
90
109
  readonly queryResult: IQueryResult;
91
110
  readonly laxCardinality: boolean;
111
+ readonly laxComparison: boolean;
92
112
  readonly queryDataLinks: IQueryDataLink[];
113
+ readonly serviceDataLinks: IServiceDataLink[];
93
114
  readonly resultSource: IFetchResponse;
94
115
  constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps);
95
116
  static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string;
117
+ static serviceDataLinksToString(serviceDataLinks: IServiceDataLink[]): string;
96
118
  test(engine: IQueryEngine, injectArguments: any): Promise<void>;
97
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,23 +354,35 @@ 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);
359
+ const mf = 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#';
329
360
  // Check for lax cardinality property
330
361
  let laxCardinality = false;
331
- if (resource.property.resultCardinality && resource.property.resultCardinality.value ===
332
- 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {
362
+ if (resource.property.resultCardinality && resource.property.resultCardinality.value === `${mf}LaxCardinality`) {
333
363
  laxCardinality = true;
334
364
  }
365
+ // Check for mf:requires mf:StringSimpleLiteralCmp
366
+ let laxComparison = false;
367
+ if (resource.property.requires && resource.properties.requires.map(r => r.term.value).includes(`${mf}StringSimpleLiteralCmp`)) {
368
+ laxComparison = true;
369
+ }
335
370
  // Collect all query data
336
371
  const queryData = yield TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);
372
+ // Resolve service data for federated queries
373
+ const serviceData = yield TestCaseQueryEvaluationHandler.resolveServiceDataLinks(serviceDataLinks, options);
337
374
  const queryResponse = yield Util_1.Util.fetchCached(resource.property.result.value, options);
338
375
  return new TestCaseQueryEvaluation(testCaseData, {
339
376
  baseIRI: action.property.query.value,
340
377
  queryDataLinks,
378
+ serviceDataLinks,
341
379
  laxCardinality,
342
380
  queryData,
381
+ serviceData,
343
382
  queryResult: yield TestCaseQueryEvaluationHandler.parseQueryResult(Util_1.Util.identifyContentType(queryResponse.url, queryResponse.headers), queryResponse.url, queryResponse.body),
344
383
  queryString: yield stringifyStream((yield Util_1.Util.fetchCached(action.property.query.value, options)).body),
345
384
  resultSource: queryResponse,
385
+ laxComparison,
346
386
  });
347
387
  });
348
388
  }
@@ -357,11 +397,21 @@ class TestCaseQueryEvaluation {
357
397
  static queryDataLinksToString(queryDataLinks) {
358
398
  return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\n ');
359
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
+ }
360
406
  test(engine, injectArguments) {
361
407
  return __awaiter(this, void 0, void 0, function* () {
362
- const result = yield engine.query(this.queryData, this.queryString, Object.assign({ baseIRI: this.baseIRI, checkOrder: this.queryResult.type === 'bindings' ?
408
+ const options = Object.assign({ baseIRI: this.baseIRI, checkOrder: this.queryResult.type === 'bindings' ?
363
409
  this.queryResult.checkOrder :
364
- false }, 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);
365
415
  if (!this.queryResult.equals(result, this.laxCardinality)) {
366
416
  throw new ErrorTest_1.ErrorTest(`Invalid query evaluation
367
417
 
@@ -369,6 +419,8 @@ class TestCaseQueryEvaluation {
369
419
 
370
420
  Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}
371
421
 
422
+ Service links: ${TestCaseQueryEvaluation.serviceDataLinksToString(this.serviceDataLinks)}
423
+
372
424
  Result Source: ${this.resultSource.url}
373
425
 
374
426
  Expected: ${this.queryResult.toString()}
@@ -1 +1 @@
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 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 // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value ===\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {\n laxCardinality = 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 },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: 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 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 ...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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rdf-test-suite",
3
- "version": "2.3.3",
3
+ "version": "2.5.0",
4
4
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
5
5
  "description": "Executes the RDF and SPARQL test suites.",
6
6
  "typings": "index",