From f6046c91685cff256b788cc580666349e4d67005 Mon Sep 17 00:00:00 2001 From: fs Date: Thu, 19 Mar 2026 19:03:10 +0100 Subject: [PATCH] Split detail action policy contracts --- phpunit.xml | 4 +- .../DetailActionPolicyContractFiles.php | 25 +++++++ .../DetailActionPolicyContractTest.php | 68 ------------------- ...etailActionPolicyMigrationContractTest.php | 27 ++++++++ .../DetailActionPolicyPartialContractTest.php | 24 +++++++ .../DetailActionPolicyRuntimeContractTest.php | 22 ++++++ tests/README.md | 2 +- 7 files changed, 102 insertions(+), 70 deletions(-) create mode 100644 tests/Architecture/DetailActionPolicyContractFiles.php delete mode 100644 tests/Architecture/DetailActionPolicyContractTest.php create mode 100644 tests/Architecture/DetailActionPolicyMigrationContractTest.php create mode 100644 tests/Architecture/DetailActionPolicyPartialContractTest.php create mode 100644 tests/Architecture/DetailActionPolicyRuntimeContractTest.php 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`