From 115723fcd628321fddddbd144c01bb3fb0439724 Mon Sep 17 00:00:00 2001 From: fs Date: Thu, 19 Mar 2026 19:12:25 +0100 Subject: [PATCH] Split auth login accessibility contracts --- phpunit.xml | 5 +- .../AuthLoginAccessibilityContractFiles.php | 21 +++++ .../AuthLoginAccessibilityContractTest.php | 77 ------------------- ...uthLoginFieldAccessibilityContractTest.php | 21 +++++ .../AuthLoginPasswordToggleContractTest.php | 25 ++++++ ...LoginTemplateAccessibilityContractTest.php | 30 ++++++++ .../AuthLoginTenantSelectionContractTest.php | 20 +++++ tests/README.md | 2 +- 8 files changed, 122 insertions(+), 79 deletions(-) create mode 100644 tests/Architecture/AuthLoginAccessibilityContractFiles.php delete mode 100644 tests/Architecture/AuthLoginAccessibilityContractTest.php create mode 100644 tests/Architecture/AuthLoginFieldAccessibilityContractTest.php create mode 100644 tests/Architecture/AuthLoginPasswordToggleContractTest.php create mode 100644 tests/Architecture/AuthLoginTemplateAccessibilityContractTest.php create mode 100644 tests/Architecture/AuthLoginTenantSelectionContractTest.php diff --git a/phpunit.xml b/phpunit.xml index a49056b..f5f5883 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -53,7 +53,10 @@ tests/Architecture/AsideNavigationContractTest.php tests/Architecture/AuthHelpLinksPageContractTest.php tests/Architecture/AuthHelpLinksPartialContractTest.php - tests/Architecture/AuthLoginAccessibilityContractTest.php + tests/Architecture/AuthLoginFieldAccessibilityContractTest.php + tests/Architecture/AuthLoginPasswordToggleContractTest.php + tests/Architecture/AuthLoginTemplateAccessibilityContractTest.php + tests/Architecture/AuthLoginTenantSelectionContractTest.php tests/Architecture/AuthzUiActionContractTest.php tests/Architecture/AuthzUiLayoutContractTest.php tests/Architecture/AuthzUiTemplateContractTest.php diff --git a/tests/Architecture/AuthLoginAccessibilityContractFiles.php b/tests/Architecture/AuthLoginAccessibilityContractFiles.php new file mode 100644 index 0000000..880f93b --- /dev/null +++ b/tests/Architecture/AuthLoginAccessibilityContractFiles.php @@ -0,0 +1,21 @@ + + */ + public static function authLoginTemplates(): array + { + return [ + 'pages/auth/login(login).phtml', + 'pages/auth/register(login).phtml', + 'pages/auth/forgot(login).phtml', + 'pages/auth/reset(login).phtml', + 'pages/auth/verify(login).phtml', + 'pages/auth/verify-email(login).phtml', + ]; + } +} diff --git a/tests/Architecture/AuthLoginAccessibilityContractTest.php b/tests/Architecture/AuthLoginAccessibilityContractTest.php deleted file mode 100644 index df416ac..0000000 --- a/tests/Architecture/AuthLoginAccessibilityContractTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - */ - private function authLoginTemplates(): array - { - return [ - 'pages/auth/login(login).phtml', - 'pages/auth/register(login).phtml', - 'pages/auth/forgot(login).phtml', - 'pages/auth/reset(login).phtml', - 'pages/auth/verify(login).phtml', - 'pages/auth/verify-email(login).phtml', - ]; - } - - public function testAuthLoginTemplatesDoNotUseRoleButtonLinks(): void - { - foreach ($this->authLoginTemplates() as $file) { - $content = $this->readProjectFile($file); - $this->assertStringNotContainsString('role="button"', $content, $file); - } - } - - public function testAuthLoginErrorNoticesUseAssertiveLiveRegions(): void - { - foreach ($this->authLoginTemplates() as $file) { - $content = $this->readProjectFile($file); - $this->assertStringContainsString('class="notice" data-variant="error" role="alert" aria-live="assertive"', $content, $file); - } - } - - public function testTenantSelectionUsesSemanticFieldsetAndTextLabel(): void - { - $content = $this->readProjectFile('pages/auth/login(login).phtml'); - - $this->assertStringContainsString('login-tenant-fieldset', $content); - $this->assertStringContainsString('login-tenant-select-label', $content); - $this->assertStringContainsString('login-tenant-choice-text', $content); - $this->assertStringContainsString('login-microsoft-link', $content); - } - - public function testAuthLoginFormsExposeErrorDescriptionForInputs(): void - { - $describedByPattern = '/aria-describedby="[^"]*\\$errorNoticeId[^"]*"/'; - - foreach ($this->authLoginTemplates() as $file) { - $content = $this->readProjectFile($file); - $this->assertMatchesRegularExpression($describedByPattern, $content, $file); - $this->assertStringContainsString('aria-invalid="true"', $content, $file); - } - } - - public function testPasswordToggleUsesLocalizedLabelsAndKeyboardFocusableControl(): void - { - $layoutContent = $this->readProjectFile('templates/login.phtml'); - $scriptContent = $this->readProjectFile('web/js/components/app-password-toggle.js'); - - $this->assertStringContainsString('data-password-toggle-show-label', $layoutContent); - $this->assertStringContainsString('data-password-toggle-hide-label', $layoutContent); - - $this->assertStringContainsString('passwordToggleShowLabel', $scriptContent); - $this->assertStringContainsString('passwordToggleHideLabel', $scriptContent); - $this->assertStringNotContainsString('toggle.tabIndex = -1;', $scriptContent); - $this->assertStringNotContainsString("'Show password'", $scriptContent); - $this->assertStringNotContainsString("'Hide password'", $scriptContent); - } -} diff --git a/tests/Architecture/AuthLoginFieldAccessibilityContractTest.php b/tests/Architecture/AuthLoginFieldAccessibilityContractTest.php new file mode 100644 index 0000000..a9bc0b6 --- /dev/null +++ b/tests/Architecture/AuthLoginFieldAccessibilityContractTest.php @@ -0,0 +1,21 @@ +readProjectFile($file); + $this->assertMatchesRegularExpression($describedByPattern, $content, $file); + $this->assertStringContainsString('aria-invalid="true"', $content, $file); + } + } +} diff --git a/tests/Architecture/AuthLoginPasswordToggleContractTest.php b/tests/Architecture/AuthLoginPasswordToggleContractTest.php new file mode 100644 index 0000000..70189fe --- /dev/null +++ b/tests/Architecture/AuthLoginPasswordToggleContractTest.php @@ -0,0 +1,25 @@ +readProjectFile('templates/login.phtml'); + $scriptContent = $this->readProjectFile('web/js/components/app-password-toggle.js'); + + $this->assertStringContainsString('data-password-toggle-show-label', $layoutContent); + $this->assertStringContainsString('data-password-toggle-hide-label', $layoutContent); + + $this->assertStringContainsString('passwordToggleShowLabel', $scriptContent); + $this->assertStringContainsString('passwordToggleHideLabel', $scriptContent); + $this->assertStringNotContainsString('toggle.tabIndex = -1;', $scriptContent); + $this->assertStringNotContainsString("'Show password'", $scriptContent); + $this->assertStringNotContainsString("'Hide password'", $scriptContent); + } +} diff --git a/tests/Architecture/AuthLoginTemplateAccessibilityContractTest.php b/tests/Architecture/AuthLoginTemplateAccessibilityContractTest.php new file mode 100644 index 0000000..b4902a6 --- /dev/null +++ b/tests/Architecture/AuthLoginTemplateAccessibilityContractTest.php @@ -0,0 +1,30 @@ +readProjectFile($file); + $this->assertStringNotContainsString('role="button"', $content, $file); + } + } + + public function testAuthLoginErrorNoticesUseAssertiveLiveRegions(): void + { + foreach (AuthLoginAccessibilityContractFiles::authLoginTemplates() as $file) { + $content = $this->readProjectFile($file); + $this->assertStringContainsString( + 'class="notice" data-variant="error" role="alert" aria-live="assertive"', + $content, + $file + ); + } + } +} diff --git a/tests/Architecture/AuthLoginTenantSelectionContractTest.php b/tests/Architecture/AuthLoginTenantSelectionContractTest.php new file mode 100644 index 0000000..b8f7294 --- /dev/null +++ b/tests/Architecture/AuthLoginTenantSelectionContractTest.php @@ -0,0 +1,20 @@ +readProjectFile('pages/auth/login(login).phtml'); + + $this->assertStringContainsString('login-tenant-fieldset', $content); + $this->assertStringContainsString('login-tenant-select-label', $content); + $this->assertStringContainsString('login-tenant-choice-text', $content); + $this->assertStringContainsString('login-microsoft-link', $content); + } +} diff --git a/tests/README.md b/tests/README.md index a3b3105..5a7f6ef 100644 --- a/tests/README.md +++ b/tests/README.md @@ -33,6 +33,6 @@ ohne dass jede Aenderung immer die komplette Suite im Kopf behalten muss. ## Naechste Refactor-Kandidaten - `tests/Architecture/ContainerFactoryContractTest.php` -- `tests/Architecture/AuthLoginAccessibilityContractTest.php` - `tests/Architecture/SecurityCryptoContractTest.php` - `tests/Architecture/AsideNavigationContractTest.php` +- `tests/Architecture/AuthzApiBootstrapContractTest.php`