CombinedAdapterTest   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 206
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 103
c 2
b 0
f 0
dl 0
loc 206
rs 10
wmc 13

12 Methods

Rating   Name   Duplication   Size   Complexity  
A loadPolicyWithoutCacheManagerProvider() 0 10 1
A createSutWithoutCacheManager() 0 5 1
A setUp() 0 9 1
A testLoadPolicyCanPopulatePoliciesFromCache() 0 21 1
A testRemoveFilteredPolicyWithoutFieldValuesCallsDefaultAdapter() 0 12 1
A testAddPolicyCallsDefaultAdapter() 0 12 1
A testSavePolicyCallsDefaultAdapter() 0 10 1
A testLoadPolicyCanLoadPoliciesFromCache() 0 11 1
A testLoadPolicyCanStorePoliciesInCache() 0 26 1
A testLoadPolicyCallsAdaptersByDefault() 0 14 2
A testRemoveFilteredPolicyWithFieldValuesCallsDefaultAdapter() 0 14 1
A testRemovePolicyCallsDefaultAdapter() 0 12 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Framework\Authorization;
6
7
use Casbin\Model\Model as CasbinModel;
8
use Casbin\Persist\Adapter as CasbinAdapter;
9
use PHPUnit\Framework\MockObject\MockObject;
10
use PHPUnit\Framework\TestCase;
11
12
class CombinedAdapterTest extends TestCase
13
{
14
    protected const EXAMPLE_CONFIG = <<<'EOF'
15
        [policy_definition]
16
        p = sub, obj, act
17
18
        [role_definition]
19
        g = _, _
20
        EOF;
21
22
    /** @var CombinedAdapter - System Under Test */
23
    protected CombinedAdapter $sut;
24
25
    /** @var CasbinAdapter|MockObject */
26
    protected $defaultAdapterMock;
27
28
    /** @var CacheManager|MockObject */
29
    protected $cacheManagerMock;
30
31
    public function setUp(): void
32
    {
33
        $this->defaultAdapterMock = $this->createMock(CasbinAdapter::class);
34
35
        $this->cacheManagerMock = $this->createMock(CacheManager::class);
36
37
        $this->sut = new CombinedAdapter($this->defaultAdapterMock, $this->cacheManagerMock);
38
39
        parent::setUp();
40
    }
41
42
    public function createSutWithoutCacheManager(): void
43
    {
44
        $this->cacheManagerMock = null;
45
46
        $this->sut = new CombinedAdapter($this->defaultAdapterMock);
47
    }
48
49
    /**
50
     * @return array
51
     */
52
    public function loadPolicyWithoutCacheManagerProvider(): array
53
    {
54
        $adapterMock0 = $this->createMock(CasbinAdapter::class);
55
        $adapterMock1 = $this->createMock(CasbinAdapter::class);
56
        $adapterMock2 = $this->createMock(CasbinAdapter::class);
57
58
        return [
59
            'no-adapters'  => [[]],
60
            'one-adapter'  => [[$adapterMock0]],
61
            'two-adapters' => [[$adapterMock1, $adapterMock2]],
62
        ];
63
    }
64
65
    /**
66
     * @dataProvider loadPolicyWithoutCacheManagerProvider
67
     *
68
     * @param array $adaptersMocks
69
     */
70
    public function testLoadPolicyCallsAdaptersByDefault(array $adaptersMocks): void
71
    {
72
        $this->createSutWithoutCacheManager();
73
74
        $model = new CasbinModel();
75
76
        $this->defaultAdapterMock->expects($this->once())->method('loadPolicy')->with($model);
77
78
        foreach ($adaptersMocks as $adapter) {
79
            $adapter->expects($this->once())->method('loadPolicy')->with($model);
80
            $this->sut->registerAdapter($adapter);
81
        }
82
83
        $this->sut->loadPolicy($model);
84
    }
85
86
    public function testLoadPolicyCanLoadPoliciesFromCache(): void
87
    {
88
        $cacheData = ['g' => [], 'p' => []];
89
90
        $model = new CasbinModel();
91
92
        $this->cacheManagerMock->expects($this->once())->method('getAll')->willReturn($cacheData);
93
94
        $this->defaultAdapterMock->expects($this->never())->method('loadPolicy');
95
96
        $this->sut->loadPolicy($model);
97
    }
98
99
    public function testLoadPolicyCanPopulatePoliciesFromCache(): void
100
    {
101
        $cachedData = [
102
            'g' => [
103
                ['joe', 'admin', '', '', ','],
104
                ['jane', 'user', '', '', ','],
105
            ],
106
            'p' => [
107
                ['user', 'admin_resource_users', 'read', '', ','],
108
                ['admin', 'admin_resource_users', 'write', '', ','],
109
            ],
110
        ];
111
112
        $model = new CasbinModel();
113
        $model->loadModelFromText(static::EXAMPLE_CONFIG);
114
115
        $this->cacheManagerMock->expects($this->once())->method('getAll')->willReturn($cachedData);
116
117
        $this->defaultAdapterMock->expects($this->never())->method('loadPolicy');
118
119
        $this->sut->loadPolicy($model);
120
    }
121
122
    public function testLoadPolicyCanStorePoliciesInCache(): void
123
    {
124
        $cachedData = [
125
            'g' => [
126
                ['joe', 'admin', '', '', ','],
127
                ['jane', 'user', '', '', ','],
128
            ],
129
            'p' => [
130
                ['user', 'admin_resource_users', 'read', '', ','],
131
                ['admin', 'admin_resource_users', 'write', '', ','],
132
            ],
133
        ];
134
135
        $model = new CasbinModel();
136
        $model->loadModelFromText(static::EXAMPLE_CONFIG);
137
138
        $model->addPolicies('g', 'g', $cachedData['g']);
139
        $model->addPolicies('p', 'p', $cachedData['p']);
140
141
        $this->cacheManagerMock->expects($this->once())->method('getAll')->willReturn([]);
142
143
        $this->defaultAdapterMock->expects($this->once())->method('loadPolicy')->with($model);
144
145
        $this->cacheManagerMock->expects($this->once())->method('storeAll')->willReturn(true);
146
147
        $this->sut->loadPolicy($model);
148
    }
149
150
    public function testSavePolicyCallsDefaultAdapter(): void
151
    {
152
        $model = new CasbinModel();
153
154
        $this->defaultAdapterMock
155
            ->expects($this->once())
156
            ->method('savePolicy')
157
            ->with($model);
158
159
        $this->sut->savePolicy($model);
160
    }
161
162
    public function testAddPolicyCallsDefaultAdapter(): void
163
    {
164
        $sec   = 'foo';
165
        $ptype = 'bar';
166
        $rule  = 'baz';
167
168
        $this->defaultAdapterMock
169
            ->expects($this->once())
170
            ->method('addPolicy')
171
            ->with($sec, $ptype, [$rule]);
172
173
        $this->sut->addPolicy($sec, $ptype, [$rule]);
174
    }
175
176
    public function testRemovePolicyCallsDefaultAdapter(): void
177
    {
178
        $sec   = 'foo';
179
        $ptype = 'bar';
180
        $rule  = 'baz';
181
182
        $this->defaultAdapterMock
183
            ->expects($this->once())
184
            ->method('removePolicy')
185
            ->with($sec, $ptype, [$rule]);
186
187
        $this->sut->removePolicy($sec, $ptype, [$rule]);
188
    }
189
190
    public function testRemoveFilteredPolicyWithoutFieldValuesCallsDefaultAdapter(): void
191
    {
192
        $sec        = 'foo';
193
        $ptype      = 'bar';
194
        $fieldIndex = 0;
195
196
        $this->defaultAdapterMock
197
            ->expects($this->once())
198
            ->method('removeFilteredPolicy')
199
            ->with($sec, $ptype, $fieldIndex);
200
201
        $this->sut->removeFilteredPolicy($sec, $ptype, $fieldIndex);
202
    }
203
204
    public function testRemoveFilteredPolicyWithFieldValuesCallsDefaultAdapter(): void
205
    {
206
        $sec         = 'foo';
207
        $ptype       = 'bar';
208
        $fieldIndex  = 0;
209
        $fieldValue0 = 'quix';
210
        $fieldValue1 = 'tata';
211
212
        $this->defaultAdapterMock
213
            ->expects($this->once())
214
            ->method('removeFilteredPolicy')
215
            ->with($sec, $ptype, $fieldIndex, $fieldValue0, $fieldValue1);
216
217
        $this->sut->removeFilteredPolicy($sec, $ptype, $fieldIndex, $fieldValue0, $fieldValue1);
218
    }
219
}
220