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`