From a59997b41fd5fe10a8cfbd0d89665d01ab5feb41 Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Sun, 16 Jan 2022 18:57:32 +0000 Subject: [PATCH] [TOOLS][DOCKER][A11Y] Switch to Pa11y CI and don't run it 'integrated' with codeception, since there was no good way to share cookies --- Makefile | 4 +- docker/tooling/docker-compose.yaml | 5 +- docker/tooling/pa11y/Dockerfile | 20 ++- .../Helper/AccessibilityValidator.php | 142 ------------------ tests/CodeCeption/pa11y-config.js | 5 - tests/CodeCeption/pa11y-config.json | 6 - tests/pa11y-ci-config.json | 24 +++ 7 files changed, 44 insertions(+), 162 deletions(-) delete mode 100644 tests/CodeCeption/_support/Helper/AccessibilityValidator.php delete mode 100644 tests/CodeCeption/pa11y-config.js delete mode 100644 tests/CodeCeption/pa11y-config.json create mode 100644 tests/pa11y-ci-config.json diff --git a/Makefile b/Makefile index 15ec1f2ea2..e9122b021a 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,8 @@ stop-tooling: .PHONY tooling-php-shell: tooling-docker docker exec -it $(call translate-container-name,tooling_php_1) sh -acceptance-and-accessibility: tooling-docker - docker exec -it $(call translate-container-name,tooling_php_1) /var/tooling/acceptance_and_accessibility.sh +test-accesibility: tooling-docker + cd docker/tooling && docker-compose run pa11y /usr/local/bin/pa11y-ci -c /pa11y/config.json test: tooling-docker docker exec $(call translate-container-name,tooling_php_1) /var/tooling/coverage.sh $(call args,'') diff --git a/docker/tooling/docker-compose.yaml b/docker/tooling/docker-compose.yaml index fe872f1607..2369aff9c0 100644 --- a/docker/tooling/docker-compose.yaml +++ b/docker/tooling/docker-compose.yaml @@ -6,7 +6,6 @@ services: depends_on: - db - redis - - pa11y volumes: # Entrypoint - ../php/entrypoint.sh:/entrypoint.sh @@ -45,8 +44,10 @@ services: pa11y: build: pa11y + depends_on: + - nginx volumes: - - ../../tests/CodeCeption/pa11y-config.json:/pa11y/config.json + - ../../tests/pa11y-ci-config.json:/pa11y/config.json cap_add: - SYS_ADMIN diff --git a/docker/tooling/pa11y/Dockerfile b/docker/tooling/pa11y/Dockerfile index ec4d19b402..bb2b18517e 100644 --- a/docker/tooling/pa11y/Dockerfile +++ b/docker/tooling/pa11y/Dockerfile @@ -1,8 +1,18 @@ FROM node -RUN apt-get update && apt-get -y install npm openssh-server && npm install -g pa11y +RUN apt-get update && apt-get install -y \ + apt-transport-https ca-certificates curl fontconfig \ + fonts-ipafont-gothic fonts-kacst fonts-liberation fonts-thai-tlwg \ + fonts-wqy-zenhei gconf-service libgbm-dev libasound2 \ + libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 \ + libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \ + libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 \ + libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 \ + libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \ + libxtst6 locales lsb-release unzip xdg-utils wget \ + && apt-get clean \ + && apt-get autoremove -q \ + && npm install -g pa11y-ci -COPY sshd_config /etc/ssh/sshd_config -RUN echo 'root:pa11y' | chpasswd - -ENTRYPOINT service ssh start && sleep infinity +RUN useradd -ms /bin/bash puppet +USER puppet diff --git a/tests/CodeCeption/_support/Helper/AccessibilityValidator.php b/tests/CodeCeption/_support/Helper/AccessibilityValidator.php deleted file mode 100644 index e6aa55da13..0000000000 --- a/tests/CodeCeption/_support/Helper/AccessibilityValidator.php +++ /dev/null @@ -1,142 +0,0 @@ -validatePa11y(\Helper\AccessibilityValidator::STANDARD_WCAG2AAA); - * - * Validate the current site against WCAG 2.0 (AA): - * $I->validatePa11y(); // or: - * $I->validatePa11y(\Helper\AccessibilityValidator::STANDARD_WCAG2A); - * - * Validate the current site against WCAG 2.0 (A): - * $I->validatePa11y(\Helper\AccessibilityValidator::STANDARD_WCAG2A); - * - * Validate the current site against Section 508: - * $I->validatePa11y(\Helper\AccessibilityValidator::STANDARD_SECTION508); - * - * Validate against WCAG 2.0 (AA), but ignore errors containing the string "Ignoreme": - * $I->validatePa11y(\Helper\AccessibilityValidator::STANDARD_WCAG2A, ["Ignoreme"]); - * - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @author Tobias Hößl - */ - -namespace Helper; - -use Exception; -use PHPUnit\Framework\Assert; - -class AccessibilityValidator extends \Codeception\Module -{ - public static $SUPPORTED_STANDARDS = [ - 'WCAG2AAA', - 'WCAG2AA', - 'WCAG2A', - 'Section508', - ]; - public const STANDARD_WCAG2AAA = 'WCAG2AAA'; - public const STANDARD_WCAG2AA = 'WCAG2AA'; - public const STANDARD_WCAG2A = 'WCAG2A'; - public const STANDARD_SECTION508 = 'Section508'; - - private function getPageUrl(): string - { - if ($this->hasModule('WebDriver')) { - /** @var \Codeception\Module\WebDriver $webdriver */ - $webdriver = $this->getModule('WebDriver'); - return $webdriver->webDriver->getCurrentURL(); - } else { - /** @var \Codeception\Module\PhpBrowser $phpBrowser */ - $phpBrowser = $this->getModule('PhpBrowser'); - return trim($phpBrowser->_getUrl(), '/') . $phpBrowser->_getCurrentUri(); - } - } - - /** - * @throws Exception - */ - private function validateByPa11y(string $url, string $standard): array - { - if (!\in_array($standard, static::$SUPPORTED_STANDARDS)) { - throw new Exception('Unknown standard: ' . $standard); - } - - exec('sshpass -p pa11y ssh -o StrictHostKeyChecking=no pa11y 2>/dev/null pa11y -c /pa11y/config.json' . ' -s ' . $standard . " -r json '" . addslashes($url) . "'", $output); - - if (!empty($output)) { - $data = json_decode($output[0], true); - if (!$data) { - throw new Exception('Invalid data returned from validation service: ' . implode("\n", $output)); - } - return $data; - } - return []; - } - - /** - * @param string[] $ignoreMessages - */ - public function validatePa11y(string $standard = 'WCAG2AA', array $ignoreMessages = []): void - { - try { - $url = $this->getPageUrl(); - $messages = $this->validateByPa11y($url, $standard); - } catch (Exception $e) { - $this->fail($e->getMessage()); - return; - } - $failMessages = []; - foreach ($messages as $message) { - if ($message['type'] == 'error') { - $string = $message['code'] . "\n" . $message['selector'] . ': '; - $string .= $message['context'] . "\n"; - $string .= $message['message']; - $ignoring = false; - foreach ($ignoreMessages as $ignoreMessage) { - if (mb_stripos($string, $ignoreMessage) !== false) { - $ignoring = true; - } - } - if (!$ignoring) { - $failMessages[] = $string; - } - } - } - if (\count($failMessages) > 0) { - $failStr = 'Failed ' . $standard . ' check: ' . "\n"; - $failStr .= implode("\n\n", $failMessages); - Assert::fail($failStr); - } - } -} diff --git a/tests/CodeCeption/pa11y-config.js b/tests/CodeCeption/pa11y-config.js deleted file mode 100644 index 4f1794676c..0000000000 --- a/tests/CodeCeption/pa11y-config.js +++ /dev/null @@ -1,5 +0,0 @@ -{ - "chromeLaunchConfig": { - "args": ["--no-sandbox"] - } -} diff --git a/tests/CodeCeption/pa11y-config.json b/tests/CodeCeption/pa11y-config.json deleted file mode 100644 index 55f35f6f1b..0000000000 --- a/tests/CodeCeption/pa11y-config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "chromeLaunchConfig": { - "args": ["--no-sandbox"], - "ignoreHTTPSErrors": true - } -} diff --git a/tests/pa11y-ci-config.json b/tests/pa11y-ci-config.json new file mode 100644 index 0000000000..cdffff0549 --- /dev/null +++ b/tests/pa11y-ci-config.json @@ -0,0 +1,24 @@ +{ + "defaults": { + "chromeLaunchConfig": { + "ignoreHTTPSErrors": true + }, + "timeout": 5000, + "viewport": { + "width": 320, + "height": 480 + } + }, + "concurrency": 4, + "urls": [ + "https://nginx/", + "https://nginx/feed/public", + "https://nginx/doc/faq", + "https://nginx/doc/tos", + "https://nginx/doc/privacy", + "https://nginx/doc/source", + "https://nginx/doc/version", + "https://nginx/main/login", + "https://nginx/main/register" + ] +}