Skip to content

Commit ff54db6

Browse files
Add helpers and pages and objects
1 parent cb8b279 commit ff54db6

File tree

3 files changed

+152
-83
lines changed

3 files changed

+152
-83
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
"@types/node": "^24.10.1"
7575
},
7676
"dependencies": {
77+
"@axe-core/playwright": "^4.11.0",
7778
"@eslint/js": "^9.39.1",
7879
"@kubernetes/client-node": "^1.4.0",
7980
"boxen": "^8.0.1",
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import AxeBuilder from "@axe-core/playwright";
2+
import type { Page } from "@playwright/test";
3+
import { expect, test } from "@playwright/test";
4+
5+
export interface AccessibilityTestOptions {
6+
/** Custom name for the attached results file. Defaults to "accessibility-scan-results.violations.json" */
7+
attachName?: string;
8+
/** Whether to assert that there are no violations. Defaults to true */
9+
assertNoViolations?: boolean;
10+
/** WCAG tags to test against. Defaults to ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa"] */
11+
wcagTags?: string[];
12+
/** Rules to disable during the scan. Defaults to ["color-contrast"] */
13+
disabledRules?: string[];
14+
}
15+
16+
const DEFAULT_OPTIONS: Required<AccessibilityTestOptions> = {
17+
attachName: "accessibility-scan-results.violations.json",
18+
assertNoViolations: true,
19+
wcagTags: ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa"],
20+
disabledRules: ["color-contrast"],
21+
};
22+
23+
export async function runAccessibilityTests(
24+
page: Page,
25+
options: AccessibilityTestOptions = {},
26+
) {
27+
const config = { ...DEFAULT_OPTIONS, ...options };
28+
const testInfo = test.info();
29+
30+
const accessibilityScanResults = await new AxeBuilder({ page })
31+
.withTags(config.wcagTags)
32+
.disableRules(config.disabledRules)
33+
.analyze();
34+
35+
await testInfo.attach(config.attachName, {
36+
body: JSON.stringify(accessibilityScanResults.violations, null, 2),
37+
contentType: "application/json",
38+
});
39+
40+
if (config.assertNoViolations) {
41+
expect(
42+
accessibilityScanResults.violations,
43+
`Found ${accessibilityScanResults.violations.length} accessibility violation(s)`,
44+
).toHaveLength(0);
45+
}
46+
47+
return accessibilityScanResults;
48+
}

yarn.lock

Lines changed: 103 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ __metadata:
55
version: 6
66
cacheKey: 8
77

8+
"@axe-core/playwright@npm:^4.11.0":
9+
version: 4.11.0
10+
resolution: "@axe-core/playwright@npm:4.11.0"
11+
dependencies:
12+
axe-core: ~4.11.0
13+
peerDependencies:
14+
playwright-core: ">= 1.0.0"
15+
checksum: 036d13cb73f9c3bdcff039caa8a3f4ae9c2fffeb41855053dd78f72d98d1635b0d7eec38ff5087beaa5e15c99e060a771d1b449f08df58694f02781d54aa155c
16+
languageName: node
17+
linkType: hard
18+
819
"@backstage/catalog-model@npm:1.7.5":
920
version: 1.7.5
1021
resolution: "@backstage/catalog-model@npm:1.7.5"
@@ -367,12 +378,21 @@ __metadata:
367378
languageName: node
368379
linkType: hard
369380

370-
"@types/node@npm:*, @types/node@npm:^24.0.0, @types/node@npm:^24.10.1":
371-
version: 24.10.1
372-
resolution: "@types/node@npm:24.10.1"
381+
"@types/node@npm:*":
382+
version: 25.0.1
383+
resolution: "@types/node@npm:25.0.1"
373384
dependencies:
374385
undici-types: ~7.16.0
375-
checksum: c2f370ae7a97c04991e0eee6b57e588a2abef0814a5f6e41fda5a9200cf02ae6654fad51c8372ee203ae4134bab80f5bf441c586f7f50e0fda3ba422f35eb3c0
386+
checksum: f9dc7f9b083c1044b5f687db4e577417b670701625d2b6743e6be212d73fda2660073226339bdf55dee519256dafa91116f3d29deb59f9341147640c76465d5f
387+
languageName: node
388+
linkType: hard
389+
390+
"@types/node@npm:^24.0.0, @types/node@npm:^24.10.1":
391+
version: 24.10.3
392+
resolution: "@types/node@npm:24.10.3"
393+
dependencies:
394+
undici-types: ~7.16.0
395+
checksum: 823345eafe5d38a98389a76481bdcfe277286b6fdb4c82c12dc549822f11159956061b75caa4d689e9164c641068a44c1237b190f42da7ed40f62af046e67852
376396
languageName: node
377397
linkType: hard
378398

@@ -385,139 +405,138 @@ __metadata:
385405
languageName: node
386406
linkType: hard
387407

388-
"@typescript-eslint/eslint-plugin@npm:8.48.1":
389-
version: 8.48.1
390-
resolution: "@typescript-eslint/eslint-plugin@npm:8.48.1"
408+
"@typescript-eslint/eslint-plugin@npm:8.49.0":
409+
version: 8.49.0
410+
resolution: "@typescript-eslint/eslint-plugin@npm:8.49.0"
391411
dependencies:
392412
"@eslint-community/regexpp": ^4.10.0
393-
"@typescript-eslint/scope-manager": 8.48.1
394-
"@typescript-eslint/type-utils": 8.48.1
395-
"@typescript-eslint/utils": 8.48.1
396-
"@typescript-eslint/visitor-keys": 8.48.1
397-
graphemer: ^1.4.0
413+
"@typescript-eslint/scope-manager": 8.49.0
414+
"@typescript-eslint/type-utils": 8.49.0
415+
"@typescript-eslint/utils": 8.49.0
416+
"@typescript-eslint/visitor-keys": 8.49.0
398417
ignore: ^7.0.0
399418
natural-compare: ^1.4.0
400419
ts-api-utils: ^2.1.0
401420
peerDependencies:
402-
"@typescript-eslint/parser": ^8.48.1
421+
"@typescript-eslint/parser": ^8.49.0
403422
eslint: ^8.57.0 || ^9.0.0
404423
typescript: ">=4.8.4 <6.0.0"
405-
checksum: cf5c0629396d315d7792a61913fa4f3e5580d2873ce3d4f8eb377e6ca57815a83bd8b38cab8e297028ee9246be14979d16423228cbbf8fb61472d6f6a664b13d
424+
checksum: 0bae18dda8e8c86d8da311c382642e4e321e708ca7bad1ae86e43981b1679e99e7d9bd4e32d4874e8016cbe2e39f5a255a71f16cc2c64ec3471b23161e51afec
406425
languageName: node
407426
linkType: hard
408427

409-
"@typescript-eslint/parser@npm:8.48.1":
410-
version: 8.48.1
411-
resolution: "@typescript-eslint/parser@npm:8.48.1"
428+
"@typescript-eslint/parser@npm:8.49.0":
429+
version: 8.49.0
430+
resolution: "@typescript-eslint/parser@npm:8.49.0"
412431
dependencies:
413-
"@typescript-eslint/scope-manager": 8.48.1
414-
"@typescript-eslint/types": 8.48.1
415-
"@typescript-eslint/typescript-estree": 8.48.1
416-
"@typescript-eslint/visitor-keys": 8.48.1
432+
"@typescript-eslint/scope-manager": 8.49.0
433+
"@typescript-eslint/types": 8.49.0
434+
"@typescript-eslint/typescript-estree": 8.49.0
435+
"@typescript-eslint/visitor-keys": 8.49.0
417436
debug: ^4.3.4
418437
peerDependencies:
419438
eslint: ^8.57.0 || ^9.0.0
420439
typescript: ">=4.8.4 <6.0.0"
421-
checksum: ba5734b59334fdfa178d3397e9931cfc01bf0b14a4b9935ef81072aef315c03d301a128eb1530f15a1f4c6cb83b4083cb36ab96e6f77fe6a589dac058d41e86e
440+
checksum: 27a157372fec09d72b9d3b266ca18cc6d4db040df6d507c5c9d30f97375e0be373d5fde9d02bcd997e40f21738edcc7a2e51d5a56e3cdd600147637bc96d920b
422441
languageName: node
423442
linkType: hard
424443

425-
"@typescript-eslint/project-service@npm:8.48.1":
426-
version: 8.48.1
427-
resolution: "@typescript-eslint/project-service@npm:8.48.1"
444+
"@typescript-eslint/project-service@npm:8.49.0":
445+
version: 8.49.0
446+
resolution: "@typescript-eslint/project-service@npm:8.49.0"
428447
dependencies:
429-
"@typescript-eslint/tsconfig-utils": ^8.48.1
430-
"@typescript-eslint/types": ^8.48.1
448+
"@typescript-eslint/tsconfig-utils": ^8.49.0
449+
"@typescript-eslint/types": ^8.49.0
431450
debug: ^4.3.4
432451
peerDependencies:
433452
typescript: ">=4.8.4 <6.0.0"
434-
checksum: fd99c025e7223217c558a211ec8e0b6b4097b70836f51481e1e55e659eb88be76113db8239ac3626f96b384d4261d487ad6743c5cf8d5949ebf1bab072fd6055
453+
checksum: 378cd7e6982820aa0bb1dfe78a8cf133dc8192ad68b4e2a3ed1615a1a1b4542a1a20da08de6f5dee2a5804192aeceabe06e6c16a0453a8aaa43e495527e6af6a
435454
languageName: node
436455
linkType: hard
437456

438-
"@typescript-eslint/scope-manager@npm:8.48.1":
439-
version: 8.48.1
440-
resolution: "@typescript-eslint/scope-manager@npm:8.48.1"
457+
"@typescript-eslint/scope-manager@npm:8.49.0":
458+
version: 8.49.0
459+
resolution: "@typescript-eslint/scope-manager@npm:8.49.0"
441460
dependencies:
442-
"@typescript-eslint/types": 8.48.1
443-
"@typescript-eslint/visitor-keys": 8.48.1
444-
checksum: 62a52b83e4ea387c3d651f92e439678ec823fd1a4fe859b936b626d13e7c20960557d1dd5410d78542cc539f4588897b2e0a337051d97808cbe59b4fd51d44ea
461+
"@typescript-eslint/types": 8.49.0
462+
"@typescript-eslint/visitor-keys": 8.49.0
463+
checksum: 85aae146729547df03a2ffdb4e447a10023e7c71b426a2a5d7eb3b2a82ec1bbd8ba214d619363994c500a4cf742fbb3f3743723aa13784649e0b9e909ab4529f
445464
languageName: node
446465
linkType: hard
447466

448-
"@typescript-eslint/tsconfig-utils@npm:8.48.1, @typescript-eslint/tsconfig-utils@npm:^8.48.1":
449-
version: 8.48.1
450-
resolution: "@typescript-eslint/tsconfig-utils@npm:8.48.1"
467+
"@typescript-eslint/tsconfig-utils@npm:8.49.0, @typescript-eslint/tsconfig-utils@npm:^8.49.0":
468+
version: 8.49.0
469+
resolution: "@typescript-eslint/tsconfig-utils@npm:8.49.0"
451470
peerDependencies:
452471
typescript: ">=4.8.4 <6.0.0"
453-
checksum: 5c24e2dbe0f3771701f34a6614ca24bc4551e10c9d1426da66048477a00b2b017b47bc301e8d6b7c0eb0d27d6b8a073b137a31d22553015fdf03c61c1cc865e4
472+
checksum: be26283df8cf05a3a8d17596ac52e51ec27017f27ec5588e2fa3b804c31758864732a24e1ab777ac3e3567dda9b55de5b18d318b6a6e56025baa4f117f371804
454473
languageName: node
455474
linkType: hard
456475

457-
"@typescript-eslint/type-utils@npm:8.48.1":
458-
version: 8.48.1
459-
resolution: "@typescript-eslint/type-utils@npm:8.48.1"
476+
"@typescript-eslint/type-utils@npm:8.49.0":
477+
version: 8.49.0
478+
resolution: "@typescript-eslint/type-utils@npm:8.49.0"
460479
dependencies:
461-
"@typescript-eslint/types": 8.48.1
462-
"@typescript-eslint/typescript-estree": 8.48.1
463-
"@typescript-eslint/utils": 8.48.1
480+
"@typescript-eslint/types": 8.49.0
481+
"@typescript-eslint/typescript-estree": 8.49.0
482+
"@typescript-eslint/utils": 8.49.0
464483
debug: ^4.3.4
465484
ts-api-utils: ^2.1.0
466485
peerDependencies:
467486
eslint: ^8.57.0 || ^9.0.0
468487
typescript: ">=4.8.4 <6.0.0"
469-
checksum: d9bb428512c5b892fcce63eefae45e5982ab10a935cbc0eb2163ca5127634bf9ba47715b4a1c0735a067f2973e80cc363612e9fdfdcd5cae31262cd539ec8d02
488+
checksum: ce5795464be57b0a1cf5970103547a148e8971fe7cf1aafb9a62b40251c670fd1b03535edfc4622c520112705cd6ee5efd88124a7432d2fbbcfc5be54fbf131f
470489
languageName: node
471490
linkType: hard
472491

473-
"@typescript-eslint/types@npm:8.48.1, @typescript-eslint/types@npm:^8.48.1":
474-
version: 8.48.1
475-
resolution: "@typescript-eslint/types@npm:8.48.1"
476-
checksum: 19e5f902bd1e0a51f43faef6ea0a2b88292283e8eee58237657876b8ad908d66645ac50fc37a0967e4f1f2799b11cec47d03c977b059b8542dcb12e16b7a9354
492+
"@typescript-eslint/types@npm:8.49.0, @typescript-eslint/types@npm:^8.49.0":
493+
version: 8.49.0
494+
resolution: "@typescript-eslint/types@npm:8.49.0"
495+
checksum: e604e27f9ff7dd4c7ae0060db5f506338b64cc302563841e729f4da7730a1e94176db8ae1f1c4c0c0c8df5086f127408dc050f27595a36d412f60ed0e09f5a64
477496
languageName: node
478497
linkType: hard
479498

480-
"@typescript-eslint/typescript-estree@npm:8.48.1":
481-
version: 8.48.1
482-
resolution: "@typescript-eslint/typescript-estree@npm:8.48.1"
499+
"@typescript-eslint/typescript-estree@npm:8.49.0":
500+
version: 8.49.0
501+
resolution: "@typescript-eslint/typescript-estree@npm:8.49.0"
483502
dependencies:
484-
"@typescript-eslint/project-service": 8.48.1
485-
"@typescript-eslint/tsconfig-utils": 8.48.1
486-
"@typescript-eslint/types": 8.48.1
487-
"@typescript-eslint/visitor-keys": 8.48.1
503+
"@typescript-eslint/project-service": 8.49.0
504+
"@typescript-eslint/tsconfig-utils": 8.49.0
505+
"@typescript-eslint/types": 8.49.0
506+
"@typescript-eslint/visitor-keys": 8.49.0
488507
debug: ^4.3.4
489508
minimatch: ^9.0.4
490509
semver: ^7.6.0
491510
tinyglobby: ^0.2.15
492511
ts-api-utils: ^2.1.0
493512
peerDependencies:
494513
typescript: ">=4.8.4 <6.0.0"
495-
checksum: 1ff0b1ad4a71d6f8e81e5ca8d65333e8e9b53499f1e2b5a0295cbda062eebce0dcb021b1aac9b31c74096d26429f4b2109414d39d4ca4b531ee31f2c9e7895ec
514+
checksum: a03545eefdf2487172602930fdd27c8810dc775bdfa4d9c3a45651c5f5465c5e1fc652f318c61ece7f4f35425231961434e96d4ffca84f10149fca111e1fc520
496515
languageName: node
497516
linkType: hard
498517

499-
"@typescript-eslint/utils@npm:8.48.1":
500-
version: 8.48.1
501-
resolution: "@typescript-eslint/utils@npm:8.48.1"
518+
"@typescript-eslint/utils@npm:8.49.0":
519+
version: 8.49.0
520+
resolution: "@typescript-eslint/utils@npm:8.49.0"
502521
dependencies:
503522
"@eslint-community/eslint-utils": ^4.7.0
504-
"@typescript-eslint/scope-manager": 8.48.1
505-
"@typescript-eslint/types": 8.48.1
506-
"@typescript-eslint/typescript-estree": 8.48.1
523+
"@typescript-eslint/scope-manager": 8.49.0
524+
"@typescript-eslint/types": 8.49.0
525+
"@typescript-eslint/typescript-estree": 8.49.0
507526
peerDependencies:
508527
eslint: ^8.57.0 || ^9.0.0
509528
typescript: ">=4.8.4 <6.0.0"
510-
checksum: 5fcf70d05a087c8c449c231b165d825101b832d48569ebde33c4efd3451f38ef084a46019e5c91fc7d1b34638cdd18f4564890132bb13495f6eed9420b949563
529+
checksum: be1bdf2e4a8bb56bb0c39ba8b8a5f1fc187fb17a53af0ef4d50be95914027076dfac385b54d969fdaa2a42fa8a95f31d105457a3768875054a5507ebe6f6257a
511530
languageName: node
512531
linkType: hard
513532

514-
"@typescript-eslint/visitor-keys@npm:8.48.1":
515-
version: 8.48.1
516-
resolution: "@typescript-eslint/visitor-keys@npm:8.48.1"
533+
"@typescript-eslint/visitor-keys@npm:8.49.0":
534+
version: 8.49.0
535+
resolution: "@typescript-eslint/visitor-keys@npm:8.49.0"
517536
dependencies:
518-
"@typescript-eslint/types": 8.48.1
537+
"@typescript-eslint/types": 8.49.0
519538
eslint-visitor-keys: ^4.2.1
520-
checksum: b93cc791ee3a9d47f2b66a5047b3912db358f75a752a19431df78e0263f795105fc224d073e6450a99593770a64fba47e063ade6525bb785817131e06978fd15
539+
checksum: 446d6345d9702bcdf8713a47561ea52657bbec1c8170b1559d9462e1d815b122adff35f1cc778ecb94f4459d51ac7aac7cafe9ec8d8319b2c7d7984a0edee6ba
521540
languageName: node
522541
linkType: hard
523542

@@ -644,6 +663,13 @@ __metadata:
644663
languageName: node
645664
linkType: hard
646665

666+
"axe-core@npm:~4.11.0":
667+
version: 4.11.0
668+
resolution: "axe-core@npm:4.11.0"
669+
checksum: 57b0d7206d4dd63a1127b8ad6e173417857a3de43717cbb03561e75e2ff85765a228a7588fde4c828dbf179ef25f263ad98535656701e78def8f29a9524be866
670+
languageName: node
671+
linkType: hard
672+
647673
"b4a@npm:^1.6.4":
648674
version: 1.7.3
649675
resolution: "b4a@npm:1.7.3"
@@ -1420,13 +1446,6 @@ __metadata:
14201446
languageName: node
14211447
linkType: hard
14221448

1423-
"graphemer@npm:^1.4.0":
1424-
version: 1.4.0
1425-
resolution: "graphemer@npm:1.4.0"
1426-
checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673
1427-
languageName: node
1428-
linkType: hard
1429-
14301449
"has-flag@npm:^4.0.0":
14311450
version: 4.0.0
14321451
resolution: "has-flag@npm:4.0.0"
@@ -2179,6 +2198,7 @@ __metadata:
21792198
version: 0.0.0-use.local
21802199
resolution: "rhdh-e2e-test-utils@workspace:."
21812200
dependencies:
2201+
"@axe-core/playwright": ^4.11.0
21822202
"@backstage/catalog-model": 1.7.5
21832203
"@eslint/js": ^9.39.1
21842204
"@kubernetes/client-node": ^1.4.0
@@ -2472,17 +2492,17 @@ __metadata:
24722492
linkType: hard
24732493

24742494
"typescript-eslint@npm:^8.48.1":
2475-
version: 8.48.1
2476-
resolution: "typescript-eslint@npm:8.48.1"
2495+
version: 8.49.0
2496+
resolution: "typescript-eslint@npm:8.49.0"
24772497
dependencies:
2478-
"@typescript-eslint/eslint-plugin": 8.48.1
2479-
"@typescript-eslint/parser": 8.48.1
2480-
"@typescript-eslint/typescript-estree": 8.48.1
2481-
"@typescript-eslint/utils": 8.48.1
2498+
"@typescript-eslint/eslint-plugin": 8.49.0
2499+
"@typescript-eslint/parser": 8.49.0
2500+
"@typescript-eslint/typescript-estree": 8.49.0
2501+
"@typescript-eslint/utils": 8.49.0
24822502
peerDependencies:
24832503
eslint: ^8.57.0 || ^9.0.0
24842504
typescript: ">=4.8.4 <6.0.0"
2485-
checksum: 0de61459435fc7466d6f62e944268da31c5a477692f9cdc9583982c5a6d6efd38ac86ec9f94dd1c806cc30842a97b8d4bda0458bd3c1070c660dc68666f9012b
2505+
checksum: fd91cffcf3c5de73a9ead2253dcb8516ed664fc9179d26c019e6be53f4d4429e280dd5c783c68789a4a2db34712e569468a6c9c7613fc918a310687ca53b91b1
24862506
languageName: node
24872507
linkType: hard
24882508

0 commit comments

Comments
 (0)