-
Notifications
You must be signed in to change notification settings - Fork 1
/
SecurityAnnotationsExtensionTest.phpt
128 lines (102 loc) · 5.13 KB
/
SecurityAnnotationsExtensionTest.phpt
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
declare(strict_types = 1);
namespace NepadaTests\Bridges\SecurityAnnotationsDI;
use Nepada\SecurityAnnotations;
use Nepada\SecurityAnnotations\AccessValidators\LoggedInValidator;
use Nepada\SecurityAnnotations\AccessValidators\PermissionValidator;
use Nepada\SecurityAnnotations\AccessValidators\RoleValidator;
use NepadaTests\Bridges\SecurityAnnotationsDI\Fixtures\Foo\FooValidator as FooValidator2;
use NepadaTests\Bridges\SecurityAnnotationsDI\Fixtures\FooValidator;
use NepadaTests\Bridges\SecurityAnnotationsDI\Fixtures\LoremIpsum;
use NepadaTests\Environment;
use NepadaTests\SecurityAnnotations\Fixtures\SecuredPresenter;
use NepadaTests\TestCase;
use Nette;
use Tester\Assert;
require_once __DIR__ . '/../../bootstrap.php';
/**
* @testCase
*/
class SecurityAnnotationsExtensionTest extends TestCase
{
private Nette\Configurator $configurator;
public function setUp(): void
{
$this->configurator = new Nette\Configurator();
$this->configurator->setTempDirectory(Environment::getTempDir());
$this->configurator->setDebugMode(true);
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.neon');
}
public function testDefaultValidators(): void
{
$container = $this->configurator->createContainer();
Assert::type(LoggedInValidator::class, $container->getService('securityAnnotations.loggedInValidator'));
Assert::type(RoleValidator::class, $container->getService('securityAnnotations.roleValidator'));
Assert::type(PermissionValidator::class, $container->getService('securityAnnotations.permissionValidator'));
$requirementsChecker = $container->getService('securityAnnotations.requirementsChecker');
Assert::type(SecurityAnnotations\RequirementsChecker::class, $requirementsChecker);
$reflection = new \ReflectionProperty(SecurityAnnotations\RequirementsChecker::class, 'accessValidators');
$reflection->setAccessible(true);
$accessValidators = $reflection->getValue($requirementsChecker);
Assert::type('array', $accessValidators);
Assert::count(3, $accessValidators);
}
public function testCustomValidators(): void
{
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.custom-validators.neon');
$container = $this->configurator->createContainer();
Assert::type(LoggedInValidator::class, $container->getService('securityAnnotations.loggedInValidator'));
Assert::type(FooValidator::class, $container->getService('securityAnnotations.fooValidator'));
Assert::type(FooValidator2::class, $container->getService('securityAnnotations.fooValidator_2'));
$requirementsChecker = $container->getByType(SecurityAnnotations\RequirementsChecker::class);
$reflection = new \ReflectionProperty(SecurityAnnotations\RequirementsChecker::class, 'accessValidators');
$reflection->setAccessible(true);
$accessValidators = $reflection->getValue($requirementsChecker);
Assert::type('array', $accessValidators);
Assert::count(4, $accessValidators);
}
public function testInvalidValidator(): void
{
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.invalid-validator.neon');
Assert::exception(
function (): void {
$this->configurator->createContainer();
},
\LogicException::class,
sprintf('Access validator class \'%s\' must implement AccessValidator interface.', SecuredPresenter::class),
);
}
public function testNotFoundValidator(): void
{
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.not-found-validator.neon');
Assert::exception(
function (): void {
$this->configurator->createContainer();
},
\LogicException::class,
'Access validator class \'NotFoundValidator\' not found.',
);
}
public function testDefaultReader(): void
{
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.doctrine-annotations-enabled.neon');
$expected = [
new SecurityAnnotations\Annotations\Role('attribute'),
new SecurityAnnotations\Annotations\Role('annotation'),
];
/** @var SecurityAnnotations\AnnotationReaders\AnnotationsReader $reader */
$reader = @$this->configurator->createContainer()->getByType(SecurityAnnotations\AnnotationReaders\AnnotationsReader::class);
Assert::equal($expected, $reader->getAll(new \ReflectionClass(LoremIpsum::class)));
}
public function testReaderWithDoctrineAnnotationsDisabled(): void
{
$this->configurator->addConfig(__DIR__ . '/Fixtures/config.doctrine-annotations-disabled.neon');
/** @var SecurityAnnotations\AnnotationReaders\AnnotationsReader $reader */
$reader = $this->configurator->createContainer()->getByType(SecurityAnnotations\AnnotationReaders\AnnotationsReader::class);
Assert::equal(
[new SecurityAnnotations\Annotations\Role('attribute')],
$reader->getAll(new \ReflectionClass(LoremIpsum::class)),
);
}
}
(new SecurityAnnotationsExtensionTest())->run();