Move from phpat-example

Signed-off-by: Oliver Davies <oliver@oliverdavies.uk>
This commit is contained in:
Oliver Davies 2025-09-25 12:00:00 +01:00
parent b7c3fffbaa
commit 37ad11a9b4
8 changed files with 297 additions and 0 deletions

View file

@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace Tests\Architecture;
use PHPat\Selector\Selector;
use PHPat\Test\Builder\Rule;
use PHPat\Test\PHPat;
final class ArchitectureTest
{
private const ACTION_NAMESPACE = 'App\Action';
function test_action_classes_are_not_suffixed(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldBeNamed(
fqcn: '/^(?!.*Action$).*$/',
regex: TRUE,
);
}
function test_action_classes_are_final(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldBeFinal();
}
function test_action_classes_are_readonly(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldBeReadonly();
}
function test_action_classes_are_invokeable(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldHaveOnlyOnePublicMethodNamed('__invoke');
}
function test_action_classes_do_not_extend_other_classes(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldNotExtend()
->classes(Selector::all());
}
function test_action_classes_do_not_implement_interfaces(): Rule
{
return PHPat::rule()
->classes(Selector::inNamespace(self::ACTION_NAMESPACE))
->shouldNotImplement()
->classes(Selector::all());
}
}