diff --git a/phpunit.xml b/phpunit.xml
index c44e5a5..72f8c6b 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -52,7 +52,9 @@
tests/Architecture/AuthzUiTemplateContractTest.php
tests/Architecture/DetailActionPolicyContractTest.php
tests/Architecture/DetailPageContractTest.php
- tests/Architecture/DetailValidationSummaryContractTest.php
+ tests/Architecture/DetailValidationActionContractTest.php
+ tests/Architecture/DetailValidationAssetContractTest.php
+ tests/Architecture/DetailValidationTemplateContractTest.php
tests/Architecture/FilterDrawerRuntimeContractTest.php
tests/Architecture/FilterDrawerTemplateContractTest.php
tests/Architecture/FrontendRuntimeComponentContractTest.php
diff --git a/tests/Architecture/DetailValidationActionContractTest.php b/tests/Architecture/DetailValidationActionContractTest.php
new file mode 100644
index 0000000..ab1b8f0
--- /dev/null
+++ b/tests/Architecture/DetailValidationActionContractTest.php
@@ -0,0 +1,18 @@
+readProjectFile($file);
+ $this->assertStringContainsString('$validationSummaryErrors = $errorBag->toArray();', $content, $file);
+ }
+ }
+}
diff --git a/tests/Architecture/DetailValidationAssetContractTest.php b/tests/Architecture/DetailValidationAssetContractTest.php
new file mode 100644
index 0000000..d67c951
--- /dev/null
+++ b/tests/Architecture/DetailValidationAssetContractTest.php
@@ -0,0 +1,16 @@
+readProjectFile('config/assets.php');
+ $this->assertStringContainsString("'css/components/app-details-validation-summary.css'", $content);
+ }
+}
diff --git a/tests/Architecture/DetailValidationContractFiles.php b/tests/Architecture/DetailValidationContractFiles.php
new file mode 100644
index 0000000..53969ed
--- /dev/null
+++ b/tests/Architecture/DetailValidationContractFiles.php
@@ -0,0 +1,46 @@
+
+ */
+ public static function detailTemplateFiles(): array
+ {
+ return [
+ 'pages/admin/users/create(default).phtml',
+ 'pages/admin/users/edit(default).phtml',
+ 'pages/admin/tenants/create(default).phtml',
+ 'pages/admin/tenants/edit(default).phtml',
+ 'pages/admin/departments/create(default).phtml',
+ 'pages/admin/departments/edit(default).phtml',
+ 'pages/admin/roles/create(default).phtml',
+ 'pages/admin/roles/edit(default).phtml',
+ 'pages/admin/permissions/create(default).phtml',
+ 'pages/admin/permissions/edit(default).phtml',
+ 'pages/admin/scheduled-jobs/edit(default).phtml',
+ ];
+ }
+
+ /**
+ * @return list
+ */
+ public static function detailActionFiles(): array
+ {
+ return [
+ 'pages/admin/users/create().php',
+ 'pages/admin/users/edit($id).php',
+ 'pages/admin/tenants/create().php',
+ 'pages/admin/tenants/edit($id).php',
+ 'pages/admin/departments/create().php',
+ 'pages/admin/departments/edit($id).php',
+ 'pages/admin/roles/create().php',
+ 'pages/admin/roles/edit($id).php',
+ 'pages/admin/permissions/create().php',
+ 'pages/admin/permissions/edit($id).php',
+ 'pages/admin/scheduled-jobs/edit($id).php',
+ ];
+ }
+}
diff --git a/tests/Architecture/DetailValidationSummaryContractTest.php b/tests/Architecture/DetailValidationSummaryContractTest.php
deleted file mode 100644
index 1e49d24..0000000
--- a/tests/Architecture/DetailValidationSummaryContractTest.php
+++ /dev/null
@@ -1,89 +0,0 @@
-
- */
- private function detailTemplateFiles(): array
- {
- return [
- 'pages/admin/users/create(default).phtml',
- 'pages/admin/users/edit(default).phtml',
- 'pages/admin/tenants/create(default).phtml',
- 'pages/admin/tenants/edit(default).phtml',
- 'pages/admin/departments/create(default).phtml',
- 'pages/admin/departments/edit(default).phtml',
- 'pages/admin/roles/create(default).phtml',
- 'pages/admin/roles/edit(default).phtml',
- 'pages/admin/permissions/create(default).phtml',
- 'pages/admin/permissions/edit(default).phtml',
- 'pages/admin/scheduled-jobs/edit(default).phtml',
- ];
- }
-
- /**
- * @return list
- */
- private function detailActionFiles(): array
- {
- return [
- 'pages/admin/users/create().php',
- 'pages/admin/users/edit($id).php',
- 'pages/admin/tenants/create().php',
- 'pages/admin/tenants/edit($id).php',
- 'pages/admin/departments/create().php',
- 'pages/admin/departments/edit($id).php',
- 'pages/admin/roles/create().php',
- 'pages/admin/roles/edit($id).php',
- 'pages/admin/permissions/create().php',
- 'pages/admin/permissions/edit($id).php',
- 'pages/admin/scheduled-jobs/edit($id).php',
- ];
- }
-
- public function testScopedDetailTemplatesUseSharedValidationSummaryPartial(): void
- {
- foreach ($this->detailTemplateFiles() as $file) {
- $content = $this->readProjectFile($file);
- $this->assertStringContainsString("require templatePath('partials/app-details-validation-summary.phtml');", $content, $file);
- }
- }
-
- public function testScopedDetailTemplatesDoNotInlineLegacyErrorLoop(): void
- {
- foreach ($this->detailTemplateFiles() as $file) {
- $content = $this->readProjectFile($file);
- $this->assertSame(0, preg_match('/foreach\s*\(\$errors\s+as\s+\$error\)/', $content), $file);
- }
- }
-
- public function testSharedPartialExposesValidationSummaryContract(): void
- {
- $content = $this->readProjectFile('templates/partials/app-details-validation-summary.phtml');
- $this->assertStringContainsString('data-validation-summary', $content);
- $this->assertStringContainsString('data-validation-summary-autofocus=', $content);
- $this->assertStringContainsString('data-validation-error-link', $content);
- $this->assertStringNotContainsString('class="notice"', $content);
- }
-
- public function testScopedDetailActionsProvideStructuredValidationSummaryErrors(): void
- {
- foreach ($this->detailActionFiles() as $file) {
- $content = $this->readProjectFile($file);
- $this->assertStringContainsString('$validationSummaryErrors = $errorBag->toArray();', $content, $file);
- }
- }
-
- public function testDefaultStyleGroupIncludesValidationSummaryComponentCss(): void
- {
- $content = $this->readProjectFile('config/assets.php');
- $this->assertStringContainsString("'css/components/app-details-validation-summary.css'", $content);
- }
-}
diff --git a/tests/Architecture/DetailValidationTemplateContractTest.php b/tests/Architecture/DetailValidationTemplateContractTest.php
new file mode 100644
index 0000000..cb26cb9
--- /dev/null
+++ b/tests/Architecture/DetailValidationTemplateContractTest.php
@@ -0,0 +1,45 @@
+readProjectFile($file);
+ $this->assertStringContainsString(
+ "require templatePath('partials/app-details-validation-summary.phtml');",
+ $content,
+ $file
+ );
+ $this->assertStringContainsString(
+ '$validationSummaryErrors = $validationSummaryErrors ?? ($errors ?? []);',
+ $content,
+ $file
+ );
+ }
+ }
+
+ public function testScopedDetailTemplatesDoNotInlineLegacyErrorLoop(): void
+ {
+ foreach (DetailValidationContractFiles::detailTemplateFiles() as $file) {
+ $content = $this->readProjectFile($file);
+ $this->assertSame(0, preg_match('/foreach\s*\(\$errors\s+as\s+\$error\)/', $content), $file);
+ }
+ }
+
+ public function testSharedPartialExposesValidationSummaryContract(): void
+ {
+ $content = $this->readProjectFile('templates/partials/app-details-validation-summary.phtml');
+
+ $this->assertStringContainsString('data-validation-summary', $content);
+ $this->assertStringContainsString('data-validation-summary-autofocus=', $content);
+ $this->assertStringContainsString('data-validation-error-link', $content);
+ $this->assertStringNotContainsString('class="notice"', $content);
+ }
+}
diff --git a/tests/README.md b/tests/README.md
index cc9fd18..983b511 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -32,7 +32,7 @@ ohne dass jede Aenderung immer die komplette Suite im Kopf behalten muss.
## Naechste Refactor-Kandidaten
-- `tests/Architecture/DetailValidationSummaryContractTest.php`
- `tests/Architecture/DetailActionPolicyContractTest.php`
- `tests/Architecture/ContainerFactoryContractTest.php`
- `tests/Architecture/SecurityLoggingContractTest.php`
+- `tests/Architecture/StatusTaxonomyContractTest.php`