Completed
Push — master ( e9d211...82b216 )
by Craig
05:41
created

PermissionApiTest::accessLevelNamesProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 0
dl 0
loc 13
rs 9.9
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula Foundation - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\PermissionsModule\Tests\Api;
15
16
use PHPUnit\Framework\Error\Notice;
0 ignored issues
show
Bug introduced by
The type PHPUnit\Framework\Error\Notice was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
17
use Zikula\PermissionsModule\Api\ApiInterface\PermissionApiInterface;
18
use Zikula\PermissionsModule\Api\PermissionApi;
19
use Zikula\UsersModule\Constant;
20
21
class PermissionApiTest extends AbstractPermissionTestCase
22
{
23
    /**
24
     * Call protected/private method of the api class.
25
     *
26
     * @return mixed Method return
27
     * @throws \ReflectionException
28
     */
29
    private function invokeMethod(PermissionApiInterface $api, string $methodName, array $parameters = [])
30
    {
31
        $reflection = new \ReflectionClass(get_class($api));
32
        $method = $reflection->getMethod($methodName);
33
        $method->setAccessible(true);
34
35
        return $method->invokeArgs($api, $parameters);
36
    }
37
38
    /**
39
     * @covers PermissionApi::setGroupPermsForUser
40
     * @dataProvider permProvider
41
     */
42
    public function testSetGroupPermsForUser(int $userId, array $perms): void
43
    {
44
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
45
        $this->invokeMethod($api, 'setGroupPermsForUser', [$userId]);
46
        $this->assertEquals($perms, $api->getGroupPerms($userId));
47
    }
48
49
    /**
50
     * @covers PermissionApi::getSecurityLevel
51
     * @dataProvider secLevelProvider
52
     */
53
    public function testGetSecurityLevel(int $userId, string $component, string $instance, int $expectedLevel): void
54
    {
55
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
56
        $this->invokeMethod($api, 'setGroupPermsForUser', [$userId]);
57
        $perms = $api->getGroupPerms($userId);
58
        $this->assertEquals($expectedLevel, $this->invokeMethod($api, 'getSecurityLevel', [$perms, $component, $instance]));
59
    }
60
61
    /**
62
     * @covers PermissionApi::hasPermission
63
     * @dataProvider uidProvider
64
     */
65
    public function testHasPermission(string $component, string $instance, int $level, int $userId, bool $result): void
66
    {
67
        $this->currentUserApi
68
            ->method('get')
0 ignored issues
show
Bug introduced by
The method method() does not exist on Zikula\UsersModule\Api\A...CurrentUserApiInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Zikula\UsersModule\Api\A...CurrentUserApiInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

68
            ->/** @scrutinizer ignore-call */ 
69
              method('get')
Loading history...
69
            ->with($this->equalTo('uid'))
70
            ->willReturnCallback(static function () use ($userId) {
71
                return $userId ?? Constant::USER_ID_ANONYMOUS;
72
            });
73
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
74
        $this->assertEquals($result, $api->hasPermission($component, $instance, $level, $userId));
75
    }
76
77
    /**
78
     * @covers PermissionApi::accessLevelNames
79
     * @dataProvider accessLevelNamesProvider
80
     */
81
    public function testAccessLevelNames(string $expectedText, int $level): void
82
    {
83
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
84
        $this->assertEquals($expectedText, $api->accessLevelNames($level));
85
    }
86
87
    /**
88
     * @covers PermissionApi::accessLevelNames()
89
     */
90
    public function testAccessLevelArray(): void
91
    {
92
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
93
        $accessNames = [
94
            ACCESS_INVALID => $this->translator->trans('Invalid'),
95
            ACCESS_NONE => $this->translator->trans('No access'),
96
            ACCESS_OVERVIEW => $this->translator->trans('Overview access'),
97
            ACCESS_READ => $this->translator->trans('Read access'),
98
            ACCESS_COMMENT => $this->translator->trans('Comment access'),
99
            ACCESS_MODERATE => $this->translator->trans('Moderate access'),
100
            ACCESS_EDIT => $this->translator->trans('Edit access'),
101
            ACCESS_ADD => $this->translator->trans('Add access'),
102
            ACCESS_DELETE => $this->translator->trans('Delete access'),
103
            ACCESS_ADMIN => $this->translator->trans('Admin access'),
104
        ];
105
        $this->assertEquals($accessNames, $api->accessLevelNames());
106
    }
107
108
    /**
109
     * @covers PermissionApi::accessLevelNames()
110
     */
111
    public function testAccessLevelException(): void
112
    {
113
        $this->expectException(Notice::class);
114
        $api = new PermissionApi($this->permRepo, $this->userRepo, $this->currentUserApi, $this->translator);
115
        $api->accessLevelNames(99);
116
    }
117
118
    public function permProvider(): array
119
    {
120
        return [
121
            [Constant::USER_ID_ADMIN, [
122
                ['component' => '.*',
123
                    'instance' => '.*',
124
                    'level' => ACCESS_ADMIN],
125
                ['component' => 'ExtendedMenublock:.*:.*',
126
                    'instance' => '1:1:.*',
127
                    'level' => ACCESS_NONE],
128
                ['component' => '.*',
129
                    'instance' => '.*',
130
                    'level' => ACCESS_COMMENT],
131
            ]],
132
            [self::RANDOM_USER_ID, [
133
                ['component' => 'ExtendedMenublock:.*:.*',
134
                    'instance' => '1:1:.*',
135
                    'level' => ACCESS_NONE],
136
                ['component' => '.*',
137
                    'instance' => '.*',
138
                    'level' => ACCESS_COMMENT],
139
            ]],
140
            [Constant::USER_ID_ANONYMOUS, [
141
                ['component' => 'ExtendedMenublock:.*:.*',
142
                    'instance' => '1:1:.*',
143
                    'level' => ACCESS_NONE],
144
                ['component' => 'ExtendedMenublock:.*:.*',
145
                    'instance' => '1:(1|2|3):.*',
146
                    'level' => ACCESS_NONE],
147
                ['component' => '.*',
148
                    'instance' => '.*',
149
                    'level' => ACCESS_READ],
150
            ]],
151
        ];
152
    }
153
154
    public function secLevelProvider(): array
155
    {
156
        return [
157
            [Constant::USER_ID_ADMIN, '.*', '.*', ACCESS_ADMIN],
158
            [Constant::USER_ID_ANONYMOUS, '.*', '.*', ACCESS_READ],
159
160
            [Constant::USER_ID_ADMIN, 'ExtendedMenublock::', '1:1:', ACCESS_ADMIN],
161
            [Constant::USER_ID_ANONYMOUS, 'ExtendedMenublock::', '1:1:', ACCESS_NONE],
162
163
            [Constant::USER_ID_ADMIN, 'ExtendedMenublock::', '1:2:', ACCESS_ADMIN],
164
            [Constant::USER_ID_ANONYMOUS, 'ExtendedMenublock::', '1:2:', ACCESS_NONE],
165
        ];
166
    }
167
168
    public function uidProvider(): array
169
    {
170
        return [
171
            ['.*', '.*', ACCESS_OVERVIEW, Constant::USER_ID_ADMIN, true], // #0
172
            ['.*', '.*', ACCESS_READ, Constant::USER_ID_ADMIN, true],
173
            ['.*', '.*', ACCESS_COMMENT, Constant::USER_ID_ADMIN, true],
174
            ['.*', '.*', ACCESS_MODERATE, Constant::USER_ID_ADMIN, true],
175
            ['.*', '.*', ACCESS_EDIT, Constant::USER_ID_ADMIN, true],
176
            ['.*', '.*', ACCESS_ADD, Constant::USER_ID_ADMIN, true],
177
            ['.*', '.*', ACCESS_DELETE, Constant::USER_ID_ADMIN, true],
178
            ['.*', '.*', ACCESS_ADMIN, Constant::USER_ID_ADMIN, true],
179
180
            ['.*', '.*', ACCESS_OVERVIEW, Constant::USER_ID_ANONYMOUS, true], // #8
181
            ['.*', '.*', ACCESS_READ, Constant::USER_ID_ANONYMOUS, true],
182
            ['.*', '.*', ACCESS_COMMENT, Constant::USER_ID_ANONYMOUS, false],
183
            ['.*', '.*', ACCESS_MODERATE, Constant::USER_ID_ANONYMOUS, false],
184
            ['.*', '.*', ACCESS_EDIT, Constant::USER_ID_ANONYMOUS, false],
185
            ['.*', '.*', ACCESS_ADD, Constant::USER_ID_ANONYMOUS, false],
186
            ['.*', '.*', ACCESS_DELETE, Constant::USER_ID_ANONYMOUS, false],
187
            ['.*', '.*', ACCESS_ADMIN, Constant::USER_ID_ANONYMOUS, false],
188
189
            ['.*', '.*', ACCESS_OVERVIEW, self::RANDOM_USER_ID, true], // #16
190
            ['.*', '.*', ACCESS_READ, self::RANDOM_USER_ID, true],
191
            ['.*', '.*', ACCESS_COMMENT, self::RANDOM_USER_ID, true],
192
            ['.*', '.*', ACCESS_MODERATE, self::RANDOM_USER_ID, false],
193
            ['.*', '.*', ACCESS_EDIT, self::RANDOM_USER_ID, false],
194
            ['.*', '.*', ACCESS_ADD, self::RANDOM_USER_ID, false],
195
            ['.*', '.*', ACCESS_DELETE, self::RANDOM_USER_ID, false],
196
            ['.*', '.*', ACCESS_ADMIN, self::RANDOM_USER_ID, false],
197
198
            ['ExtendedMenublock::', '1:1:', ACCESS_OVERVIEW, Constant::USER_ID_ADMIN, true], // #24
199
            ['ExtendedMenublock::', '1:1:', ACCESS_READ, Constant::USER_ID_ADMIN, true],
200
            ['ExtendedMenublock::', '1:1:', ACCESS_COMMENT, Constant::USER_ID_ADMIN, true],
201
            ['ExtendedMenublock::', '1:1:', ACCESS_MODERATE, Constant::USER_ID_ADMIN, true],
202
            ['ExtendedMenublock::', '1:1:', ACCESS_EDIT, Constant::USER_ID_ADMIN, true],
203
            ['ExtendedMenublock::', '1:1:', ACCESS_ADD, Constant::USER_ID_ADMIN, true],
204
            ['ExtendedMenublock::', '1:1:', ACCESS_DELETE, Constant::USER_ID_ADMIN, true],
205
            ['ExtendedMenublock::', '1:1:', ACCESS_ADMIN, Constant::USER_ID_ADMIN, true],
206
207
            ['ExtendedMenublock::', '1:1:', ACCESS_OVERVIEW, Constant::USER_ID_ANONYMOUS, false], // #32
208
            ['ExtendedMenublock::', '1:1:', ACCESS_READ, Constant::USER_ID_ANONYMOUS, false],
209
            ['ExtendedMenublock::', '1:1:', ACCESS_COMMENT, Constant::USER_ID_ANONYMOUS, false],
210
            ['ExtendedMenublock::', '1:1:', ACCESS_MODERATE, Constant::USER_ID_ANONYMOUS, false],
211
            ['ExtendedMenublock::', '1:1:', ACCESS_EDIT, Constant::USER_ID_ANONYMOUS, false],
212
            ['ExtendedMenublock::', '1:1:', ACCESS_ADD, Constant::USER_ID_ANONYMOUS, false],
213
            ['ExtendedMenublock::', '1:1:', ACCESS_DELETE, Constant::USER_ID_ANONYMOUS, false],
214
            ['ExtendedMenublock::', '1:1:', ACCESS_ADMIN, Constant::USER_ID_ANONYMOUS, false],
215
216
            ['ExtendedMenublock::', '1:1:', ACCESS_OVERVIEW, self::RANDOM_USER_ID, false], // #40
217
            ['ExtendedMenublock::', '1:1:', ACCESS_READ, self::RANDOM_USER_ID, false],
218
            ['ExtendedMenublock::', '1:1:', ACCESS_COMMENT, self::RANDOM_USER_ID, false],
219
            ['ExtendedMenublock::', '1:1:', ACCESS_MODERATE, self::RANDOM_USER_ID, false],
220
            ['ExtendedMenublock::', '1:1:', ACCESS_EDIT, self::RANDOM_USER_ID, false],
221
            ['ExtendedMenublock::', '1:1:', ACCESS_ADD, self::RANDOM_USER_ID, false],
222
            ['ExtendedMenublock::', '1:1:', ACCESS_DELETE, self::RANDOM_USER_ID, false],
223
            ['ExtendedMenublock::', '1:1:', ACCESS_ADMIN, self::RANDOM_USER_ID, false],
224
225
            ['ExtendedMenublock::', '1:2:', ACCESS_OVERVIEW, Constant::USER_ID_ADMIN, true], // #48
226
            ['ExtendedMenublock::', '1:2:', ACCESS_READ, Constant::USER_ID_ADMIN, true],
227
            ['ExtendedMenublock::', '1:2:', ACCESS_COMMENT, Constant::USER_ID_ADMIN, true],
228
            ['ExtendedMenublock::', '1:2:', ACCESS_MODERATE, Constant::USER_ID_ADMIN, true],
229
            ['ExtendedMenublock::', '1:2:', ACCESS_EDIT, Constant::USER_ID_ADMIN, true],
230
            ['ExtendedMenublock::', '1:2:', ACCESS_ADD, Constant::USER_ID_ADMIN, true],
231
            ['ExtendedMenublock::', '1:2:', ACCESS_DELETE, Constant::USER_ID_ADMIN, true],
232
            ['ExtendedMenublock::', '1:2:', ACCESS_ADMIN, Constant::USER_ID_ADMIN, true],
233
234
            ['ExtendedMenublock::', '1:2:', ACCESS_OVERVIEW, Constant::USER_ID_ANONYMOUS, false], // #56
235
            ['ExtendedMenublock::', '1:2:', ACCESS_READ, Constant::USER_ID_ANONYMOUS, false],
236
            ['ExtendedMenublock::', '1:2:', ACCESS_COMMENT, Constant::USER_ID_ANONYMOUS, false],
237
            ['ExtendedMenublock::', '1:2:', ACCESS_MODERATE, Constant::USER_ID_ANONYMOUS, false],
238
            ['ExtendedMenublock::', '1:2:', ACCESS_EDIT, Constant::USER_ID_ANONYMOUS, false],
239
            ['ExtendedMenublock::', '1:2:', ACCESS_ADD, Constant::USER_ID_ANONYMOUS, false],
240
            ['ExtendedMenublock::', '1:2:', ACCESS_DELETE, Constant::USER_ID_ANONYMOUS, false],
241
            ['ExtendedMenublock::', '1:2:', ACCESS_ADMIN, Constant::USER_ID_ANONYMOUS, false],
242
243
            ['ExtendedMenublock::', '1:2:', ACCESS_OVERVIEW, self::RANDOM_USER_ID, true], // #64
244
            ['ExtendedMenublock::', '1:2:', ACCESS_READ, self::RANDOM_USER_ID, true],
245
            ['ExtendedMenublock::', '1:2:', ACCESS_COMMENT, self::RANDOM_USER_ID, true],
246
            ['ExtendedMenublock::', '1:2:', ACCESS_MODERATE, self::RANDOM_USER_ID, false],
247
            ['ExtendedMenublock::', '1:2:', ACCESS_EDIT, self::RANDOM_USER_ID, false],
248
            ['ExtendedMenublock::', '1:2:', ACCESS_ADD, self::RANDOM_USER_ID, false],
249
            ['ExtendedMenublock::', '1:2:', ACCESS_DELETE, self::RANDOM_USER_ID, false],
250
            ['ExtendedMenublock::', '1:2:', ACCESS_ADMIN, self::RANDOM_USER_ID, false],
251
252
            ['ExtendedMenublock::', '1:3:', ACCESS_OVERVIEW, Constant::USER_ID_ADMIN, true], // #72
253
            ['ExtendedMenublock::', '1:3:', ACCESS_READ, Constant::USER_ID_ADMIN, true],
254
            ['ExtendedMenublock::', '1:3:', ACCESS_COMMENT, Constant::USER_ID_ADMIN, true],
255
            ['ExtendedMenublock::', '1:3:', ACCESS_MODERATE, Constant::USER_ID_ADMIN, true],
256
            ['ExtendedMenublock::', '1:3:', ACCESS_EDIT, Constant::USER_ID_ADMIN, true],
257
            ['ExtendedMenublock::', '1:3:', ACCESS_ADD, Constant::USER_ID_ADMIN, true],
258
            ['ExtendedMenublock::', '1:3:', ACCESS_DELETE, Constant::USER_ID_ADMIN, true],
259
            ['ExtendedMenublock::', '1:3:', ACCESS_ADMIN, Constant::USER_ID_ADMIN, true],
260
261
            ['ExtendedMenublock::', '1:3:', ACCESS_OVERVIEW, Constant::USER_ID_ANONYMOUS, false], // #80
262
            ['ExtendedMenublock::', '1:3:', ACCESS_READ, Constant::USER_ID_ANONYMOUS, false],
263
            ['ExtendedMenublock::', '1:3:', ACCESS_COMMENT, Constant::USER_ID_ANONYMOUS, false],
264
            ['ExtendedMenublock::', '1:3:', ACCESS_MODERATE, Constant::USER_ID_ANONYMOUS, false],
265
            ['ExtendedMenublock::', '1:3:', ACCESS_EDIT, Constant::USER_ID_ANONYMOUS, false],
266
            ['ExtendedMenublock::', '1:3:', ACCESS_ADD, Constant::USER_ID_ANONYMOUS, false],
267
            ['ExtendedMenublock::', '1:3:', ACCESS_DELETE, Constant::USER_ID_ANONYMOUS, false],
268
            ['ExtendedMenublock::', '1:3:', ACCESS_ADMIN, Constant::USER_ID_ANONYMOUS, false],
269
270
            ['ExtendedMenublock::', '1:3:', ACCESS_OVERVIEW, self::RANDOM_USER_ID, true], // #88
271
            ['ExtendedMenublock::', '1:3:', ACCESS_READ, self::RANDOM_USER_ID, true],
272
            ['ExtendedMenublock::', '1:3:', ACCESS_COMMENT, self::RANDOM_USER_ID, true],
273
            ['ExtendedMenublock::', '1:3:', ACCESS_MODERATE, self::RANDOM_USER_ID, false],
274
            ['ExtendedMenublock::', '1:3:', ACCESS_EDIT, self::RANDOM_USER_ID, false],
275
            ['ExtendedMenublock::', '1:3:', ACCESS_ADD, self::RANDOM_USER_ID, false],
276
            ['ExtendedMenublock::', '1:3:', ACCESS_DELETE, self::RANDOM_USER_ID, false],
277
            ['ExtendedMenublock::', '1:3:', ACCESS_ADMIN, self::RANDOM_USER_ID, false],
278
        ];
279
    }
280
281
    public function accessLevelNamesProvider(): array
282
    {
283
        return [
284
            ['Invalid', ACCESS_INVALID],
285
            ['No access', ACCESS_NONE],
286
            ['Overview access', ACCESS_OVERVIEW],
287
            ['Read access', ACCESS_READ],
288
            ['Comment access', ACCESS_COMMENT],
289
            ['Moderate access', ACCESS_MODERATE],
290
            ['Edit access', ACCESS_EDIT],
291
            ['Add access', ACCESS_ADD],
292
            ['Delete access', ACCESS_DELETE],
293
            ['Admin access', ACCESS_ADMIN],
294
        ];
295
    }
296
}
297