@noeldemartin/solid-utils 0.5.0 → 0.6.0-next.508449b33de64b0bcade86b642c9793381434231
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/dist/chai.d.ts +31 -0
- package/dist/chai.js +23 -0
- package/dist/chai.js.map +1 -0
- package/dist/helpers-DGXMj9cx.js +107 -0
- package/dist/helpers-DGXMj9cx.js.map +1 -0
- package/dist/io-wCcrq4b9.js +401 -0
- package/dist/io-wCcrq4b9.js.map +1 -0
- package/dist/noeldemartin-solid-utils.d.ts +61 -65
- package/dist/noeldemartin-solid-utils.js +224 -0
- package/dist/noeldemartin-solid-utils.js.map +1 -0
- package/dist/testing.d.ts +40 -0
- package/dist/testing.js +7 -0
- package/dist/testing.js.map +1 -0
- package/dist/vitest.d.ts +50 -0
- package/dist/vitest.js +55 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +67 -63
- package/src/chai/assertions.ts +35 -0
- package/src/chai/index.ts +19 -0
- package/src/errors/UnauthorizedError.ts +1 -3
- package/src/errors/UnsuccessfulNetworkRequestError.ts +2 -2
- package/src/helpers/auth.test.ts +221 -0
- package/src/helpers/auth.ts +28 -27
- package/src/helpers/identifiers.test.ts +76 -0
- package/src/helpers/identifiers.ts +14 -17
- package/src/helpers/index.ts +0 -1
- package/src/helpers/interop.ts +23 -16
- package/src/helpers/io.test.ts +228 -0
- package/src/helpers/io.ts +57 -77
- package/src/helpers/jsonld.ts +6 -6
- package/src/helpers/vocabs.ts +3 -6
- package/src/helpers/wac.test.ts +64 -0
- package/src/helpers/wac.ts +10 -6
- package/src/index.ts +4 -0
- package/src/models/SolidDocument.test.ts +77 -0
- package/src/models/SolidDocument.ts +14 -18
- package/src/models/SolidStore.ts +22 -12
- package/src/models/SolidThing.ts +5 -7
- package/src/models/index.ts +2 -0
- package/src/{helpers/testing.ts → testing/helpers.ts} +24 -27
- package/src/testing/hepers.test.ts +329 -0
- package/src/testing/index.ts +1 -2
- package/src/types/index.ts +2 -0
- package/src/types/n3.d.ts +0 -2
- package/src/vitest/index.ts +20 -0
- package/src/vitest/matchers.ts +68 -0
- package/.github/workflows/ci.yml +0 -16
- package/.nvmrc +0 -1
- package/CHANGELOG.md +0 -70
- package/dist/noeldemartin-solid-utils.cjs.js +0 -2
- package/dist/noeldemartin-solid-utils.cjs.js.map +0 -1
- package/dist/noeldemartin-solid-utils.esm.js +0 -2
- package/dist/noeldemartin-solid-utils.esm.js.map +0 -1
- package/dist/noeldemartin-solid-utils.umd.js +0 -90
- package/dist/noeldemartin-solid-utils.umd.js.map +0 -1
- package/noeldemartin.config.js +0 -9
- package/src/main.ts +0 -5
- package/src/plugins/chai/assertions.ts +0 -40
- package/src/plugins/chai/index.ts +0 -5
- package/src/plugins/cypress/types.d.ts +0 -15
- package/src/plugins/index.ts +0 -2
- package/src/plugins/jest/index.ts +0 -5
- package/src/plugins/jest/matchers.ts +0 -65
- package/src/plugins/jest/types.d.ts +0 -14
- package/src/testing/ResponseStub.ts +0 -46
- package/src/testing/mocking.ts +0 -33
package/src/models/index.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { JSError, arrayRemove, pull, stringMatchAll } from '@noeldemartin/utils';
|
|
2
|
-
import type {
|
|
3
|
-
import type { Quad, Quad_Object } from 'rdf-js';
|
|
2
|
+
import type { Quad, Quad_Object } from '@rdfjs/types';
|
|
4
3
|
|
|
5
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
jsonldToQuads,
|
|
6
|
+
quadToTurtle,
|
|
7
|
+
quadsToTurtle,
|
|
8
|
+
sparqlToQuadsSync,
|
|
9
|
+
turtleToQuadsSync,
|
|
10
|
+
} from '@noeldemartin/solid-utils/helpers/io';
|
|
11
|
+
import type { JsonLD } from '@noeldemartin/solid-utils/helpers/jsonld';
|
|
6
12
|
|
|
7
13
|
let patternsRegExpsIndex: Record<string, RegExp> = {};
|
|
8
14
|
const builtInPatterns: Record<string, string> = {
|
|
@@ -19,10 +25,9 @@ class ExpectedQuadAssertionError extends JSError {
|
|
|
19
25
|
|
|
20
26
|
function assertExpectedQuadsExist(expectedQuads: Quad[], actualQuads: Quad[]): void {
|
|
21
27
|
for (const expectedQuad of expectedQuads) {
|
|
22
|
-
const matchingQuad = actualQuads.find(actualQuad => quadEquals(expectedQuad, actualQuad));
|
|
28
|
+
const matchingQuad = actualQuads.find((actualQuad) => quadEquals(expectedQuad, actualQuad));
|
|
23
29
|
|
|
24
|
-
if (!matchingQuad)
|
|
25
|
-
throw new ExpectedQuadAssertionError(expectedQuad);
|
|
30
|
+
if (!matchingQuad) throw new ExpectedQuadAssertionError(expectedQuad);
|
|
26
31
|
|
|
27
32
|
arrayRemove(actualQuads, matchingQuad);
|
|
28
33
|
}
|
|
@@ -34,10 +39,7 @@ function containsPatterns(value: string): boolean {
|
|
|
34
39
|
|
|
35
40
|
function createPatternRegexp(expected: string): RegExp {
|
|
36
41
|
const patternAliases = [];
|
|
37
|
-
const patternMatches = stringMatchAll<4, 1 | 2>(
|
|
38
|
-
expected,
|
|
39
|
-
/\[\[((.*?)\]\[)?([^\]]+)\]\]/g,
|
|
40
|
-
);
|
|
42
|
+
const patternMatches = stringMatchAll<4, 1 | 2>(expected, /\[\[((.*?)\]\[)?([^\]]+)\]\]/g);
|
|
41
43
|
const patterns: string[] = [];
|
|
42
44
|
let expectedRegExp = expected;
|
|
43
45
|
|
|
@@ -65,12 +67,10 @@ function quadValueEquals(expected: string, actual: string): boolean {
|
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
function quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {
|
|
68
|
-
if (expected.termType !== actual.termType)
|
|
69
|
-
return false;
|
|
70
|
+
if (expected.termType !== actual.termType) return false;
|
|
70
71
|
|
|
71
72
|
if (expected.termType === 'Literal' && actual.termType === 'Literal') {
|
|
72
|
-
if (expected.datatype.value !== actual.datatype.value)
|
|
73
|
-
return false;
|
|
73
|
+
if (expected.datatype.value !== actual.datatype.value) return false;
|
|
74
74
|
|
|
75
75
|
if (!containsPatterns(expected.value))
|
|
76
76
|
return expected.datatype.value === 'http://www.w3.org/2001/XMLSchema#dateTime'
|
|
@@ -82,9 +82,11 @@ function quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
function quadEquals(expected: Quad, actual: Quad): boolean {
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
return (
|
|
86
|
+
quadObjectEquals(expected.object, actual.object) &&
|
|
87
|
+
quadValueEquals(expected.subject.value, actual.subject.value) &&
|
|
88
|
+
quadValueEquals(expected.predicate.value, actual.predicate.value)
|
|
89
|
+
);
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
function resetPatterns(): void {
|
|
@@ -119,8 +121,7 @@ export async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<Eq
|
|
|
119
121
|
try {
|
|
120
122
|
assertExpectedQuadsExist(expectedQuads, actualQuads);
|
|
121
123
|
} catch (error) {
|
|
122
|
-
if (!(error instanceof ExpectedQuadAssertionError))
|
|
123
|
-
throw error;
|
|
124
|
+
if (!(error instanceof ExpectedQuadAssertionError)) throw error;
|
|
124
125
|
|
|
125
126
|
return result(false, error.message);
|
|
126
127
|
}
|
|
@@ -137,8 +138,7 @@ export function sparqlEquals(expected: string, actual: string): EqualityResult {
|
|
|
137
138
|
const result = (success: boolean, message: string) => ({ success, message, expected, actual });
|
|
138
139
|
|
|
139
140
|
for (const operation of Object.keys(expectedOperations)) {
|
|
140
|
-
if (!(operation in actualOperations))
|
|
141
|
-
return result(false, `Couldn't find expected ${operation} operation.`);
|
|
141
|
+
if (!(operation in actualOperations)) return result(false, `Couldn't find expected ${operation} operation.`);
|
|
142
142
|
|
|
143
143
|
const expectedQuads = pull(expectedOperations, operation);
|
|
144
144
|
const actualQuads = pull(actualOperations, operation);
|
|
@@ -149,8 +149,7 @@ export function sparqlEquals(expected: string, actual: string): EqualityResult {
|
|
|
149
149
|
try {
|
|
150
150
|
assertExpectedQuadsExist(expectedQuads, actualQuads);
|
|
151
151
|
} catch (error) {
|
|
152
|
-
if (!(error instanceof ExpectedQuadAssertionError))
|
|
153
|
-
throw error;
|
|
152
|
+
if (!(error instanceof ExpectedQuadAssertionError)) throw error;
|
|
154
153
|
|
|
155
154
|
return result(
|
|
156
155
|
false,
|
|
@@ -160,8 +159,7 @@ export function sparqlEquals(expected: string, actual: string): EqualityResult {
|
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;
|
|
163
|
-
if (unexpectedOperation)
|
|
164
|
-
return result(false, `Did not expect to find ${unexpectedOperation} triples.`);
|
|
162
|
+
if (unexpectedOperation) return result(false, `Did not expect to find ${unexpectedOperation} triples.`);
|
|
165
163
|
|
|
166
164
|
return result(true, 'sparql matches');
|
|
167
165
|
}
|
|
@@ -180,8 +178,7 @@ export function turtleEquals(expected: string, actual: string): EqualityResult {
|
|
|
180
178
|
try {
|
|
181
179
|
assertExpectedQuadsExist(expectedQuads, actualQuads);
|
|
182
180
|
} catch (error) {
|
|
183
|
-
if (!(error instanceof ExpectedQuadAssertionError))
|
|
184
|
-
throw error;
|
|
181
|
+
if (!(error instanceof ExpectedQuadAssertionError)) throw error;
|
|
185
182
|
|
|
186
183
|
return result(false, error.message);
|
|
187
184
|
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { sparqlEquals, turtleEquals } from './helpers';
|
|
4
|
+
|
|
5
|
+
describe('Testing helpers', () => {
|
|
6
|
+
|
|
7
|
+
it('Compares sparql', () => {
|
|
8
|
+
// Arrange
|
|
9
|
+
const expected = 'INSERT DATA { <#me> a <http://xmlns.com/foaf/0.1/Person> . }';
|
|
10
|
+
const actual = 'INSERT DATA { <#me> a <http://xmlns.com/foaf/0.1/Person> . }';
|
|
11
|
+
|
|
12
|
+
// Act
|
|
13
|
+
const result = sparqlEquals(expected, actual);
|
|
14
|
+
|
|
15
|
+
// Assert
|
|
16
|
+
expect(result.success).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('Compares sparql operations', () => {
|
|
20
|
+
// Arrange
|
|
21
|
+
const expected = `
|
|
22
|
+
INSERT DATA { <#me> <http://xmlns.com/foaf/0.1/name> "Amy Doe" . } ;
|
|
23
|
+
DELETE DATA { <#me> <http://xmlns.com/foaf/0.1/name> "John Doe" . }
|
|
24
|
+
`;
|
|
25
|
+
const actual = 'INSERT DATA { <#me> <http://xmlns.com/foaf/0.1/name> "Amy Doe" . }';
|
|
26
|
+
|
|
27
|
+
// Act
|
|
28
|
+
const result = sparqlEquals(expected, actual);
|
|
29
|
+
|
|
30
|
+
// Assert
|
|
31
|
+
expect(result.success).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('Compares sparql triples', () => {
|
|
35
|
+
// Arrange
|
|
36
|
+
const expected = 'INSERT DATA { <#me> a <http://xmlns.com/foaf/0.1/Person> . }';
|
|
37
|
+
const actual = 'INSERT DATA { <#me> <http://xmlns.com/foaf/0.1/name> "Amy Doe" . }';
|
|
38
|
+
|
|
39
|
+
// Act
|
|
40
|
+
const result = sparqlEquals(expected, actual);
|
|
41
|
+
|
|
42
|
+
// Assert
|
|
43
|
+
expect(result.success).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('Compares expanded ordered lists in Turtle', () => {
|
|
47
|
+
// Arrange
|
|
48
|
+
const expected = `
|
|
49
|
+
@prefix schema: <https://schema.org/> .
|
|
50
|
+
|
|
51
|
+
<#ramen>
|
|
52
|
+
a schema:Recipe ;
|
|
53
|
+
schema:name "Ramen" ;
|
|
54
|
+
schema:recipeIngredient ( "Broth" "Noodles" ) .
|
|
55
|
+
`;
|
|
56
|
+
const actual = `
|
|
57
|
+
@prefix schema: <https://schema.org/> .
|
|
58
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
|
59
|
+
|
|
60
|
+
<#ramen>
|
|
61
|
+
a schema:Recipe ;
|
|
62
|
+
schema:name "Ramen" ;
|
|
63
|
+
schema:recipeIngredient _:b0 .
|
|
64
|
+
|
|
65
|
+
_:b0
|
|
66
|
+
rdf:first "Broth" ;
|
|
67
|
+
rdf:rest _:b1 .
|
|
68
|
+
|
|
69
|
+
_:b1
|
|
70
|
+
rdf:first "Noodles" ;
|
|
71
|
+
rdf:rest rdf:nil .
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
// Act
|
|
75
|
+
const result = turtleEquals(expected, actual);
|
|
76
|
+
|
|
77
|
+
// Assert
|
|
78
|
+
expect(result.success).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('Compares different ordered lists in Turtle', () => {
|
|
82
|
+
// Arrange
|
|
83
|
+
const expected = `
|
|
84
|
+
@prefix schema: <https://schema.org/> .
|
|
85
|
+
|
|
86
|
+
<#ramen>
|
|
87
|
+
a schema:Recipe ;
|
|
88
|
+
schema:name "Ramen" ;
|
|
89
|
+
schema:recipeIngredient ( "Broth" "Noodles" ) .
|
|
90
|
+
`;
|
|
91
|
+
const actual = `
|
|
92
|
+
@prefix schema: <https://schema.org/> .
|
|
93
|
+
|
|
94
|
+
<#ramen>
|
|
95
|
+
a schema:Recipe ;
|
|
96
|
+
schema:name "Ramen" ;
|
|
97
|
+
schema:recipeIngredient ( "Noodles" "Broth" ) .
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
// Act
|
|
101
|
+
const result = turtleEquals(expected, actual);
|
|
102
|
+
|
|
103
|
+
// Assert
|
|
104
|
+
expect(result.success).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('Compares different unordered lists in Turtle', () => {
|
|
108
|
+
// Arrange
|
|
109
|
+
const expected = `
|
|
110
|
+
@prefix schema: <https://schema.org/> .
|
|
111
|
+
|
|
112
|
+
<#ramen>
|
|
113
|
+
a schema:Recipe ;
|
|
114
|
+
schema:name "Ramen" ;
|
|
115
|
+
schema:recipeIngredient "Broth", "Noodles" .
|
|
116
|
+
`;
|
|
117
|
+
const actual = `
|
|
118
|
+
@prefix schema: <https://schema.org/> .
|
|
119
|
+
|
|
120
|
+
<#ramen>
|
|
121
|
+
a schema:Recipe ;
|
|
122
|
+
schema:name "Ramen" ;
|
|
123
|
+
schema:recipeIngredient "Noodles", "Broth" .
|
|
124
|
+
`;
|
|
125
|
+
|
|
126
|
+
// Act
|
|
127
|
+
const result = turtleEquals(expected, actual);
|
|
128
|
+
|
|
129
|
+
// Assert
|
|
130
|
+
expect(result.success).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('Compares sparql using regex patterns', () => {
|
|
134
|
+
// Arrange
|
|
135
|
+
const expected = `
|
|
136
|
+
INSERT DATA {
|
|
137
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
138
|
+
@prefix foaf: <http://xmlns.com/foaf/> .
|
|
139
|
+
@prefix purl: <http://purl.org/dc/terms/> .
|
|
140
|
+
|
|
141
|
+
<#me>
|
|
142
|
+
foaf:name "[[.*]] Doe" ;
|
|
143
|
+
foaf:age 42 .
|
|
144
|
+
|
|
145
|
+
<#something-[[.*]]>
|
|
146
|
+
purl:created "[[.*]]"^^xsd:dateTime ;
|
|
147
|
+
purl:modified "2021-01-16T[[.*]]"^^xsd:dateTime ;
|
|
148
|
+
purl:available "2021-01-16T12:34:56Z"^^xsd:dateTime .
|
|
149
|
+
}
|
|
150
|
+
`;
|
|
151
|
+
const actual = `
|
|
152
|
+
INSERT DATA {
|
|
153
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
154
|
+
@prefix foaf: <http://xmlns.com/foaf/> .
|
|
155
|
+
@prefix purl: <http://purl.org/dc/terms/> .
|
|
156
|
+
|
|
157
|
+
<#me>
|
|
158
|
+
foaf:name "John Doe" ;
|
|
159
|
+
foaf:age 42 .
|
|
160
|
+
|
|
161
|
+
<#something-123456>
|
|
162
|
+
purl:created "2021-01-16T12:12:50.123Z"^^xsd:dateTime ;
|
|
163
|
+
purl:modified "2021-01-16T12:12:50.123Z"^^xsd:dateTime ;
|
|
164
|
+
purl:available "2021-01-16T12:34:56.000Z"^^xsd:dateTime .
|
|
165
|
+
}
|
|
166
|
+
`;
|
|
167
|
+
|
|
168
|
+
// Act
|
|
169
|
+
const result = sparqlEquals(expected, actual);
|
|
170
|
+
|
|
171
|
+
// Assert
|
|
172
|
+
expect(result.success).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('supports aliases in regex patterns', () => {
|
|
176
|
+
// Arrange
|
|
177
|
+
const expected = `
|
|
178
|
+
@prefix schema: <https://schema.org/> .
|
|
179
|
+
|
|
180
|
+
<#ramen>
|
|
181
|
+
a schema:Recipe ;
|
|
182
|
+
schema:name "Ramen" ;
|
|
183
|
+
schema:recipeInstructions <#[[step-1][.*]]>, <#[[step-2][.*]]> .
|
|
184
|
+
|
|
185
|
+
<#[[step-1][.*]]>
|
|
186
|
+
a schema:HowToStep ;
|
|
187
|
+
schema:text "Boil the noodles" .
|
|
188
|
+
|
|
189
|
+
<#[[step-2][.*]]>
|
|
190
|
+
a schema:HowToStep ;
|
|
191
|
+
schema:text "Dip them into the broth" .
|
|
192
|
+
`;
|
|
193
|
+
const actual = `
|
|
194
|
+
@prefix schema: <https://schema.org/> .
|
|
195
|
+
|
|
196
|
+
<#ramen>
|
|
197
|
+
a schema:Recipe ;
|
|
198
|
+
schema:name "Ramen" ;
|
|
199
|
+
schema:recipeInstructions <#ramen-step-1>, <#ramen-step-2> .
|
|
200
|
+
|
|
201
|
+
<#ramen-step-1>
|
|
202
|
+
a schema:HowToStep ;
|
|
203
|
+
schema:text "Boil the noodles" .
|
|
204
|
+
|
|
205
|
+
<#ramen-step-2>
|
|
206
|
+
a schema:HowToStep ;
|
|
207
|
+
schema:text "Dip them into the broth" .
|
|
208
|
+
`;
|
|
209
|
+
|
|
210
|
+
// Act
|
|
211
|
+
const result = turtleEquals(expected, actual);
|
|
212
|
+
|
|
213
|
+
// Assert
|
|
214
|
+
expect(result.success).toBe(true);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('counts matching triples only once', () => {
|
|
218
|
+
// Arrange
|
|
219
|
+
const expected = `
|
|
220
|
+
@prefix schema: <https://schema.org/> .
|
|
221
|
+
|
|
222
|
+
<#ramen>
|
|
223
|
+
a schema:Recipe ;
|
|
224
|
+
schema:name "Ramen", "Ramen" .
|
|
225
|
+
`;
|
|
226
|
+
const actual = `
|
|
227
|
+
@prefix schema: <https://schema.org/> .
|
|
228
|
+
|
|
229
|
+
<#ramen>
|
|
230
|
+
a schema:Recipe ;
|
|
231
|
+
schema:name "Ramen" ;
|
|
232
|
+
schema:description "is life" .
|
|
233
|
+
`;
|
|
234
|
+
|
|
235
|
+
// Act
|
|
236
|
+
const result = turtleEquals(expected, actual);
|
|
237
|
+
|
|
238
|
+
// Assert
|
|
239
|
+
expect(result.success).toBe(false);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('allows regex patterns to be mixed up', () => {
|
|
243
|
+
// Arrange
|
|
244
|
+
const expected = `
|
|
245
|
+
@prefix schema: <https://schema.org/> .
|
|
246
|
+
|
|
247
|
+
<#[[instruction-1][.*]]-operation-[[operation-1][.*]]> schema:object <#[[instruction-1][.*]]> .
|
|
248
|
+
<#[[instruction-1][.*]]-metadata> schema:object <#[[instruction-1][.*]]> .
|
|
249
|
+
`;
|
|
250
|
+
const actual = `
|
|
251
|
+
@prefix schema: <https://schema.org/> .
|
|
252
|
+
|
|
253
|
+
<#ramen-step-1-metadata> schema:object <#ramen> .
|
|
254
|
+
<#ramen-step-1-operation-1> schema:object <#ramen> .
|
|
255
|
+
`;
|
|
256
|
+
|
|
257
|
+
// Act
|
|
258
|
+
const result = turtleEquals(expected, actual);
|
|
259
|
+
|
|
260
|
+
// Assert
|
|
261
|
+
expect(result.success).toBe(true);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('matches built-in patterns', () => {
|
|
265
|
+
// Arrange
|
|
266
|
+
const expected = `
|
|
267
|
+
@prefix schema: <https://schema.org/> .
|
|
268
|
+
|
|
269
|
+
<#[[foobar][%uuid%]]> schema:description "Lorem ipsum" .
|
|
270
|
+
<#[[%uuid%]]> schema:description "Dolor sit amet" .
|
|
271
|
+
`;
|
|
272
|
+
const actual = `
|
|
273
|
+
@prefix schema: <https://schema.org/> .
|
|
274
|
+
|
|
275
|
+
<#20421db7-0c7d-419c-b27e-2c9b3cc026b3> schema:description "Lorem ipsum" .
|
|
276
|
+
<#d4b41533-dd5d-4a66-9d3f-316f80f135b2> schema:description "Dolor sit amet" .
|
|
277
|
+
`;
|
|
278
|
+
|
|
279
|
+
// Act
|
|
280
|
+
const result = turtleEquals(expected, actual);
|
|
281
|
+
|
|
282
|
+
// Assert
|
|
283
|
+
expect(result.success).toBe(true);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// TODO
|
|
287
|
+
it.skip('aliases match regex patterns', () => {
|
|
288
|
+
// Arrange
|
|
289
|
+
const expected = `
|
|
290
|
+
@prefix schema: <https://schema.org/> .
|
|
291
|
+
|
|
292
|
+
<#ramen>
|
|
293
|
+
a schema:Recipe ;
|
|
294
|
+
schema:name "Ramen" ;
|
|
295
|
+
schema:recipeInstructions <#[[step-1][.*]]>, <#[[step-2][.*]]> .
|
|
296
|
+
|
|
297
|
+
<#[[step-1][.*]]>
|
|
298
|
+
a schema:HowToStep ;
|
|
299
|
+
schema:text "Boil the noodles" .
|
|
300
|
+
|
|
301
|
+
<#[[step-2][.*]]>
|
|
302
|
+
a schema:HowToStep ;
|
|
303
|
+
schema:text "Dip them into the broth" .
|
|
304
|
+
`;
|
|
305
|
+
const actual = `
|
|
306
|
+
@prefix schema: <https://schema.org/> .
|
|
307
|
+
|
|
308
|
+
<#ramen>
|
|
309
|
+
a schema:Recipe ;
|
|
310
|
+
schema:name "Ramen" ;
|
|
311
|
+
schema:recipeInstructions <#ramen-step-1>, <#ramen-step-2> .
|
|
312
|
+
|
|
313
|
+
<#ramen-step-1>
|
|
314
|
+
a schema:HowToStep ;
|
|
315
|
+
schema:text "Boil the noodles" .
|
|
316
|
+
|
|
317
|
+
<#ramen-step-3>
|
|
318
|
+
a schema:HowToStep ;
|
|
319
|
+
schema:text "Dip them into the broth" .
|
|
320
|
+
`;
|
|
321
|
+
|
|
322
|
+
// Act
|
|
323
|
+
const result = turtleEquals(expected, actual);
|
|
324
|
+
|
|
325
|
+
// Assert
|
|
326
|
+
expect(result.success).toBe(false);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
});
|
package/src/testing/index.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export { default as ResponseStub } from './ResponseStub';
|
|
1
|
+
export * from './helpers';
|
package/src/types/n3.d.ts
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import matchers from './matchers';
|
|
4
|
+
|
|
5
|
+
export type VitestSolidMatchers<R = unknown> = {
|
|
6
|
+
[K in keyof typeof matchers]: (
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
...args: Parameters<(typeof matchers)[K]> extends [any, ...infer Rest] ? Rest : never
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
) => ReturnType<(typeof matchers)[K]> extends Promise<any> ? Promise<R> : R;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function installVitestSolidMatchers(): void {
|
|
14
|
+
expect.extend(matchers);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare module '@vitest/expect' {
|
|
18
|
+
interface Assertion<T> extends VitestSolidMatchers<T> {}
|
|
19
|
+
interface AsymmetricMatchersContaining extends VitestSolidMatchers {}
|
|
20
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MatcherState, MatchersObject } from '@vitest/expect';
|
|
2
|
+
|
|
3
|
+
import { normalizeSparql, normalizeTurtle } from '@noeldemartin/solid-utils/helpers/io';
|
|
4
|
+
import { jsonldEquals, sparqlEquals, turtleEquals } from '@noeldemartin/solid-utils/testing/helpers';
|
|
5
|
+
import type { EqualityResult } from '@noeldemartin/solid-utils/testing/helpers';
|
|
6
|
+
import type { JsonLD } from '@noeldemartin/solid-utils/helpers';
|
|
7
|
+
|
|
8
|
+
interface FormatResultOptions {
|
|
9
|
+
state: MatcherState;
|
|
10
|
+
hint: string;
|
|
11
|
+
expected: unknown;
|
|
12
|
+
received: unknown;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function formatResult(result: EqualityResult, options: FormatResultOptions) {
|
|
16
|
+
const pass = result.success;
|
|
17
|
+
const utils = options.state.utils;
|
|
18
|
+
const message = pass
|
|
19
|
+
? () => [result.message, utils.matcherHint(options.hint)].join('\n\n')
|
|
20
|
+
: () =>
|
|
21
|
+
[
|
|
22
|
+
result.message,
|
|
23
|
+
utils.matcherHint(options.hint),
|
|
24
|
+
[
|
|
25
|
+
`Expected: not ${utils.printExpected(options.expected)}`,
|
|
26
|
+
`Received: ${utils.printReceived(options.received)}`,
|
|
27
|
+
].join('\n'),
|
|
28
|
+
].join('\n\n');
|
|
29
|
+
|
|
30
|
+
return { pass, message };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function defineMatchers<T extends MatchersObject>(matchers: T): T {
|
|
34
|
+
return matchers;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default defineMatchers({
|
|
38
|
+
async toEqualJsonLD(received, expected: JsonLD) {
|
|
39
|
+
const result = await jsonldEquals(expected, received);
|
|
40
|
+
|
|
41
|
+
return formatResult(result, {
|
|
42
|
+
state: this,
|
|
43
|
+
hint: 'toEqualJsonLD',
|
|
44
|
+
expected,
|
|
45
|
+
received,
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
toEqualSparql(received, expected: string) {
|
|
49
|
+
const result = sparqlEquals(expected, received);
|
|
50
|
+
|
|
51
|
+
return formatResult(result, {
|
|
52
|
+
state: this,
|
|
53
|
+
hint: 'toEqualSparql',
|
|
54
|
+
expected: normalizeSparql(expected),
|
|
55
|
+
received: normalizeSparql(received),
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
toEqualTurtle(received, expected: string) {
|
|
59
|
+
const result = turtleEquals(expected, received);
|
|
60
|
+
|
|
61
|
+
return formatResult(result, {
|
|
62
|
+
state: this,
|
|
63
|
+
hint: 'toEqualTurtle',
|
|
64
|
+
expected: normalizeTurtle(expected),
|
|
65
|
+
received: normalizeTurtle(received),
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
});
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on: [push, pull_request]
|
|
4
|
-
|
|
5
|
-
jobs:
|
|
6
|
-
ci:
|
|
7
|
-
runs-on: ubuntu-latest
|
|
8
|
-
steps:
|
|
9
|
-
- uses: actions/checkout@v3
|
|
10
|
-
- uses: actions/setup-node@v3
|
|
11
|
-
with:
|
|
12
|
-
node-version-file: '.nvmrc'
|
|
13
|
-
- run: npm ci
|
|
14
|
-
- run: npm run build
|
|
15
|
-
- run: npm run lint
|
|
16
|
-
- run: npm run test
|
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
v16
|
package/CHANGELOG.md
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
-
|
|
7
|
-
## [v0.5.0](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.5.0) - 2025-01-05
|
|
8
|
-
|
|
9
|
-
### Added
|
|
10
|
-
|
|
11
|
-
- `ldp:` prefix.
|
|
12
|
-
- `toEqualTurtle` matcher.
|
|
13
|
-
|
|
14
|
-
### Fixed
|
|
15
|
-
|
|
16
|
-
- Parsing JsonLD with anonymous subjects (meaning subjects with ids such as `#it`, without a full url).
|
|
17
|
-
|
|
18
|
-
### Changed
|
|
19
|
-
|
|
20
|
-
- `@types/rdf-js` dependency for `@rdfjs/types`.
|
|
21
|
-
- Many of the `fetch*` helpers now take an options object instead of a `fetch` method.
|
|
22
|
-
- Disabled caching when reading user profiles, in order to fix an issue with CSS v7.1.3 (See [CommunitySolidServer/CommunitySolidServer#1972](https://github.com/CommunitySolidServer/CommunitySolidServer/issues/1972)).
|
|
23
|
-
|
|
24
|
-
### Removed
|
|
25
|
-
|
|
26
|
-
- Faking helpers have been extracted into `@noeldemartin/testing` in order to avoid including them (and the `faker` dependency) on production bundles.
|
|
27
|
-
|
|
28
|
-
## [v0.4.0](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.4.0) - 2023-12-17
|
|
29
|
-
|
|
30
|
-
### Changed
|
|
31
|
-
|
|
32
|
-
- Retrieving user profiles will now fail if no storage urls are found. In reality, this is only an improvement for the TypeScript types since [according to the spec](https://solidproject.org/TR/protocol#storage-resource) this should never happen.
|
|
33
|
-
|
|
34
|
-
### Deprecated
|
|
35
|
-
|
|
36
|
-
- Interoperability helpers such as `createPublicTypeIndex`, `createPrivateTypeIndex`, `findContainerRegistrations`, and `findInstanceRegistrations`. Use [soukai-solid interoperability helpers](https://github.com/noeldemartin/soukai-solid#interoperability) instead.
|
|
37
|
-
|
|
38
|
-
### Removed
|
|
39
|
-
|
|
40
|
-
- Required jest dependencies. This was previously causing some problems using other test runners like [Vitest](https://vitest.dev/).
|
|
41
|
-
|
|
42
|
-
## [v0.3.0](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.3.0) - 2023-03-10
|
|
43
|
-
|
|
44
|
-
### Fixed
|
|
45
|
-
|
|
46
|
-
- Tree-shaking by declaring `"sideEffects": false`.
|
|
47
|
-
|
|
48
|
-
### Changed
|
|
49
|
-
|
|
50
|
-
- `fetchLoginUserProfile` now takes an options object instead of an optional fetch function.
|
|
51
|
-
|
|
52
|
-
## [v0.2.0](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.2.0) - 2023-01-20
|
|
53
|
-
|
|
54
|
-
### Added
|
|
55
|
-
|
|
56
|
-
- `rdf:` prefix for `http://www.w3.org/1999/02/22-rdf-syntax-ns#` (previously was `rdfs:`).
|
|
57
|
-
|
|
58
|
-
### Changed
|
|
59
|
-
|
|
60
|
-
- The `rdfs:` has been changed to be `http://www.w3.org/2000/01/rdf-schema#`.
|
|
61
|
-
|
|
62
|
-
## [v0.1.1](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.1.1) - 2021-09-04
|
|
63
|
-
|
|
64
|
-
No documented changes.
|
|
65
|
-
|
|
66
|
-
## [v0.1.0](https://github.com/NoelDeMartin/solid-utils/releases/tag/v0.1.0) - 2021-09-04
|
|
67
|
-
|
|
68
|
-
### Added
|
|
69
|
-
|
|
70
|
-
- Everything!
|