From bbbeea6cde5c65169cc7990466e6401ae476a06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Fri, 14 Aug 2026 11:33:29 +0200 Subject: [PATCH] test(architecture): update Application and Domain tests for readonly checks Refactor tests to utilize enumsIn function for better maintainability. --- tests/Architecture/ApplicationTest.php | 23 ++++++++++++++++++++++- tests/Architecture/DomainTest.php | 8 ++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/tests/Architecture/ApplicationTest.php b/tests/Architecture/ApplicationTest.php index 2907c3c..b108cd4 100644 --- a/tests/Architecture/ApplicationTest.php +++ b/tests/Architecture/ApplicationTest.php @@ -4,6 +4,25 @@ declare(strict_types=1); namespace Tests\Architecture; +/** @return array */ +function enumsIn(string $namespace): array +{ + $dir = dirname(__DIR__, 2) . '/src/' . str_replace('\\', '/', $namespace); + $enums = []; + if (! is_dir($dir)) { + return $enums; + } + + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir)) as $file) { + $class = $namespace . str_replace([$dir, '.php', '/'], ['', '', '\\'], $file->getPathname()); + if ($file->isFile() && enum_exists($class)) { + $enums[] = $class; + } + } + + return $enums; +} + describe('Application Architecture Rules', function (): void { arch('Application layer does not depend on Presentation, Infra, or App') ->expect('Application') @@ -24,8 +43,10 @@ describe('Application Architecture Rules', function (): void { arch('Application Usecase classes are final and readonly') ->expect('Application\Usecase') + ->classes() ->toBeReadonly() - ->toBeFinal(); + ->toBeFinal() + ->ignoring(enumsIn('Application\Usecase')); arch('Application layer must not contain Presenters') ->expect('Application') diff --git a/tests/Architecture/DomainTest.php b/tests/Architecture/DomainTest.php index 98a666c..ca0c4bc 100644 --- a/tests/Architecture/DomainTest.php +++ b/tests/Architecture/DomainTest.php @@ -50,12 +50,8 @@ describe('Domain Architecture Rules', function (): void { arch('Domain Value Objects are readonly') ->expect('Domain\Models\ValueObjects') - ->toBeReadonly() - ->ignoring([ - 'Domain\Models\ValueObjects\Employees\EmployeeSortColumn', - 'Domain\Models\ValueObjects\Inco\PortionType', - 'Domain\Models\ValueObjects\IncoCompo\IncoCompoPartDto', - ]); + ->classes() + ->toBeReadonly(); arch('Domain exceptions extend native DomainException') ->expect('Domain\Exceptions')