7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
83 lines
2.5 KiB
JavaScript
83 lines
2.5 KiB
JavaScript
/**
|
|
* Accessibility Testing Helper
|
|
* Provides reusable axe-core configuration and utilities for Playwright tests
|
|
*/
|
|
|
|
import AxeBuilder from '@axe-core/playwright';
|
|
|
|
/**
|
|
* Default WCAG 2.1/2.2 tags for accessibility testing
|
|
*/
|
|
const WCAG_TAGS = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'];
|
|
|
|
/**
|
|
* Create a pre-configured AxeBuilder instance
|
|
* @param {import('@playwright/test').Page} page - Playwright page object
|
|
* @param {Object} options - Configuration options
|
|
* @param {string[]} [options.tags] - WCAG tags to test (default: WCAG 2.1/2.2 A/AA)
|
|
* @param {string[]} [options.exclude] - Selectors to exclude from scan
|
|
* @param {string[]} [options.disableRules] - Rule IDs to disable
|
|
* @returns {AxeBuilder} Configured AxeBuilder instance
|
|
*/
|
|
export function createAxeBuilder(page, options = {}) {
|
|
const {
|
|
tags = WCAG_TAGS,
|
|
exclude = [],
|
|
disableRules = []
|
|
} = options;
|
|
|
|
let builder = new AxeBuilder({ page })
|
|
.withTags(tags);
|
|
|
|
// Add exclusions
|
|
exclude.forEach(selector => {
|
|
builder = builder.exclude(selector);
|
|
});
|
|
|
|
// Disable specific rules if provided
|
|
if (disableRules.length > 0) {
|
|
builder = builder.disableRules(disableRules);
|
|
}
|
|
|
|
return builder;
|
|
}
|
|
|
|
/**
|
|
* Filter violations by impact level
|
|
* @param {Object[]} violations - Array of violation objects
|
|
* @param {string[]} impacts - Impact levels to include ('critical', 'serious', 'moderate', 'minor')
|
|
* @returns {Object[]} Filtered violations
|
|
*/
|
|
function filterByImpact(violations, impacts) {
|
|
return violations.filter(v => impacts.includes(v.impact));
|
|
}
|
|
|
|
/**
|
|
* Get critical and serious violations only
|
|
* @param {Object[]} violations - Array of violation objects
|
|
* @returns {Object[]} Critical and serious violations
|
|
*/
|
|
export function getCriticalViolations(violations) {
|
|
return filterByImpact(violations, ['critical', 'serious']);
|
|
}
|
|
|
|
/**
|
|
* Format violations for console output
|
|
* @param {Object[]} violations - Array of violation objects
|
|
* @returns {string} Formatted string
|
|
*/
|
|
export function formatViolations(violations) {
|
|
if (violations.length === 0) {
|
|
return 'No accessibility violations found.';
|
|
}
|
|
|
|
const lines = violations.map(v => {
|
|
const nodes = v.nodes.map(n => ` - ${n.target.join(', ')}`).join('\n');
|
|
return `\n[${v.impact.toUpperCase()}] ${v.id}: ${v.description}\n Help: ${v.helpUrl}\n Affected elements:\n${nodes}`;
|
|
});
|
|
|
|
return `Found ${violations.length} accessibility violation(s):${lines.join('\n')}`;
|
|
}
|
|
|
|
export { WCAG_TAGS };
|