62 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?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()); | ||
|  |     } | ||
|  | } |