Skip to content

Commit 3279ac3

Browse files
authored
chore: add back php architecture tests (#873)
1 parent 60dcc28 commit 3279ac3

File tree

6 files changed

+152
-6
lines changed

6 files changed

+152
-6
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@
5151
"spatie/phpunit-snapshot-assertions": "^5.1.6",
5252
"spaze/phpstan-disallowed-calls": "^4.0",
5353
"symplify/monorepo-builder": "^11.2",
54-
"twig/twig": "^3.16"
54+
"twig/twig": "^3.16",
55+
"phpat/phpat": "^0.11.0"
5556
},
5657
"replace": {
5758
"tempest/auth": "self.version",

phpstan.neon.dist

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
includes:
22
- phpstan-baseline.neon
33
- vendor/spaze/phpstan-disallowed-calls/extension.neon
4-
4+
- vendor/phpat/phpat/extension.neon
5+
services:
6+
-
7+
class: Tests\Tempest\Architecture\ArchitectureTestCase
8+
tags:
9+
- phpat.test
510
parameters:
611
level: 5
712
tmpDir: .cache/phpstan

src/Tempest/Generation/src/Exceptions/FileGenerationAbortedException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
namespace Tempest\Generation\Exceptions;
66

7-
final class FileGenerationAbortedException extends FileGenerationFailedException
7+
final class FileGenerationAbortedException extends FileGenerationException
88
{
99
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Generation\Exceptions;
6+
7+
use Exception;
8+
9+
abstract class FileGenerationException extends Exception
10+
{
11+
}

src/Tempest/Generation/src/Exceptions/FileGenerationFailedException.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
namespace Tempest\Generation\Exceptions;
66

7-
use Exception;
8-
9-
class FileGenerationFailedException extends Exception
7+
final class FileGenerationFailedException extends FileGenerationException
108
{
119
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Tempest\Architecture;
6+
7+
use Attribute;
8+
use PHPat\Selector\Selector;
9+
use PHPat\Test\Builder\Rule;
10+
use PHPat\Test\PHPat;
11+
use Tempest\Framework\Testing\IntegrationTest;
12+
13+
final class ArchitectureTestCase
14+
{
15+
public function test_validation_rules_implement_rule_interface(): Rule
16+
{
17+
return PHPat::rule()
18+
->classes(Selector::inNamespace('Tempest\Validation\Rules'))
19+
->shouldImplement()
20+
->classes(Selector::classname(\Tempest\Validation\Rule::class));
21+
}
22+
23+
public function test_validation_rules_are_attributes(): Rule
24+
{
25+
return PHPat::rule()
26+
->classes(Selector::inNamespace('Tempest\Validation\Rules'))
27+
->shouldApplyAttribute()
28+
->classes(Selector::classname(Attribute::class));
29+
}
30+
31+
public function test_validation_rules_are_final(): Rule
32+
{
33+
return PHPat::rule()
34+
->classes(Selector::inNamespace('Tempest\Validation\Rules'))
35+
->shouldBeFinal();
36+
}
37+
38+
public function test_validation_rules_are_readonly(): Rule
39+
{
40+
return PHPat::rule()
41+
->classes(Selector::inNamespace('Tempest\Validation\Rules'))
42+
->shouldBeReadonly();
43+
}
44+
45+
public function test_unit_tests_do_not_rely_on_application_classes(): Rule
46+
{
47+
return PHPat::rule()
48+
->classes(Selector::inNamespace('Tests\Tempest\Unit'))
49+
->shouldNotDependOn()
50+
->classes(
51+
Selector::inNamespace('Tests\Tempest\Integration'),
52+
Selector::inNamespace('Tempest\Testing'),
53+
);
54+
}
55+
56+
public function test_integration_tests_do_not_rely_on_unit_test_fixtures(): Rule
57+
{
58+
return PHPat::rule()
59+
->classes(Selector::inNamespace('Tests\Tempest\Integration'))
60+
->shouldNotDependOn()
61+
->classes(
62+
Selector::inNamespace('Tests\Tempest\Unit'),
63+
);
64+
}
65+
66+
public function test_all_classes_should_be_final(): Rule
67+
{
68+
return PHPat::rule()
69+
->classes(Selector::AND(
70+
Selector::inNamespace('Tempest'),
71+
Selector::NOT(Selector::isInterface()),
72+
Selector::NOT(Selector::isAbstract()),
73+
))
74+
->shouldBeFinal();
75+
}
76+
77+
public function test_unit_tests_should_not_depend_on_infrastructure_test_tools(): Rule
78+
{
79+
return PHPat::rule()
80+
->classes(
81+
Selector::inNamespace('/^Tempest\\\\.+\\\\Tests/', true),
82+
)
83+
->shouldNotExtend()
84+
->classes(
85+
Selector::inNamespace('Tests\Tempest\Integration'),
86+
Selector::inNamespace('Tempest\Console\Testing'),
87+
Selector::inNamespace('Tempest\Framework\Testing'),
88+
Selector::classname(IntegrationTest::class),
89+
)
90+
->because('Unit tests should test classes in isolation without booting the framework.');
91+
}
92+
93+
public function test_unit_tests_should_not_depend_on_integration_tests(): Rule
94+
{
95+
return PHPat::rule()
96+
->classes(
97+
Selector::inNamespace('/^Tempest\\\\.+\\\\Tests/', true),
98+
)
99+
->shouldNotDependOn()
100+
->classes(
101+
Selector::inNamespace('Tests\Tempest\Integration'),
102+
)
103+
->because('Unit tests should not rely on integration fixtures.');
104+
}
105+
106+
public function test_integration_tests_should_not_depend_on_unit_tests(): Rule
107+
{
108+
return PHPat::rule()
109+
->classes(
110+
Selector::inNamespace('Tests\Tempest\Integration'),
111+
)
112+
->shouldNotDependOn()
113+
->classes(
114+
Selector::inNamespace('/^Tempest\\\\.+\\\\Tests/', true),
115+
)
116+
->because('Integration tests should not rely on unit test fixtures.');
117+
}
118+
119+
public function test_unit_tests_should_not_depend_on_framework_fixtures(): Rule
120+
{
121+
return PHPat::rule()
122+
->classes(
123+
Selector::inNamespace('/^Tempest\\\\.+\\\\Tests/', true),
124+
)
125+
->shouldNotDependOn()
126+
->classes(
127+
Selector::inNamespace('Tests\Tempest\Fixtures'),
128+
)
129+
->because('Unit tests should test objects in isolation, so they should not depend on framework fixtures.');
130+
}
131+
}

0 commit comments

Comments
 (0)