@jrpool/kilotest 46.0.2 → 46.0.3
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/openapi.yaml +18 -18
- package/package.json +1 -1
- package/test/fixtures/buildFixtures.js +244 -0
- package/test/fixtures/db/jobs/recs.json +1 -0
- package/test/fixtures/db/reports/260101T0000-mix.json +126 -0
- package/test/fixtures/db/reports/260101T0001-ct.json +69 -0
- package/test/fixtures/db/reports/260101T0002-no.json +68 -0
- package/test/fixtures/db/reports/260101T0005-emp.json +46 -0
- package/test/fixtures/db/reports/260101T0006-prv.json +71 -0
- package/test/fixtures/db/reports/260202T0000-new.json +80 -0
package/openapi.yaml
CHANGED
|
@@ -254,9 +254,9 @@ paths:
|
|
|
254
254
|
type: object
|
|
255
255
|
properties:
|
|
256
256
|
name:
|
|
257
|
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
257
|
+
type:
|
|
258
|
+
- string
|
|
259
|
+
- 'null'
|
|
260
260
|
reason for failure:
|
|
261
261
|
description: Copied verbatim from the Testaro report; shape may vary.
|
|
262
262
|
required:
|
|
@@ -266,9 +266,9 @@ paths:
|
|
|
266
266
|
names of rule engines that reported rule violations:
|
|
267
267
|
type: array
|
|
268
268
|
items:
|
|
269
|
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
269
|
+
type:
|
|
270
|
+
- string
|
|
271
|
+
- 'null'
|
|
272
272
|
counts of issues by priority:
|
|
273
273
|
type: object
|
|
274
274
|
properties:
|
|
@@ -782,9 +782,9 @@ paths:
|
|
|
782
782
|
type: object
|
|
783
783
|
properties:
|
|
784
784
|
size of the report in bytes:
|
|
785
|
-
|
|
786
|
-
-
|
|
787
|
-
-
|
|
785
|
+
type:
|
|
786
|
+
- number
|
|
787
|
+
- string
|
|
788
788
|
full report:
|
|
789
789
|
description: The full raw Testaro/Testilo report JSON, copied verbatim, or an error object if it could not be retrieved.
|
|
790
790
|
required:
|
|
@@ -1224,9 +1224,9 @@ components:
|
|
|
1224
1224
|
type: string
|
|
1225
1225
|
description: URL of the equivalent web UI page for this request.
|
|
1226
1226
|
closest ancestor request:
|
|
1227
|
-
|
|
1228
|
-
-
|
|
1229
|
-
-
|
|
1227
|
+
type:
|
|
1228
|
+
- string
|
|
1229
|
+
- 'null'
|
|
1230
1230
|
required:
|
|
1231
1231
|
- this request
|
|
1232
1232
|
- closest ancestor request
|
|
@@ -1290,13 +1290,13 @@ components:
|
|
|
1290
1290
|
identifier:
|
|
1291
1291
|
type: string
|
|
1292
1292
|
name:
|
|
1293
|
-
|
|
1294
|
-
-
|
|
1295
|
-
-
|
|
1293
|
+
type:
|
|
1294
|
+
- string
|
|
1295
|
+
- 'null'
|
|
1296
1296
|
sponsor:
|
|
1297
|
-
|
|
1298
|
-
-
|
|
1299
|
-
-
|
|
1297
|
+
type:
|
|
1298
|
+
- string
|
|
1299
|
+
- 'null'
|
|
1300
1300
|
required:
|
|
1301
1301
|
- identifier
|
|
1302
1302
|
- name
|
package/package.json
CHANGED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*
|
|
2
|
+
buildFixtures.js
|
|
3
|
+
Builds the fixture corpus for Kilotest tests.
|
|
4
|
+
|
|
5
|
+
Each fixture is a minimal Testaro report in the current format, crafted so
|
|
6
|
+
that the expected API response can be hand-computed and hard-coded into
|
|
7
|
+
tests. The fixtures collectively cover the `outcome` property values
|
|
8
|
+
(`failed`, `cantTell`, and missing/undefined), superseded reports, empty
|
|
9
|
+
reports, and prevented rule engines.
|
|
10
|
+
|
|
11
|
+
Run with: node test/fixtures/buildFixtures.js [targetDir]
|
|
12
|
+
Defaults to test/fixtures/db under the project root.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// IMPORTS
|
|
16
|
+
|
|
17
|
+
const fs = require('fs/promises');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
|
|
20
|
+
// CONSTANTS
|
|
21
|
+
|
|
22
|
+
// Issue IDs with known specs in testaro-issues, chosen for different weights.
|
|
23
|
+
const ISSUE_LINK_NO_TEXT = 'linkNoText'; // weight 4 (highest)
|
|
24
|
+
const ISSUE_FOCUS_INDICATION = 'focusIndicationBad'; // weight 4
|
|
25
|
+
const ISSUE_ALL_CAPS = 'allCaps'; // weight 1 (lowest)
|
|
26
|
+
|
|
27
|
+
// Rule engine IDs that exist in util.js ruleEngines.
|
|
28
|
+
const ENGINE_AXE = 'axe';
|
|
29
|
+
const ENGINE_ALFA = 'alfa';
|
|
30
|
+
const ENGINE_IBM = 'ibm';
|
|
31
|
+
|
|
32
|
+
// FUNCTIONS
|
|
33
|
+
|
|
34
|
+
// Returns a minimal catalog item.
|
|
35
|
+
const catalogItem = (tagName, text, pathID = '/html', boxID = '0:0:100:50') => ({
|
|
36
|
+
tagName,
|
|
37
|
+
id: '',
|
|
38
|
+
startTag: `<${tagName.toLowerCase()}>`,
|
|
39
|
+
text,
|
|
40
|
+
textLinkable: false,
|
|
41
|
+
boxID,
|
|
42
|
+
pathID,
|
|
43
|
+
headingIndex: '',
|
|
44
|
+
checkpoint: 0
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Returns a minimal standard instance.
|
|
48
|
+
const instance = (
|
|
49
|
+
ruleID, what, outcome, issueID, catalogIndex, ordinalSeverity = 2, count = 1
|
|
50
|
+
) => ({
|
|
51
|
+
ruleID,
|
|
52
|
+
what,
|
|
53
|
+
ordinalSeverity,
|
|
54
|
+
outcome,
|
|
55
|
+
count,
|
|
56
|
+
catalogIndex: String(catalogIndex),
|
|
57
|
+
checkpoint: 0,
|
|
58
|
+
issueID
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Returns a minimal test act.
|
|
62
|
+
const testAct = (which, instances) => ({
|
|
63
|
+
type: 'test',
|
|
64
|
+
which,
|
|
65
|
+
startTime: '26-01-01T00:00',
|
|
66
|
+
endTime: '26-01-01T00:01',
|
|
67
|
+
result: {
|
|
68
|
+
standardResult: {
|
|
69
|
+
instances,
|
|
70
|
+
outcomeTotals: {
|
|
71
|
+
failed: instances.filter(i => i.outcome === 'failed').length,
|
|
72
|
+
cantTell: instances.filter(i => i.outcome === 'cantTell').length
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Returns a minimal valid report.
|
|
79
|
+
const report = (id, what, url, acts, catalog, endTime = '26-01-01T00:10') => ({
|
|
80
|
+
id,
|
|
81
|
+
what,
|
|
82
|
+
strict: false,
|
|
83
|
+
standard: 'only',
|
|
84
|
+
device: {id: 'default'},
|
|
85
|
+
browserID: 'chromium',
|
|
86
|
+
creationTimeStamp: id.slice(0, 11),
|
|
87
|
+
executionTimeStamp: id.slice(0, 11),
|
|
88
|
+
target: {what, url},
|
|
89
|
+
sources: {worker: 'test-worker'},
|
|
90
|
+
acts,
|
|
91
|
+
jobData: {
|
|
92
|
+
startTime: '26-01-01T00:00',
|
|
93
|
+
endTime,
|
|
94
|
+
elapsedSeconds: 600,
|
|
95
|
+
preventions: {},
|
|
96
|
+
issuelessRules: []
|
|
97
|
+
},
|
|
98
|
+
catalog,
|
|
99
|
+
images: {},
|
|
100
|
+
checkpoints: []
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Writes a JSON file with a trailing newline.
|
|
104
|
+
const writeJSON = async (filePath, object) => {
|
|
105
|
+
await fs.writeFile(filePath, `${JSON.stringify(object, null, 2)}\n`);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// MAIN
|
|
109
|
+
|
|
110
|
+
const main = async () => {
|
|
111
|
+
const targetDir = process.argv[2] || path.join(__dirname, 'db');
|
|
112
|
+
const reportsDir = path.join(targetDir, 'reports');
|
|
113
|
+
await fs.mkdir(reportsDir, {recursive: true});
|
|
114
|
+
await fs.mkdir(path.join(targetDir, 'jobs', 'queue'), {recursive: true});
|
|
115
|
+
await fs.mkdir(path.join(targetDir, 'jobs', 'claimed'), {recursive: true});
|
|
116
|
+
await fs.mkdir(path.join(targetDir, 'jobs', 'failed'), {recursive: true});
|
|
117
|
+
await fs.mkdir(path.join(targetDir, 'hiddenReports'), {recursive: true});
|
|
118
|
+
|
|
119
|
+
// Fixture 1: mixedOutcomes
|
|
120
|
+
// Two rule engines, three instances: one failed, one cantTell, one failed.
|
|
121
|
+
// The cantTell instance must be excluded from issue/violator counts.
|
|
122
|
+
// Two distinct issues (linkNoText weight 4, allCaps weight 1) and two
|
|
123
|
+
// distinct violator catalog indexes (0 and 1).
|
|
124
|
+
const mixedCatalog = {
|
|
125
|
+
'0': catalogItem('A', 'About Us', '/html/body/a[1]', '10:20:80:30'),
|
|
126
|
+
'1': catalogItem('P', 'ALL ABOUT US', '/html/body/p[1]', '10:60:80:20')
|
|
127
|
+
};
|
|
128
|
+
const mixedActs = [
|
|
129
|
+
testAct(ENGINE_AXE, [
|
|
130
|
+
instance('r11', 'The link does not have an accessible name', 'failed',
|
|
131
|
+
ISSUE_LINK_NO_TEXT, 0, 2, 1),
|
|
132
|
+
instance('r65', 'Focus Visible', 'cantTell',
|
|
133
|
+
ISSUE_FOCUS_INDICATION, 0, 0, 1)
|
|
134
|
+
]),
|
|
135
|
+
testAct(ENGINE_ALFA, [
|
|
136
|
+
instance('r11', 'The link does not have an accessible name', 'failed',
|
|
137
|
+
ISSUE_LINK_NO_TEXT, 0, 2, 1),
|
|
138
|
+
instance('r3', 'Text is all-capital', 'failed',
|
|
139
|
+
ISSUE_ALL_CAPS, 1, 1, 1)
|
|
140
|
+
])
|
|
141
|
+
];
|
|
142
|
+
await writeJSON(
|
|
143
|
+
path.join(reportsDir, '260101T0000-mix.json'),
|
|
144
|
+
report('260101T0000-mix', 'Mixed Outcomes Page',
|
|
145
|
+
'https://example.com/mixed', mixedActs, mixedCatalog)
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Fixture 2: allCantTell
|
|
149
|
+
// All instances have outcome cantTell, so no issues or violators should be
|
|
150
|
+
// reported by listIssues, listViolators, or listDiagnoses.
|
|
151
|
+
const cantTellCatalog = {
|
|
152
|
+
'0': catalogItem('A', 'Click here', '/html/body/a[1]', '5:10:60:20')
|
|
153
|
+
};
|
|
154
|
+
const cantTellActs = [
|
|
155
|
+
testAct(ENGINE_AXE, [
|
|
156
|
+
instance('r65', 'Focus Visible', 'cantTell',
|
|
157
|
+
ISSUE_FOCUS_INDICATION, 0, 0, 1)
|
|
158
|
+
])
|
|
159
|
+
];
|
|
160
|
+
await writeJSON(
|
|
161
|
+
path.join(reportsDir, '260101T0001-ct.json'),
|
|
162
|
+
report('260101T0001-ct', 'All CantTell Page',
|
|
163
|
+
'https://example.com/canttell', cantTellActs, cantTellCatalog)
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
// Fixture 3: noOutcomes
|
|
167
|
+
// Instances with no outcome property. Testaro defaults to 'failed', but
|
|
168
|
+
// Kilotest code checks `outcome !== 'cantTell'`, so missing outcome (undefined)
|
|
169
|
+
// is treated as a violation. This verifies that behavior.
|
|
170
|
+
const noOutcomeCatalog = {
|
|
171
|
+
'0': catalogItem('BUTTON', 'Submit', '/html/body/button[1]', '15:25:70:30')
|
|
172
|
+
};
|
|
173
|
+
const noOutcomeActs = [
|
|
174
|
+
testAct(ENGINE_IBM, [
|
|
175
|
+
{
|
|
176
|
+
ruleID: 'r1',
|
|
177
|
+
what: 'Button has no accessible name',
|
|
178
|
+
ordinalSeverity: 3,
|
|
179
|
+
count: 1,
|
|
180
|
+
catalogIndex: '0',
|
|
181
|
+
checkpoint: 0,
|
|
182
|
+
issueID: ISSUE_LINK_NO_TEXT
|
|
183
|
+
}
|
|
184
|
+
])
|
|
185
|
+
];
|
|
186
|
+
await writeJSON(
|
|
187
|
+
path.join(reportsDir, '260101T0002-no.json'),
|
|
188
|
+
report('260101T0002-no', 'No Outcomes Page',
|
|
189
|
+
'https://example.com/nooutcomes', noOutcomeActs, noOutcomeCatalog)
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
// Fixture 4: superseded
|
|
193
|
+
// A report about the same page as mixedOutcomes but with a later timestamp,
|
|
194
|
+
// so mixedOutcomes is superseded by this one.
|
|
195
|
+
const newerActs = [
|
|
196
|
+
testAct(ENGINE_AXE, [
|
|
197
|
+
instance('r11', 'The link does not have an accessible name', 'failed',
|
|
198
|
+
ISSUE_LINK_NO_TEXT, 0, 2, 1)
|
|
199
|
+
])
|
|
200
|
+
];
|
|
201
|
+
await writeJSON(
|
|
202
|
+
path.join(reportsDir, '260202T0000-new.json'),
|
|
203
|
+
report('260202T0000-new', 'Mixed Outcomes Page',
|
|
204
|
+
'https://example.com/mixed', newerActs, mixedCatalog, '26-02-02T00:10')
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
// Fixture 5: empty
|
|
208
|
+
// A valid report with no test acts that have instances, so listIssues
|
|
209
|
+
// returns zero issues.
|
|
210
|
+
await writeJSON(
|
|
211
|
+
path.join(reportsDir, '260101T0005-emp.json'),
|
|
212
|
+
report('260101T0005-emp', 'Empty Results Page',
|
|
213
|
+
'https://example.com/empty', [testAct(ENGINE_AXE, [])], {})
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
// Fixture 6: prevented
|
|
217
|
+
// A report where one rule engine was prevented from testing.
|
|
218
|
+
const preventedCatalog = {
|
|
219
|
+
'0': catalogItem('IMG', 'An image', '/html/body/img[1]', '0:0:200:100')
|
|
220
|
+
};
|
|
221
|
+
const preventedActs = [
|
|
222
|
+
testAct(ENGINE_AXE, [
|
|
223
|
+
instance('r11', 'The image has no alt text', 'failed',
|
|
224
|
+
ISSUE_LINK_NO_TEXT, 0, 2, 1)
|
|
225
|
+
])
|
|
226
|
+
];
|
|
227
|
+
const preventedReport = report('260101T0006-prv', 'Prevented Page',
|
|
228
|
+
'https://example.com/prevented', preventedActs, preventedCatalog);
|
|
229
|
+
preventedReport.jobData.preventions = {alfa: 'page timed out'};
|
|
230
|
+
await writeJSON(
|
|
231
|
+
path.join(reportsDir, '260101T0006-prv.json'),
|
|
232
|
+
preventedReport
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
// Write an empty recs.json so getRecs does not try to create one.
|
|
236
|
+
await writeJSON(path.join(targetDir, 'jobs', 'recs.json'), {});
|
|
237
|
+
|
|
238
|
+
console.log(`Fixtures built in ${targetDir}`);
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
main().catch(error => {
|
|
242
|
+
console.error(error);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260101T0000-mix",
|
|
3
|
+
"what": "Mixed Outcomes Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260101T0000",
|
|
11
|
+
"executionTimeStamp": "260101T0000",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "Mixed Outcomes Page",
|
|
14
|
+
"url": "https://example.com/mixed"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "axe",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [
|
|
28
|
+
{
|
|
29
|
+
"ruleID": "r11",
|
|
30
|
+
"what": "The link does not have an accessible name",
|
|
31
|
+
"ordinalSeverity": 2,
|
|
32
|
+
"outcome": "failed",
|
|
33
|
+
"count": 1,
|
|
34
|
+
"catalogIndex": "0",
|
|
35
|
+
"checkpoint": 0,
|
|
36
|
+
"issueID": "linkNoText"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"ruleID": "r65",
|
|
40
|
+
"what": "Focus Visible",
|
|
41
|
+
"ordinalSeverity": 0,
|
|
42
|
+
"outcome": "cantTell",
|
|
43
|
+
"count": 1,
|
|
44
|
+
"catalogIndex": "0",
|
|
45
|
+
"checkpoint": 0,
|
|
46
|
+
"issueID": "focusIndicationBad"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"outcomeTotals": {
|
|
50
|
+
"failed": 1,
|
|
51
|
+
"cantTell": 1
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"type": "test",
|
|
58
|
+
"which": "alfa",
|
|
59
|
+
"startTime": "26-01-01T00:00",
|
|
60
|
+
"endTime": "26-01-01T00:01",
|
|
61
|
+
"result": {
|
|
62
|
+
"standardResult": {
|
|
63
|
+
"instances": [
|
|
64
|
+
{
|
|
65
|
+
"ruleID": "r11",
|
|
66
|
+
"what": "The link does not have an accessible name",
|
|
67
|
+
"ordinalSeverity": 2,
|
|
68
|
+
"outcome": "failed",
|
|
69
|
+
"count": 1,
|
|
70
|
+
"catalogIndex": "0",
|
|
71
|
+
"checkpoint": 0,
|
|
72
|
+
"issueID": "linkNoText"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"ruleID": "r3",
|
|
76
|
+
"what": "Text is all-capital",
|
|
77
|
+
"ordinalSeverity": 1,
|
|
78
|
+
"outcome": "failed",
|
|
79
|
+
"count": 1,
|
|
80
|
+
"catalogIndex": "1",
|
|
81
|
+
"checkpoint": 0,
|
|
82
|
+
"issueID": "allCaps"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"outcomeTotals": {
|
|
86
|
+
"failed": 2,
|
|
87
|
+
"cantTell": 0
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"jobData": {
|
|
94
|
+
"startTime": "26-01-01T00:00",
|
|
95
|
+
"endTime": "26-01-01T00:10",
|
|
96
|
+
"elapsedSeconds": 600,
|
|
97
|
+
"preventions": {},
|
|
98
|
+
"issuelessRules": []
|
|
99
|
+
},
|
|
100
|
+
"catalog": {
|
|
101
|
+
"0": {
|
|
102
|
+
"tagName": "A",
|
|
103
|
+
"id": "",
|
|
104
|
+
"startTag": "<a>",
|
|
105
|
+
"text": "About Us",
|
|
106
|
+
"textLinkable": false,
|
|
107
|
+
"boxID": "10:20:80:30",
|
|
108
|
+
"pathID": "/html/body/a[1]",
|
|
109
|
+
"headingIndex": "",
|
|
110
|
+
"checkpoint": 0
|
|
111
|
+
},
|
|
112
|
+
"1": {
|
|
113
|
+
"tagName": "P",
|
|
114
|
+
"id": "",
|
|
115
|
+
"startTag": "<p>",
|
|
116
|
+
"text": "ALL ABOUT US",
|
|
117
|
+
"textLinkable": false,
|
|
118
|
+
"boxID": "10:60:80:20",
|
|
119
|
+
"pathID": "/html/body/p[1]",
|
|
120
|
+
"headingIndex": "",
|
|
121
|
+
"checkpoint": 0
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"images": {},
|
|
125
|
+
"checkpoints": []
|
|
126
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260101T0001-ct",
|
|
3
|
+
"what": "All CantTell Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260101T0001",
|
|
11
|
+
"executionTimeStamp": "260101T0001",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "All CantTell Page",
|
|
14
|
+
"url": "https://example.com/canttell"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "axe",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [
|
|
28
|
+
{
|
|
29
|
+
"ruleID": "r65",
|
|
30
|
+
"what": "Focus Visible",
|
|
31
|
+
"ordinalSeverity": 0,
|
|
32
|
+
"outcome": "cantTell",
|
|
33
|
+
"count": 1,
|
|
34
|
+
"catalogIndex": "0",
|
|
35
|
+
"checkpoint": 0,
|
|
36
|
+
"issueID": "focusIndicationBad"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"outcomeTotals": {
|
|
40
|
+
"failed": 0,
|
|
41
|
+
"cantTell": 1
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"jobData": {
|
|
48
|
+
"startTime": "26-01-01T00:00",
|
|
49
|
+
"endTime": "26-01-01T00:10",
|
|
50
|
+
"elapsedSeconds": 600,
|
|
51
|
+
"preventions": {},
|
|
52
|
+
"issuelessRules": []
|
|
53
|
+
},
|
|
54
|
+
"catalog": {
|
|
55
|
+
"0": {
|
|
56
|
+
"tagName": "A",
|
|
57
|
+
"id": "",
|
|
58
|
+
"startTag": "<a>",
|
|
59
|
+
"text": "Click here",
|
|
60
|
+
"textLinkable": false,
|
|
61
|
+
"boxID": "5:10:60:20",
|
|
62
|
+
"pathID": "/html/body/a[1]",
|
|
63
|
+
"headingIndex": "",
|
|
64
|
+
"checkpoint": 0
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"images": {},
|
|
68
|
+
"checkpoints": []
|
|
69
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260101T0002-no",
|
|
3
|
+
"what": "No Outcomes Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260101T0002",
|
|
11
|
+
"executionTimeStamp": "260101T0002",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "No Outcomes Page",
|
|
14
|
+
"url": "https://example.com/nooutcomes"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "ibm",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [
|
|
28
|
+
{
|
|
29
|
+
"ruleID": "r1",
|
|
30
|
+
"what": "Button has no accessible name",
|
|
31
|
+
"ordinalSeverity": 3,
|
|
32
|
+
"count": 1,
|
|
33
|
+
"catalogIndex": "0",
|
|
34
|
+
"checkpoint": 0,
|
|
35
|
+
"issueID": "linkNoText"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"outcomeTotals": {
|
|
39
|
+
"failed": 0,
|
|
40
|
+
"cantTell": 0
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"jobData": {
|
|
47
|
+
"startTime": "26-01-01T00:00",
|
|
48
|
+
"endTime": "26-01-01T00:10",
|
|
49
|
+
"elapsedSeconds": 600,
|
|
50
|
+
"preventions": {},
|
|
51
|
+
"issuelessRules": []
|
|
52
|
+
},
|
|
53
|
+
"catalog": {
|
|
54
|
+
"0": {
|
|
55
|
+
"tagName": "BUTTON",
|
|
56
|
+
"id": "",
|
|
57
|
+
"startTag": "<button>",
|
|
58
|
+
"text": "Submit",
|
|
59
|
+
"textLinkable": false,
|
|
60
|
+
"boxID": "15:25:70:30",
|
|
61
|
+
"pathID": "/html/body/button[1]",
|
|
62
|
+
"headingIndex": "",
|
|
63
|
+
"checkpoint": 0
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"images": {},
|
|
67
|
+
"checkpoints": []
|
|
68
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260101T0005-emp",
|
|
3
|
+
"what": "Empty Results Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260101T0005",
|
|
11
|
+
"executionTimeStamp": "260101T0005",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "Empty Results Page",
|
|
14
|
+
"url": "https://example.com/empty"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "axe",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [],
|
|
28
|
+
"outcomeTotals": {
|
|
29
|
+
"failed": 0,
|
|
30
|
+
"cantTell": 0
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"jobData": {
|
|
37
|
+
"startTime": "26-01-01T00:00",
|
|
38
|
+
"endTime": "26-01-01T00:10",
|
|
39
|
+
"elapsedSeconds": 600,
|
|
40
|
+
"preventions": {},
|
|
41
|
+
"issuelessRules": []
|
|
42
|
+
},
|
|
43
|
+
"catalog": {},
|
|
44
|
+
"images": {},
|
|
45
|
+
"checkpoints": []
|
|
46
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260101T0006-prv",
|
|
3
|
+
"what": "Prevented Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260101T0006",
|
|
11
|
+
"executionTimeStamp": "260101T0006",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "Prevented Page",
|
|
14
|
+
"url": "https://example.com/prevented"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "axe",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [
|
|
28
|
+
{
|
|
29
|
+
"ruleID": "r11",
|
|
30
|
+
"what": "The image has no alt text",
|
|
31
|
+
"ordinalSeverity": 2,
|
|
32
|
+
"outcome": "failed",
|
|
33
|
+
"count": 1,
|
|
34
|
+
"catalogIndex": "0",
|
|
35
|
+
"checkpoint": 0,
|
|
36
|
+
"issueID": "linkNoText"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"outcomeTotals": {
|
|
40
|
+
"failed": 1,
|
|
41
|
+
"cantTell": 0
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"jobData": {
|
|
48
|
+
"startTime": "26-01-01T00:00",
|
|
49
|
+
"endTime": "26-01-01T00:10",
|
|
50
|
+
"elapsedSeconds": 600,
|
|
51
|
+
"preventions": {
|
|
52
|
+
"alfa": "page timed out"
|
|
53
|
+
},
|
|
54
|
+
"issuelessRules": []
|
|
55
|
+
},
|
|
56
|
+
"catalog": {
|
|
57
|
+
"0": {
|
|
58
|
+
"tagName": "IMG",
|
|
59
|
+
"id": "",
|
|
60
|
+
"startTag": "<img>",
|
|
61
|
+
"text": "An image",
|
|
62
|
+
"textLinkable": false,
|
|
63
|
+
"boxID": "0:0:200:100",
|
|
64
|
+
"pathID": "/html/body/img[1]",
|
|
65
|
+
"headingIndex": "",
|
|
66
|
+
"checkpoint": 0
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"images": {},
|
|
70
|
+
"checkpoints": []
|
|
71
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "260202T0000-new",
|
|
3
|
+
"what": "Mixed Outcomes Page",
|
|
4
|
+
"strict": false,
|
|
5
|
+
"standard": "only",
|
|
6
|
+
"device": {
|
|
7
|
+
"id": "default"
|
|
8
|
+
},
|
|
9
|
+
"browserID": "chromium",
|
|
10
|
+
"creationTimeStamp": "260202T0000",
|
|
11
|
+
"executionTimeStamp": "260202T0000",
|
|
12
|
+
"target": {
|
|
13
|
+
"what": "Mixed Outcomes Page",
|
|
14
|
+
"url": "https://example.com/mixed"
|
|
15
|
+
},
|
|
16
|
+
"sources": {
|
|
17
|
+
"worker": "test-worker"
|
|
18
|
+
},
|
|
19
|
+
"acts": [
|
|
20
|
+
{
|
|
21
|
+
"type": "test",
|
|
22
|
+
"which": "axe",
|
|
23
|
+
"startTime": "26-01-01T00:00",
|
|
24
|
+
"endTime": "26-01-01T00:01",
|
|
25
|
+
"result": {
|
|
26
|
+
"standardResult": {
|
|
27
|
+
"instances": [
|
|
28
|
+
{
|
|
29
|
+
"ruleID": "r11",
|
|
30
|
+
"what": "The link does not have an accessible name",
|
|
31
|
+
"ordinalSeverity": 2,
|
|
32
|
+
"outcome": "failed",
|
|
33
|
+
"count": 1,
|
|
34
|
+
"catalogIndex": "0",
|
|
35
|
+
"checkpoint": 0,
|
|
36
|
+
"issueID": "linkNoText"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"outcomeTotals": {
|
|
40
|
+
"failed": 1,
|
|
41
|
+
"cantTell": 0
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"jobData": {
|
|
48
|
+
"startTime": "26-01-01T00:00",
|
|
49
|
+
"endTime": "26-02-02T00:10",
|
|
50
|
+
"elapsedSeconds": 600,
|
|
51
|
+
"preventions": {},
|
|
52
|
+
"issuelessRules": []
|
|
53
|
+
},
|
|
54
|
+
"catalog": {
|
|
55
|
+
"0": {
|
|
56
|
+
"tagName": "A",
|
|
57
|
+
"id": "",
|
|
58
|
+
"startTag": "<a>",
|
|
59
|
+
"text": "About Us",
|
|
60
|
+
"textLinkable": false,
|
|
61
|
+
"boxID": "10:20:80:30",
|
|
62
|
+
"pathID": "/html/body/a[1]",
|
|
63
|
+
"headingIndex": "",
|
|
64
|
+
"checkpoint": 0
|
|
65
|
+
},
|
|
66
|
+
"1": {
|
|
67
|
+
"tagName": "P",
|
|
68
|
+
"id": "",
|
|
69
|
+
"startTag": "<p>",
|
|
70
|
+
"text": "ALL ABOUT US",
|
|
71
|
+
"textLinkable": false,
|
|
72
|
+
"boxID": "10:60:80:20",
|
|
73
|
+
"pathID": "/html/body/p[1]",
|
|
74
|
+
"headingIndex": "",
|
|
75
|
+
"checkpoint": 0
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"images": {},
|
|
79
|
+
"checkpoints": []
|
|
80
|
+
}
|