101 lines
2.9 KiB
Bash
Executable File
101 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# =====================================================================
|
|
# pa11y-test.sh - Run Pa11y accessibility tests
|
|
# =====================================================================
|
|
# This script runs Pa11y accessibility tests for WCAG 2.1 AAA compliance
|
|
# =====================================================================
|
|
|
|
set -e
|
|
|
|
# Check if base URL is provided
|
|
if [ -z "$1" ]; then
|
|
BASE_URL="http://localhost:8080"
|
|
else
|
|
BASE_URL="$1"
|
|
fi
|
|
|
|
TESTS_DIR="$(dirname "$0")"
|
|
REPORTS_DIR="$TESTS_DIR/../reports"
|
|
mkdir -p "$REPORTS_DIR"
|
|
|
|
echo "=== Testing WCAG 2.1 AAA Compliance with Pa11y ==="
|
|
echo "Using base URL: $BASE_URL"
|
|
|
|
# Get URLs from sitemap
|
|
SITEMAP_URL="$BASE_URL/sitemap.xml"
|
|
echo "Fetching pages from sitemap: $SITEMAP_URL"
|
|
URLS=($(curl -s "$SITEMAP_URL" | grep -o '<loc>.*</loc>' | sed 's/<loc>//;s/<\/loc>//'))
|
|
|
|
if [ ${#URLS[@]} -eq 0 ]; then
|
|
echo "No URLs found in sitemap, or sitemap could not be fetched."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Found ${#URLS[@]} pages to test."
|
|
|
|
# Track failures
|
|
FAILURES=0
|
|
|
|
# Run tests for each URL
|
|
for url in "${URLS[@]}"; do
|
|
echo "Testing ${url}..."
|
|
|
|
# Create a report file name from the URL
|
|
report_file_name="pa11y-$(echo "$url" | sed -e 's|https://.*\.com/||' -e 's|/|-|g' -e 's/\.html//').json"
|
|
report_file="$REPORTS_DIR/$report_file_name"
|
|
|
|
# Run Pa11y and save results
|
|
if npx pa11y --standard WCAG2AAA --reporter json --ignore "content-security-policy" "${url}" > "${report_file}" 2>/dev/null; then
|
|
issues=$(jq '.issues | length' "${report_file}" 2>/dev/null || echo 0)
|
|
echo "Found ${issues} issues on ${url}"
|
|
|
|
# Check if there are issues
|
|
if [ "${issues}" -gt 0 ]; then
|
|
FAILURES=$((FAILURES + 1))
|
|
|
|
# Print summary of issues
|
|
echo "Issues summary:"
|
|
jq -r '.issues[] | "- \(.type): \(.message)\n Selector: \(.selector)"' "${report_file}" 2>/dev/null | head -n 10
|
|
|
|
# If there are more than 5 issues, indicate that
|
|
if [ "${issues}" -gt 5 ]; then
|
|
echo "... and $((issues - 5)) more issues."
|
|
fi
|
|
fi
|
|
else
|
|
echo "Error running Pa11y on ${url}"
|
|
# Check if a report file was created with error info
|
|
if [ -f "${report_file}" ]; then
|
|
error_message=$(jq -r '.error' "${report_file}" 2>/dev/null)
|
|
if [ -n "$error_message" ]; then
|
|
echo " Pa11y error: $error_message"
|
|
fi
|
|
fi
|
|
FAILURES=$((FAILURES + 1))
|
|
fi
|
|
|
|
echo "---"
|
|
done
|
|
|
|
# Create summary report
|
|
jq -n --arg timestamp "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
|
|
--arg baseUrl "${BASE_URL}" \
|
|
--arg failures "${FAILURES}" \
|
|
--arg total "${#URLS[@]}" \
|
|
'{
|
|
"timestamp": $timestamp,
|
|
"baseUrl": $baseUrl,
|
|
"summary": {
|
|
"total": ($total | tonumber),
|
|
"failures": ($failures | tonumber),
|
|
"passed": (($total | tonumber) - ($failures | tonumber))
|
|
}
|
|
}' > "${REPORTS_DIR}/pa11y-summary.json"
|
|
|
|
# Exit with appropriate status
|
|
if [ "${FAILURES}" -gt 0 ]; then
|
|
exit 1
|
|
else
|
|
exit 0
|
|
fi
|