MAESTRO: add accessibility e2e audit

This commit is contained in:
Mariusz Banach
2026-02-18 06:32:41 +01:00
parent 2c79e89e0a
commit 0001ff60bf
2 changed files with 79 additions and 1 deletions

View File

@@ -0,0 +1,78 @@
import { test, expect } from "@playwright/test";
import type { Page } from "@playwright/test";
import { AxeBuilder } from "@axe-core/playwright";
import fs from "fs/promises";
import path from "path";
import { AnalyzerPage } from "./pages/analyzer-page";
const headersPath = path.resolve(__dirname, "fixtures/sample-headers.txt");
const axeTags = ["wcag2a", "wcag2aa", "wcag21aa"];
const runAxeAudit = async (page: Page) => {
const results = await new AxeBuilder({ page }).withTags(axeTags).analyze();
expect(results.violations).toEqual([]);
};
test("accessibility audit covers landing page states", async ({ page }) => {
const headers = await fs.readFile(headersPath, "utf8");
const analyzer = new AnalyzerPage(page);
await analyzer.goto();
await expect(page.getByRole("textbox", { name: "Header Input" })).toBeVisible();
await runAxeAudit(page);
await analyzer.pasteHeaders(headers);
await runAxeAudit(page);
});
test("accessibility audit covers report view", async ({ page }) => {
const headers = await fs.readFile(headersPath, "utf8");
const analyzer = new AnalyzerPage(page);
await analyzer.goto();
await analyzer.pasteHeaders(headers);
await analyzer.clickAnalyse();
await analyzer.waitForResults();
await runAxeAudit(page);
});
test("accessibility audit covers captcha modal", async ({ page }) => {
const headers = await fs.readFile(headersPath, "utf8");
const analyzer = new AnalyzerPage(page);
const captchaChallenge = {
challengeToken: "playwright-challenge-token",
imageBase64:
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4nGP4z8DwHwAFgwJ/l0pNqQAAAABJRU5ErkJggg==",
};
const corsHeaders = {
"access-control-allow-origin": "http://localhost:3100",
"access-control-allow-credentials": "true",
};
await page.route("**/api/analyse", async (route) => {
await route.fulfill({
status: 429,
contentType: "application/json",
headers: {
...corsHeaders,
"retry-after": "60",
},
body: JSON.stringify({
error: "Too many requests",
retryAfter: 60,
captchaChallenge,
}),
});
});
await analyzer.goto();
await analyzer.pasteHeaders(headers);
await analyzer.clickAnalyse();
await expect(analyzer.getCaptchaModal()).toBeVisible();
await runAxeAudit(page);
});