Completed
Push — master ( 6a9705...322f11 )
by
unknown
27:56
created

getCachedPermissionService()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\PermissionCriterionHandlerTest class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 */
9
namespace eZ\Publish\Core\Repository\Permission;
10
11
/**
12
 * Avoid test failure caused by time passing between generating expected & actual object.
13
 *
14
 * @return int
15
 */
16
function time()
17
{
18
    static $time = 1417624981;
19
20
    return ++$time;
21
}
22
23
namespace eZ\Publish\Core\Repository\Tests\Permission;
24
25
use eZ\Publish\API\Repository\Repository;
26
use eZ\Publish\API\Repository\PermissionResolver;
27
use eZ\Publish\API\Repository\PermissionCriterionResolver;
28
use eZ\Publish\API\Repository\Values\ValueObject;
29
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
30
use eZ\Publish\API\Repository\Values\User\UserReference;
31
use eZ\Publish\Core\Repository\Permission\CachedPermissionService;
32
use PHPUnit\Framework\TestCase;
33
34
/**
35
 * Mock test case for CachedPermissionService.
36
 */
37
class CachedPermissionServiceTest extends TestCase
38
{
39
    public function providerForTestPermissionResolverPassTrough()
40
    {
41
        $valueObject = $this
42
            ->getMockBuilder(ValueObject::class)
43
            ->disableOriginalConstructor()
44
            ->getMockForAbstractClass();
45
46
        $userRef = $this
47
            ->getMockBuilder(UserReference::class)
48
            ->disableOriginalConstructor()
49
            ->getMockForAbstractClass();
50
51
        $repository = $this
52
            ->getMockBuilder(Repository::class)
53
            ->disableOriginalConstructor()
54
            ->getMockForAbstractClass();
55
56
        return [
57
            ['getCurrentUserReference', [], $userRef],
58
            ['setCurrentUserReference', [$userRef], null],
59
            ['hasAccess', ['content', 'remove', $userRef], false],
60
            ['canUser', ['content', 'remove', $valueObject, [new \stdClass()]], true],
61
            ['sudo', [function () {}, $repository], null],
62
        ];
63
    }
64
65
    /**
66
     * Test for all PermissionResolver methods when they just pass true to underlying service.
67
     *
68
     * @dataProvider providerForTestPermissionResolverPassTrough
69
     *
70
     * @param $method
71
     * @param array $arguments
72
     * @param $return
73
     */
74
    public function testPermissionResolverPassTrough($method, array $arguments, $expectedReturn)
75
    {
76
        $this->getPermissionResolverMock([$method])
77
            ->expects($this->once())
78
            ->method($method)
79
            ->with(...$arguments)
80
            ->willReturn($expectedReturn);
81
82
        $cachedService = $this->getCachedPermissionService();
83
84
        $actualReturn = $cachedService->$method(...$arguments);
85
        $this->assertSame($expectedReturn, $actualReturn);
86
    }
87
88
    public function testGetPermissionsCriterionPassTrough()
89
    {
90
        $criterionMock = $this
91
            ->getMockBuilder(Criterion::class)
92
            ->disableOriginalConstructor()
93
            ->getMockForAbstractClass();
94
95
        $this->getPermissionCriterionResolverMock(['getPermissionsCriterion'])
96
            ->expects($this->once())
97
            ->method('getPermissionsCriterion')
98
            ->with('content', 'remove')
99
            ->willReturn($criterionMock);
100
101
        $cachedService = $this->getCachedPermissionService();
102
103
        $actualReturn = $cachedService->getPermissionsCriterion('content', 'remove');
104
        $this->assertSame($criterionMock, $actualReturn);
105
    }
106
107
    public function testGetPermissionsCriterionCaching()
108
    {
109
        $criterionMock = $this
110
            ->getMockBuilder(Criterion::class)
111
            ->disableOriginalConstructor()
112
            ->getMockForAbstractClass();
113
114
        $this->getPermissionCriterionResolverMock(['getPermissionsCriterion'])
115
            ->expects($this->exactly(2))
116
            ->method('getPermissionsCriterion')
117
            ->with('content', 'read')
118
            ->willReturn($criterionMock);
119
120
        $cachedService = $this->getCachedPermissionService(2);
121
122
        $actualReturn = $cachedService->getPermissionsCriterion('content', 'read');
123
        $this->assertSame($criterionMock, $actualReturn);
124
125
        // +1
126
        $actualReturn = $cachedService->getPermissionsCriterion('content', 'read');
127
        $this->assertSame($criterionMock, $actualReturn);
128
129
        // +3, time() will be called twice and cache will be updated
130
        $actualReturn = $cachedService->getPermissionsCriterion('content', 'read');
131
        $this->assertSame($criterionMock, $actualReturn);
132
    }
133
134
    public function testSetCurrentUserReferenceCacheClear(): void
135
    {
136
        $criterionMock = $this
137
            ->getMockBuilder(Criterion::class)
138
            ->disableOriginalConstructor()
139
            ->getMockForAbstractClass();
140
141
        $this->getPermissionCriterionResolverMock(['getPermissionsCriterion'])
142
            ->expects($this->once())
143
            ->method('getPermissionsCriterion')
144
            ->with('content', 'read')
145
            ->willReturn($criterionMock);
146
147
        $cachedService = $this->getCachedPermissionService(2);
148
149
        $actualReturn = $cachedService->getPermissionsCriterion('content', 'read');
150
        $this->assertSame($criterionMock, $actualReturn);
151
152
        $userRef = $this
153
            ->getMockBuilder(UserReference::class)
154
            ->getMockForAbstractClass();
155
        $cachedService->setCurrentUserReference($userRef);
156
    }
157
158
    /**
159
     * Returns the CachedPermissionService to test against.
160
     *
161
     * @param int $ttl
162
     *
163
     * @return \eZ\Publish\Core\Repository\Permission\CachedPermissionService
164
     */
165
    protected function getCachedPermissionService($ttl = 5)
166
    {
167
        return new CachedPermissionService(
168
            $this->getPermissionResolverMock(),
169
            $this->getPermissionCriterionResolverMock(),
170
            $ttl
171
        );
172
    }
173
174
    protected $permissionResolverMock;
175
176 View Code Duplication
    protected function getPermissionResolverMock($methods = [])
177
    {
178
        // Tests first calls here with methods set before initiating PermissionCriterionResolver with same instance.
179
        if ($this->permissionResolverMock !== null) {
180
            return $this->permissionResolverMock;
181
        }
182
183
        return $this->permissionResolverMock = $this
184
            ->getMockBuilder(PermissionResolver::class)
185
            ->setMethods($methods)
186
            ->disableOriginalConstructor()
187
            ->getMockForAbstractClass();
188
    }
189
190
    protected $permissionCriterionResolverMock;
191
192 View Code Duplication
    protected function getPermissionCriterionResolverMock($methods = [])
193
    {
194
        // Tests first calls here with methods set before initiating PermissionCriterionResolver with same instance.
195
        if ($this->permissionCriterionResolverMock !== null) {
196
            return $this->permissionCriterionResolverMock;
197
        }
198
199
        return $this->permissionCriterionResolverMock = $this
200
            ->getMockBuilder(PermissionCriterionResolver::class)
201
            ->setMethods($methods)
202
            ->disableOriginalConstructor()
203
            ->getMockForAbstractClass();
204
    }
205
}
206