Completed
Push — master ( 1db3cd...632e40 )
by Jeroen
24:52 queued 11:31
created

Tests/unit/Helper/Security/Acl/AclHelperTest.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Kunstmaan\AdminBundle\Tests\Helper\Security\Acl;
4
5
use Codeception\Stub;
6
use Doctrine\DBAL\Connection;
7
use Doctrine\DBAL\Driver\Statement;
8
use Doctrine\DBAL\Platforms\AbstractPlatform;
9
use Doctrine\ORM\Configuration;
10
use Doctrine\ORM\EntityManager;
11
use Doctrine\ORM\Mapping\ClassMetadata;
12
use Doctrine\ORM\Mapping\QuoteStrategy;
13
use Doctrine\ORM\NativeQuery;
14
use Doctrine\ORM\Query;
15
use Doctrine\ORM\QueryBuilder;
16
use FOS\UserBundle\Model\UserInterface;
17
use Kunstmaan\AdminBundle\Helper\Security\Acl\AclHelper;
18
use Kunstmaan\AdminBundle\Helper\Security\Acl\Permission\MaskBuilder;
19
use Kunstmaan\AdminBundle\Helper\Security\Acl\Permission\PermissionDefinition;
20
use PHPUnit\Framework\TestCase;
21
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
22
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
23
use Symfony\Component\Security\Core\Role\Role;
24
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
25
26
class AclHelperTest extends TestCase
27
{
28
    /**
29
     * @var EntityManager
30
     */
31
    protected $em;
32
33
    /**
34
     * @var TokenStorageInterface
35
     */
36
    protected $tokenStorage;
37
38
    /**
39
     * @var RoleHierarchyInterface
40
     */
41
    protected $rh;
42
43
    /**
44
     * @var TokenInterface
45
     */
46
    protected $token;
47
48
    /**
49
     * @var UserInterface
50
     */
51
    protected $user;
52
53
    /**
54
     * @var AclHelper
55
     */
56
    protected $object;
57
58
    /**
59
     * Sets up the fixture, for example, opens a network connection.
60
     * This method is called before a test is executed.
61
     */
62
    protected function setUp()
63
    {
64
        $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
65
            ->disableOriginalConstructor()
66
            ->getMock();
67
68
        /* @var $conn Connection */
69
        $conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
70
            ->disableOriginalConstructor()
71
            ->getMock();
72
73
        $conn->expects($this->any())
74
            ->method('getDatabase')
75
            ->will($this->returnValue('myDatabase'));
76
77
        /* @var $platform AbstractPlatform */
78
        $platform = $this->getMockForAbstractClass('Doctrine\DBAL\Platforms\AbstractPlatform');
79
80
        $conn->expects($this->any())
81
            ->method('getDatabasePlatform')
82
            ->will($this->returnValue($platform));
83
84
        /* @var $stmt Statement */
85
        $stmt = Stub::makeEmpty(Statement::class);
86
87
        $conn->expects($this->any())
88
            ->method('executeQuery')
89
            ->will($this->returnValue($stmt));
90
91
        $this->em->expects($this->any())
92
            ->method('getConnection')
93
            ->will($this->returnValue($conn));
94
95
        /* @var $conf Configuration */
96
        $conf = $this->getMockBuilder('Doctrine\ORM\Configuration')
97
            ->disableOriginalConstructor()
98
            ->getMock();
99
100
        /* @var $strat QuoteStrategy */
101
        $strat = $this->getMockBuilder('Doctrine\ORM\Mapping\QuoteStrategy')
102
            ->disableOriginalConstructor()
103
            ->getMock();
104
105
        $strat->expects($this->any())
106
            ->method('getTableName')
107
            ->will($this->returnValue('rootTable'));
108
109
        $conf->expects($this->any())
110
            ->method('getQuoteStrategy')
111
            ->will($this->returnValue($strat));
112
113
        $conf->expects($this->any())
114
            ->method('getDefaultQueryHints')
115
            ->willReturn(array());
116
117
        $conf->expects($this->any())
118
            ->method('isSecondLevelCacheEnabled')
119
            ->willReturn(false);
120
121
        $this->em->expects($this->any())
122
            ->method('getConfiguration')
123
            ->will($this->returnValue($conf));
124
125
        /* @var $meta ClassMetadata */
126
        $meta = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')
127
            ->disableOriginalConstructor()
128
            ->getMock();
129
130
        $this->em->expects($this->any())
131
            ->method('getClassMetadata')
132
            ->will($this->returnValue($meta));
133
134
        $this->tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')
135
            ->getMock();
136
137
        $this->token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')
138
            ->getMock();
139
140
        $this->tokenStorage->expects($this->any())
141
            ->method('getToken')
142
            ->will($this->returnValue($this->token));
143
144
        $this->rh = $this->getMockBuilder('Symfony\Component\Security\Core\Role\RoleHierarchyInterface')
145
            ->getMock();
146
147
        $this->object = new AclHelper($this->em, $this->tokenStorage, $this->rh);
148
    }
149
150
    public function testConstructor()
151
    {
152
        new AclHelper($this->em, $this->tokenStorage, $this->rh);
153
    }
154
155
    public function testApply()
156
    {
157
        /* @var $queryBuilder QueryBuilder */
158
        $queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
159
            ->disableOriginalConstructor()
160
            ->getMock();
161
162
        $query = new Query($this->em);
163
        $query->setParameter('paramName', 'paramValue', 'paramType');
164
        $queryBuilder->expects($this->any())
165
            ->method('getQuery')
166
            ->will($this->returnValue($query));
167
168
        $queryBuilder->expects($this->once())
169
            ->method('getRootEntities')
170
            ->will($this->returnValue(array('Kunstmaan\NodeBundle\Entity\Node')));
171
172
        $queryBuilder->expects($this->once())
173
            ->method('getRootAliases')
174
            ->will($this->returnValue(array('n')));
175
176
        $user = $this->getMockBuilder('FOS\UserBundle\Model\UserInterface')
177
            ->getMock();
178
179
        $user->expects($this->any())
180
            ->method('getUsername')
181
            ->will($this->returnValue('MyUser'));
182
183
        $this->token->expects($this->any())
184
            ->method('getUser')
185
            ->will($this->returnValue($user));
186
187
        $roles = array(new Role('ROLE_KING'));
188
        $allRoles = array($roles[0], new Role('ROLE_SUBJECT'));
189
190
        $this->token->expects($this->once())
191
            ->method('getRoles')
192
            ->will($this->returnValue($roles));
193
194
        $this->rh->expects($this->once())
195
            ->method('getReachableRoles')
196
            ->with($roles)
197
            ->will($this->returnValue($allRoles));
198
199
        $permissionDef = new PermissionDefinition(array('view'), 'Kunstmaan\NodeBundle\Entity\Node');
200
201
        /* @var $query Query */
202
        $query = $this->object->apply($queryBuilder, $permissionDef);
203
204
        $this->assertEquals(MaskBuilder::MASK_VIEW, $query->getHint('acl.mask'));
205
        $this->assertEquals($permissionDef->getEntity(), $query->getHint('acl.root.entity'));
206
        $this->assertEquals('rootTable', $query->getHint('acl.entityRootTableName'));
207
        $this->assertEquals('n', $query->getHint('acl.entityRootTableDqlAlias'));
208
209
        $aclQuery = $query->getHint('acl.extra.query');
210
        $this->assertContains('"ROLE_SUBJECT"', $aclQuery);
211
        $this->assertContains('"ROLE_KING"', $aclQuery);
212
        $this->assertContains('"IS_AUTHENTICATED_ANONYMOUSLY"', $aclQuery);
213
        $this->assertContains('MyUser', $aclQuery);
214
    }
215
216
    public function testApplyAnonymous()
217
    {
218
        /* @var $queryBuilder QueryBuilder */
219
        $queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
220
            ->disableOriginalConstructor()
221
            ->getMock();
222
223
        $query = new Query($this->em);
224
        $query->setParameter('paramName', 'paramValue', 'paramType');
225
        $queryBuilder->expects($this->any())
226
            ->method('getQuery')
227
            ->will($this->returnValue($query));
228
229
        $queryBuilder->expects($this->once())
230
            ->method('getRootEntities')
231
            ->will($this->returnValue(array('Kunstmaan\NodeBundle\Entity\Node')));
232
233
        $queryBuilder->expects($this->once())
234
            ->method('getRootAliases')
235
            ->will($this->returnValue(array('n')));
236
237
        $roles = array();
238
239
        $this->token->expects($this->once())
240
            ->method('getRoles')
241
            ->will($this->returnValue($roles));
242
243
        $this->rh->expects($this->once())
244
            ->method('getReachableRoles')
245
            ->with($roles)
246
            ->will($this->returnValue($roles));
247
248
        $this->token->expects($this->any())
249
            ->method('getUser')
250
            ->will($this->returnValue('anon.'));
251
252
        $permissionDef = new PermissionDefinition(array('view'), 'Kunstmaan\NodeBundle\Entity\Node');
253
254
        /* @var $query Query */
255
        $query = $this->object->apply($queryBuilder, $permissionDef);
256
257
        $this->assertEquals(MaskBuilder::MASK_VIEW, $query->getHint('acl.mask'));
258
        $this->assertEquals($permissionDef->getEntity(), $query->getHint('acl.root.entity'));
259
        $this->assertEquals('rootTable', $query->getHint('acl.entityRootTableName'));
260
        $this->assertEquals('n', $query->getHint('acl.entityRootTableDqlAlias'));
261
262
        $aclQuery = $query->getHint('acl.extra.query');
263
        $this->assertContains('"IS_AUTHENTICATED_ANONYMOUSLY"', $aclQuery);
264
    }
265
266
    public function testGetAllowedEntityIds()
267
    {
268
        $roles = array(new Role('ROLE_KING'));
269
        $allRoles = array($roles[0], new Role('ROLE_SUBJECT'));
270
271
        $this->token->expects($this->once())
272
            ->method('getRoles')
273
            ->will($this->returnValue($roles));
274
275
        $this->rh->expects($this->once())
276
            ->method('getReachableRoles')
277
            ->with($roles)
278
            ->will($this->returnValue($allRoles));
279
280
        $user = $this->getMockBuilder('FOS\UserBundle\Model\UserInterface')
281
            ->getMock();
282
283
        $user->expects($this->any())
284
            ->method('getUsername')
285
            ->will($this->returnValue('MyUser'));
286
287
        $this->token->expects($this->any())
288
            ->method('getUser')
289
            ->will($this->returnValue($user));
290
291
        $hydrator = $this->getMockBuilder('Doctrine\ORM\Internal\Hydration\ScalarHydrator')
292
            ->disableOriginalConstructor()
293
            ->getMock();
294
295
        $rows = array(
296
            array('id' => 1),
297
            array('id' => 9),
298
        );
299
300
        $hydrator->expects($this->once())
301
            ->method('hydrateAll')
302
            ->will($this->returnValue($rows));
303
304
        $this->em->expects($this->any())
305
          ->method('newHydrator') // was ->method('getHydrator')
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
306
          ->will($this->returnValue($hydrator));
307
308
        /* @var $query NativeQuery */
309
        $query = new NativeQuery($this->em);
310
311
        $this->em->expects($this->once())
312
            ->method('createNativeQuery')
313
            ->will($this->returnValue($query));
314
315
        $permissionDef = new PermissionDefinition(array('view'), 'Kunstmaan\NodeBundle\Entity\Node', 'n');
316
317
        /* @var $result array */
318
        $result = $this->object->getAllowedEntityIds($permissionDef);
319
320
        $this->assertEquals(array(1, 9), $result);
321
    }
322
323
    public function testGetAllowedEntityIdsNoEntity()
324
    {
325
        $this->expectException('InvalidArgumentException');
326
327
        $this->object->getAllowedEntityIds(new PermissionDefinition(array('view')));
328
    }
329
330
    public function testGetTokenStorage()
331
    {
332
        $this->assertSame($this->tokenStorage, $this->object->getTokenStorage());
333
    }
334
}
335