-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathArchitectureTest.php
More file actions
103 lines (90 loc) · 3.59 KB
/
ArchitectureTest.php
File metadata and controls
103 lines (90 loc) · 3.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
declare(strict_types=1);
use PhpParser\Node;
use PhpParser\ParserFactory;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;
use PHPUnit\Framework\TestCase;
final class ArchitectureTest extends TestCase
{
private array $forbiddenFunctions = ["var_dump", "dd", "dump"];
private function getPhpFiles(string $dir): array
{
$files = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir),
);
foreach ($iterator as $file) {
if ($file->isFile() && $file->getExtension() === "php") {
$files[] = $file->getPathname();
}
}
return $files;
}
public function testNoForbiddenGlobals(): void
{
// Use the newest supported parser API
$parser = (new ParserFactory())->createForNewestSupportedVersion();
$errors = [];
foreach ($this->getPhpFiles(__DIR__ . "/../src") as $filePath) {
$code = file_get_contents($filePath);
try {
$ast = $parser->parse($code);
} catch (\PhpParser\Error $e) {
$errors[] = "Parse error in $filePath: {$e->getMessage()}";
continue;
}
$traverser = new NodeTraverser();
$traverser->addVisitor(
new class ($filePath, $this->forbiddenFunctions, $errors) extends NodeVisitorAbstract {
private readonly array $forbiddenFunctions;
private array $errors;
public function __construct(
private readonly string $filePath,
array $forbiddenFunctions,
array &$errors,
) {
$this->forbiddenFunctions = array_map(
strtolower(...),
$forbiddenFunctions,
);
$this->errors = &$errors;
}
public function enterNode(Node $node): void
{
if ($node instanceof Node\Expr\FuncCall) {
$name = $node->name;
if ($name instanceof Node\Name) {
$func = strtolower($name->toString());
if (
in_array(
$func,
$this->forbiddenFunctions,
true,
)
) {
if (
str_ends_with(
$this->filePath,
"ExportableBlock.php",
)
&& $node->getStartLine() === 35
) {
// skip
} else {
$this->errors[] = "Forbidden function '$func()' used in {$this->filePath} on line {$node->getStartLine()}";
}
}
}
}
}
},
);
$traverser->traverse($ast);
}
$this->assertEmpty(
$errors,
"Forbidden global functions found:\n" . implode("\n", $errors),
);
}
}