Split status taxonomy contracts

This commit is contained in:
2026-03-19 19:11:03 +01:00
parent 5582a55208
commit 2de0039d4f
8 changed files with 116 additions and 60 deletions

View File

@@ -26,7 +26,11 @@
<file>tests/Architecture/ModuleProviderContractTest.php</file>
<file>tests/Architecture/ModuleUiContractTest.php</file>
<file>tests/Architecture/RepositoryInterfaceContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyDataContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyEnumContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyFilterSchemaContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyLiteralGuardContractTest.php</file>
<file>tests/Architecture/StatusTaxonomyUiContractTest.php</file>
</testsuite>
<testsuite name="ArchitectureSecurity">
<file>tests/Architecture/AuthzAdminMasterDataContractTest.php</file>

View File

@@ -2,16 +2,12 @@
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
class StatusTaxonomyContractTest extends TestCase
final class StatusTaxonomyContractFiles
{
use ProjectFileAssertionSupport;
/**
* @return list<string>
*/
private function taxonomyEnumFiles(): array
public static function taxonomyEnumFiles(): array
{
return [
'lib/Domain/Taxonomy/SystemAuditOutcome.php',
@@ -32,7 +28,7 @@ class StatusTaxonomyContractTest extends TestCase
/**
* @return array<string,list<string>>
*/
private function taxonomySchemaExpectations(): array
public static function taxonomySchemaExpectations(): array
{
return [
'pages/admin/system-audit/filter-schema.php' => [
@@ -63,7 +59,7 @@ class StatusTaxonomyContractTest extends TestCase
/**
* @return list<string>
*/
private function taxonomyDataEndpointFiles(): array
public static function taxonomyDataEndpointFiles(): array
{
return [
'pages/admin/system-audit/data().php',
@@ -79,7 +75,7 @@ class StatusTaxonomyContractTest extends TestCase
/**
* @return list<string>
*/
private function taxonomyLiteralGuardFiles(): array
public static function taxonomyLiteralGuardFiles(): array
{
return [
'lib/Service/Audit/SystemAuditService.php',
@@ -113,39 +109,12 @@ class StatusTaxonomyContractTest extends TestCase
];
}
public function testTaxonomyEnumFilesUseSharedTraitAndRequiredMethods(): void
/**
* @return list<string>
*/
public static function forbiddenLiteralPatterns(): array
{
foreach ($this->taxonomyEnumFiles() as $file) {
$content = $this->readProjectFile($file);
$this->assertStringContainsString('enum ', $content, $file);
$this->assertStringContainsString('use SupportsStringTaxonomy;', $content, $file);
$this->assertStringContainsString('function labelToken()', $content, $file);
$this->assertStringContainsString('function badgeVariant()', $content, $file);
}
}
public function testFilterSchemasReadTaxonomyValuesFromEnums(): void
{
foreach ($this->taxonomySchemaExpectations() as $file => $snippets) {
$content = $this->readProjectFile($file);
foreach ($snippets as $snippet) {
$this->assertStringContainsString($snippet, $content, $file);
}
}
}
public function testDataEndpointsUseEnumBasedBadgeAndLabelResolution(): void
{
foreach ($this->taxonomyDataEndpointFiles() as $file) {
$content = $this->readProjectFile($file);
$this->assertStringContainsString('->badgeVariant()', $content, $file);
$this->assertStringContainsString('->labelToken()', $content, $file);
}
}
public function testNoLegacyLiteralTaxonomyChecksRemainInMigratedFiles(): void
{
$forbiddenPatterns = [
return [
"/\\bstatus\\s*=\\s*'(running|success|partial|failed|skipped|queued|sent|active|inactive)'/",
"/\\boutcome\\s*=\\s*'(success|failed|denied)'/",
"/\\bchannel\\s*=\\s*'(web|api|scheduler|cli)'/",
@@ -155,22 +124,5 @@ class StatusTaxonomyContractTest extends TestCase
"/['\\\"]actions['\\\"]\\s*=>\\s*'restore'/",
"/in_array\\([^\\n]*\\[(?:[^\\]]*'(?:success|failed|denied|running|partial|skipped|queued|sent|active|inactive|scheduler|manual|web|api|cli|deactivate|delete|restore|ok|lock_not_acquired|unexpected_error)')/",
];
foreach ($this->taxonomyLiteralGuardFiles() as $file) {
$content = $this->readProjectFile($file);
foreach ($forbiddenPatterns as $pattern) {
$this->assertSame(0, preg_match($pattern, $content), $file . ' pattern=' . $pattern);
}
}
}
public function testImportAuditIndexTemplateDoesNotUseLegacyStatusMapper(): void
{
$content = $this->readProjectFile('pages/admin/import-audit/index(default).phtml');
$moduleContent = $this->readProjectFile('web/js/pages/admin-import-audit-index.js');
$this->assertStringNotContainsString('const statusLabel = (value) =>', $moduleContent);
$this->assertStringNotContainsString("if (key === 'running')", $moduleContent);
$this->assertStringContainsString('cell.label || \'-\'', $moduleContent);
$this->assertStringContainsString("assetVersion('js/pages/admin-import-audit-index.js')", $content);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
final class StatusTaxonomyDataContractTest extends TestCase
{
use ProjectFileAssertionSupport;
public function testDataEndpointsUseEnumBasedBadgeAndLabelResolution(): void
{
foreach (StatusTaxonomyContractFiles::taxonomyDataEndpointFiles() as $file) {
$content = $this->readProjectFile($file);
$this->assertStringContainsString('->badgeVariant()', $content, $file);
$this->assertStringContainsString('->labelToken()', $content, $file);
}
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
final class StatusTaxonomyEnumContractTest extends TestCase
{
use ProjectFileAssertionSupport;
public function testTaxonomyEnumFilesUseSharedTraitAndRequiredMethods(): void
{
foreach (StatusTaxonomyContractFiles::taxonomyEnumFiles() as $file) {
$content = $this->readProjectFile($file);
$this->assertStringContainsString('enum ', $content, $file);
$this->assertStringContainsString('use SupportsStringTaxonomy;', $content, $file);
$this->assertStringContainsString('function labelToken()', $content, $file);
$this->assertStringContainsString('function badgeVariant()', $content, $file);
}
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
final class StatusTaxonomyFilterSchemaContractTest extends TestCase
{
use ProjectFileAssertionSupport;
public function testFilterSchemasReadTaxonomyValuesFromEnums(): void
{
foreach (StatusTaxonomyContractFiles::taxonomySchemaExpectations() as $file => $snippets) {
$content = $this->readProjectFile($file);
foreach ($snippets as $snippet) {
$this->assertStringContainsString($snippet, $content, $file);
}
}
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
final class StatusTaxonomyLiteralGuardContractTest extends TestCase
{
use ProjectFileAssertionSupport;
public function testNoLegacyLiteralTaxonomyChecksRemainInMigratedFiles(): void
{
foreach (StatusTaxonomyContractFiles::taxonomyLiteralGuardFiles() as $file) {
$content = $this->readProjectFile($file);
foreach (StatusTaxonomyContractFiles::forbiddenLiteralPatterns() as $pattern) {
$this->assertSame(0, preg_match($pattern, $content), $file . ' pattern=' . $pattern);
}
}
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace MintyPHP\Tests\Architecture;
use PHPUnit\Framework\TestCase;
final class StatusTaxonomyUiContractTest extends TestCase
{
use ProjectFileAssertionSupport;
public function testImportAuditIndexTemplateDoesNotUseLegacyStatusMapper(): void
{
$content = $this->readProjectFile('pages/admin/import-audit/index(default).phtml');
$moduleContent = $this->readProjectFile('web/js/pages/admin-import-audit-index.js');
$this->assertStringNotContainsString('const statusLabel = (value) =>', $moduleContent);
$this->assertStringNotContainsString("if (key === 'running')", $moduleContent);
$this->assertStringContainsString('cell.label || \'-\'', $moduleContent);
$this->assertStringContainsString("assetVersion('js/pages/admin-import-audit-index.js')", $content);
}
}

View File

@@ -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/StatusTaxonomyContractTest.php`
- `tests/Architecture/AuthLoginAccessibilityContractTest.php`
- `tests/Architecture/SecurityCryptoContractTest.php`
- `tests/Architecture/AsideNavigationContractTest.php`