AutorizableTraitTest   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 140
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 79
c 1
b 0
f 0
dl 0
loc 140
rs 10
wmc 6

6 Methods

Rating   Name   Duplication   Size   Complexity  
A testItCanAllPermission() 0 29 1
A testItCanAnyPermission() 0 29 1
A testItDenyOverAllGrant() 0 33 1
A testItAttachDetachPermission() 0 15 1
A testItDetachRole() 0 11 1
A testItAttachRole() 0 11 1
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of FlexPHP.
4
 *
5
 * (c) Freddie Gar <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace FlexPHP\GRBAC\Tests\Unit;
11
12
use FlexPHP\GRBAC\Permission;
13
use FlexPHP\GRBAC\Role;
14
use FlexPHP\GRBAC\Tests\Mocks\AutorizableMock;
15
use FlexPHP\GRBAC\Tests\TestCase;
16
17
final class AutorizableTraitTest extends TestCase
18
{
19
    public function testItAttachRole(): void
20
    {
21
        $permission = new Permission('user.read');
22
23
        $role = new Role('ROL' . __LINE__);
24
        $role->grant($permission);
25
26
        $autorizable = new AutorizableMock();
27
        $autorizable->attach($role);
28
29
        $this->assertTrue($autorizable->can($permission->slug()));
30
    }
31
32
    public function testItDetachRole(): void
33
    {
34
        $permission = new Permission('user.read');
35
36
        $role = new Role('ROL' . __LINE__);
37
        $role->grant($permission);
38
39
        $autorizable = new AutorizableMock();
40
        $autorizable->detach($role);
41
42
        $this->assertFalse($autorizable->can($permission->slug()));
43
    }
44
45
    public function testItAttachDetachPermission(): void
46
    {
47
        $permission = new Permission('user.read');
48
49
        $role = new Role('ROL' . __LINE__);
50
        $role->grant($permission);
51
52
        $autorizable = new AutorizableMock();
53
        $autorizable->attach($role);
54
55
        $this->assertTrue($autorizable->can($permission->slug()));
56
57
        $autorizable->detach($role);
58
59
        $this->assertFalse($autorizable->can($permission->slug()));
60
    }
61
62
    public function testItCanAnyPermission(): void
63
    {
64
        $userRead = new Permission('user.read');
65
        $roleA = new Role('ROL' . __LINE__);
66
        $roleA->grant($userRead);
67
68
        $userCreate = new Permission('user.create');
69
        $roleB = new Role('ROL' . __LINE__);
70
        $roleB->grant($userCreate);
71
72
        $autorizable = new AutorizableMock();
73
        $autorizable->attach($roleA);
74
75
        $this->assertTrue($autorizable->canAny([$userRead->slug()]));
76
        $this->assertFalse($autorizable->canAny([$userCreate->slug()]));
77
        $this->assertTrue($autorizable->canAny([$userRead->slug(), $userCreate->slug()]));
78
79
        $autorizable->attach($roleB);
80
81
        $this->assertTrue($autorizable->canAny([$userRead->slug()]));
82
        $this->assertTrue($autorizable->canAny([$userCreate->slug()]));
83
        $this->assertTrue($autorizable->canAny([$userRead->slug(), $userCreate->slug()]));
84
85
        $autorizable->detach($roleA);
86
        $autorizable->detach($roleB);
87
88
        $this->assertFalse($autorizable->canAny([$userRead->slug()]));
89
        $this->assertFalse($autorizable->canAny([$userCreate->slug()]));
90
        $this->assertFalse($autorizable->canAny([$userRead->slug(), $userCreate->slug()]));
91
    }
92
93
    public function testItCanAllPermission(): void
94
    {
95
        $userRead = new Permission('user.read');
96
        $roleA = new Role('ROL' . __LINE__);
97
        $roleA->grant($userRead);
98
99
        $userCreate = new Permission('user.create');
100
        $roleB = new Role('ROL' . __LINE__);
101
        $roleB->grant($userCreate);
102
103
        $autorizable = new AutorizableMock();
104
        $autorizable->attach($roleA);
105
106
        $this->assertTrue($autorizable->canAll([$userRead->slug()]));
107
        $this->assertFalse($autorizable->canAll([$userCreate->slug()]));
108
        $this->assertFalse($autorizable->canAll([$userRead->slug(), $userCreate->slug()]));
109
110
        $autorizable->attach($roleB);
111
112
        $this->assertTrue($autorizable->canAll([$userRead->slug()]));
113
        $this->assertTrue($autorizable->canAll([$userCreate->slug()]));
114
        $this->assertTrue($autorizable->canAll([$userRead->slug(), $userCreate->slug()]));
115
116
        $autorizable->detach($roleA);
117
        $autorizable->detach($roleB);
118
119
        $this->assertFalse($autorizable->canAll([$userRead->slug()]));
120
        $this->assertFalse($autorizable->canAll([$userCreate->slug()]));
121
        $this->assertFalse($autorizable->canAll([$userRead->slug(), $userCreate->slug()]));
122
    }
123
124
    public function testItDenyOverAllGrant(): void
125
    {
126
        $permission = new Permission('user.read');
127
        $roleA = new Role('ROL' . __LINE__);
128
        $roleA->deny($permission);
129
130
        $roleB = new Role('ROL' . __LINE__);
131
        $roleB->grant($permission);
132
133
        $autorizable = new AutorizableMock();
134
        $autorizable->attach($roleA);
135
136
        $this->assertFalse($autorizable->can($permission->slug()));
137
138
        $autorizable->attach($roleB);
139
140
        $this->assertFalse($autorizable->can($permission->slug()));
141
142
        $autorizable->detach($roleA);
143
144
        $this->assertTrue($autorizable->can($permission->slug()));
145
146
        $autorizable->detach($roleB);
147
148
        $this->assertFalse($autorizable->can($permission->slug()));
149
150
        $autorizable->attach($roleB);
151
152
        $this->assertTrue($autorizable->can($permission->slug()));
153
154
        $autorizable->attach($roleA);
155
156
        $this->assertFalse($autorizable->can($permission->slug()));
157
    }
158
}
159