@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 CHANGED
@@ -254,9 +254,9 @@ paths:
254
254
  type: object
255
255
  properties:
256
256
  name:
257
- anyOf:
258
- - type: string
259
- - type: 'null'
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
- anyOf:
270
- - type: string
271
- - type: 'null'
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
- anyOf:
786
- - type: number
787
- - type: string
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
- anyOf:
1228
- - type: string
1229
- - type: 'null'
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
- anyOf:
1294
- - type: string
1295
- - type: 'null'
1293
+ type:
1294
+ - string
1295
+ - 'null'
1296
1296
  sponsor:
1297
- anyOf:
1298
- - type: string
1299
- - type: 'null'
1297
+ type:
1298
+ - string
1299
+ - 'null'
1300
1300
  required:
1301
1301
  - identifier
1302
1302
  - name
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jrpool/kilotest",
3
- "version": "46.0.2",
3
+ "version": "46.0.3",
4
4
  "description": "Ensemble testing for front-end web quality",
5
5
  "main": "index.js",
6
6
  "engines": {
@@ -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
+ }