diff --git a/phpunit.xml b/phpunit.xml
index 72f8c6b..307ad54 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -50,7 +50,9 @@
tests/Architecture/AuthzUiActionContractTest.php
tests/Architecture/AuthzUiLayoutContractTest.php
tests/Architecture/AuthzUiTemplateContractTest.php
- tests/Architecture/DetailActionPolicyContractTest.php
+ tests/Architecture/DetailActionPolicyMigrationContractTest.php
+ tests/Architecture/DetailActionPolicyPartialContractTest.php
+ tests/Architecture/DetailActionPolicyRuntimeContractTest.php
tests/Architecture/DetailPageContractTest.php
tests/Architecture/DetailValidationActionContractTest.php
tests/Architecture/DetailValidationAssetContractTest.php
diff --git a/tests/Architecture/DetailActionPolicyContractFiles.php b/tests/Architecture/DetailActionPolicyContractFiles.php
new file mode 100644
index 0000000..8494a3f
--- /dev/null
+++ b/tests/Architecture/DetailActionPolicyContractFiles.php
@@ -0,0 +1,25 @@
+
+ */
+ public static function migratedConfirmFiles(): array
+ {
+ return [
+ 'pages/admin/users/edit(default).phtml',
+ 'pages/admin/users/_form.phtml',
+ 'pages/admin/tenants/edit(default).phtml',
+ 'pages/admin/tenants/_form.phtml',
+ 'pages/admin/departments/edit(default).phtml',
+ 'pages/admin/roles/edit(default).phtml',
+ 'pages/admin/permissions/edit(default).phtml',
+ 'pages/admin/settings/index(default).phtml',
+ 'templates/partials/app-details-titlebar.phtml',
+ 'templates/partials/app-details-aside-actions.phtml',
+ ];
+ }
+}
diff --git a/tests/Architecture/DetailActionPolicyContractTest.php b/tests/Architecture/DetailActionPolicyContractTest.php
deleted file mode 100644
index 5b37580..0000000
--- a/tests/Architecture/DetailActionPolicyContractTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-
- */
- private function migratedConfirmFiles(): array
- {
- return [
- 'pages/admin/users/edit(default).phtml',
- 'pages/admin/users/_form.phtml',
- 'pages/admin/tenants/edit(default).phtml',
- 'pages/admin/tenants/_form.phtml',
- 'pages/admin/departments/edit(default).phtml',
- 'pages/admin/roles/edit(default).phtml',
- 'pages/admin/permissions/edit(default).phtml',
- 'pages/admin/settings/index(default).phtml',
- 'templates/partials/app-details-titlebar.phtml',
- 'templates/partials/app-details-aside-actions.phtml',
- ];
- }
-
- public function testDetailPageFactoryUsesActionPolicyModule(): void
- {
- $content = $this->readProjectFile('web/js/core/app-detail-page-factory.js');
- $this->assertStringContainsString("import { initDetailActionPolicy } from './app-details-action-policy.js';", $content);
- $this->assertStringContainsString('const actionPolicy = initDetailActionPolicy(', $content);
- $this->assertStringContainsString('actionPolicy.isSubmitting()', $content);
- }
-
- public function testDetailsPartialsExposeActionPolicyContract(): void
- {
- $titlebar = $this->readProjectFile('templates/partials/app-details-titlebar.phtml');
- $this->assertStringContainsString('data-detail-action-policy="1"', $titlebar);
- $this->assertStringContainsString('data-detail-action-kind=', $titlebar);
- $this->assertStringContainsString('data-detail-confirm-message=', $titlebar);
-
- $asideActions = $this->readProjectFile('templates/partials/app-details-aside-actions.phtml');
- $this->assertStringContainsString('data-detail-confirm-message=', $asideActions);
-
- $danger = $this->readProjectFile('templates/partials/app-danger-zone-delete-field.phtml');
- $this->assertStringContainsString('data-detail-action-kind="delete"', $danger);
- }
-
- public function testMigratedFilesNoLongerUseInlineConfirmHandlers(): void
- {
- foreach ($this->migratedConfirmFiles() as $file) {
- $content = $this->readProjectFile($file);
- $this->assertStringNotContainsString('onsubmit="return confirm(', $content, $file);
- $this->assertStringNotContainsString('onclick="return confirm(', $content, $file);
- }
- }
-
- public function testMigratedFilesExposeDataDetailConfirmContract(): void
- {
- foreach ($this->migratedConfirmFiles() as $file) {
- $content = $this->readProjectFile($file);
- $this->assertStringContainsString('data-detail-confirm-message', $content, $file);
- }
- }
-}
diff --git a/tests/Architecture/DetailActionPolicyMigrationContractTest.php b/tests/Architecture/DetailActionPolicyMigrationContractTest.php
new file mode 100644
index 0000000..cf866cd
--- /dev/null
+++ b/tests/Architecture/DetailActionPolicyMigrationContractTest.php
@@ -0,0 +1,27 @@
+readProjectFile($file);
+ $this->assertStringNotContainsString('onsubmit="return confirm(', $content, $file);
+ $this->assertStringNotContainsString('onclick="return confirm(', $content, $file);
+ }
+ }
+
+ public function testMigratedFilesExposeDataDetailConfirmContract(): void
+ {
+ foreach (DetailActionPolicyContractFiles::migratedConfirmFiles() as $file) {
+ $content = $this->readProjectFile($file);
+ $this->assertStringContainsString('data-detail-confirm-message', $content, $file);
+ }
+ }
+}
diff --git a/tests/Architecture/DetailActionPolicyPartialContractTest.php b/tests/Architecture/DetailActionPolicyPartialContractTest.php
new file mode 100644
index 0000000..52ca8d3
--- /dev/null
+++ b/tests/Architecture/DetailActionPolicyPartialContractTest.php
@@ -0,0 +1,24 @@
+readProjectFile('templates/partials/app-details-titlebar.phtml');
+ $this->assertStringContainsString('data-detail-action-policy="1"', $titlebar);
+ $this->assertStringContainsString('data-detail-action-kind=', $titlebar);
+ $this->assertStringContainsString('data-detail-confirm-message=', $titlebar);
+
+ $asideActions = $this->readProjectFile('templates/partials/app-details-aside-actions.phtml');
+ $this->assertStringContainsString('data-detail-confirm-message=', $asideActions);
+
+ $danger = $this->readProjectFile('templates/partials/app-danger-zone-delete-field.phtml');
+ $this->assertStringContainsString('data-detail-action-kind="delete"', $danger);
+ }
+}
diff --git a/tests/Architecture/DetailActionPolicyRuntimeContractTest.php b/tests/Architecture/DetailActionPolicyRuntimeContractTest.php
new file mode 100644
index 0000000..7fe1467
--- /dev/null
+++ b/tests/Architecture/DetailActionPolicyRuntimeContractTest.php
@@ -0,0 +1,22 @@
+readProjectFile('web/js/core/app-detail-page-factory.js');
+
+ $this->assertStringContainsString(
+ "import { initDetailActionPolicy } from './app-details-action-policy.js';",
+ $content
+ );
+ $this->assertStringContainsString('const actionPolicy = initDetailActionPolicy(', $content);
+ $this->assertStringContainsString('actionPolicy.isSubmitting()', $content);
+ }
+}
diff --git a/tests/README.md b/tests/README.md
index 983b511..885a49e 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/DetailActionPolicyContractTest.php`
- `tests/Architecture/ContainerFactoryContractTest.php`
- `tests/Architecture/SecurityLoggingContractTest.php`
- `tests/Architecture/StatusTaxonomyContractTest.php`
+- `tests/Architecture/DetailPageContractTest.php`