Test Failed
Push — master ( 3e2a92...25f24e )
by Simon
04:45 queued 02:25
created

AccessControlTest::testGetAllSecuredRoutes()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
nop 0
1
<?php
2
3
namespace Sil\RouteSecurityBundle\Tests\Security;
4
5
use PHPUnit\Framework\TestCase;
6
use Sil\RouteSecurityBundle\Exception\LogicException;
7
use Sil\RouteSecurityBundle\Interfaces\NamingStrategyInterface;
8
use Sil\RouteSecurityBundle\Security\AccessControl;
9
use Symfony\Component\Routing\RouteCollection;
10
use Symfony\Component\Routing\RouterInterface;
11
use Symfony\Component\Security\Core\User\UserInterface;
12
13
class AccessControlTest extends TestCase
14
{
15
    public function testHasUserAccessToRoute()
16
    {
17
        $accessControl = $this->createFreshAccessControl();
18
        $user = $this->mockUser();
19
        $this->assertTrue($accessControl->hasUserAccessToRoute($user, 'home_page'));
20
        $this->assertTrue($accessControl->hasUserAccessToRoute($user, 'admin_dashboard'));
21
        $this->assertFalse($accessControl->hasUserAccessToRoute($user, 'admin_home'));
22
    }
23
24
    public function testHasUserAccessToRoutes()
25
    {
26
        $accessControl = $this->createFreshAccessControl();
27
        $user = $this->mockUser();
28
        $this->assertTrue($accessControl->hasUserAccessToRoutes($user, ['home_page', 'admin_dashboard']));
29
        $this->assertFalse($accessControl->hasUserAccessToRoutes($user, ['home_page', 'admin_home']));
30
    }
31
32
    public function testHasUserAccessAtLeastOneRoute()
33
    {
34
        $accessControl = $this->createFreshAccessControl();
35
        $user = $this->mockUser();
36
        $this->assertTrue($accessControl->hasUserAccessAtLeastOneRoute($user, ['home_page', 'admin_home']));
37
        $this->assertFalse($accessControl->hasUserAccessAtLeastOneRoute($user, ['admin_home', 'admin_profile']));
38
    }
39
40
    public function testIsRouteSecure()
41
    {
42
        $accessControl = $this->createFreshAccessControl();
43
        $this->assertTrue($accessControl->isRouteSecure('admin_home'));
44
        $this->assertFalse($accessControl->isRouteSecure('home_page'));
45
        $this->assertFalse($accessControl->isRouteSecure('api_get_user'));
46
    }
47
    
48
    public function testGetAllSecuredRoutes()
49
    {
50
        $accessControl = $this->createFreshAccessControl();
51
        $all_secured_routes = $accessControl->getAllSecuredRoutes();
52
        $this->assertContains('admin_home', $all_secured_routes);
53
        $this->assertContains('admin_dashboard', $all_secured_routes);
54
        $this->assertContains('admin_profile', $all_secured_routes);
55
        $this->assertNotContains('api_get_user', $all_secured_routes);
56
    }
57
58
    public function testIsEnable()
59
    {
60
        $router = $this->createMock(RouterInterface::class);
61
        $routeToRoleConverter = $this->createMock(NamingStrategyInterface::class);
62
        $configuration = [
63
            'enable_access_control' => true,
64
            'secured_routes' => [],
65
            'secured_routes_format' => '',
66
            'ignored_routes' => [],
67
            'ignored_routes_format' => '',
68
        ];
69
        $accessControl = new AccessControl($router, $routeToRoleConverter, $configuration);
70
        $this->assertTrue($accessControl->isEnable());
71
        $configuration['enable_access_control'] = false;
72
        $accessControl = new AccessControl($router, $routeToRoleConverter, $configuration);
73
        $this->assertFalse($accessControl->isEnable());
74
    }
75
76
    protected function createFreshAccessControl()
77
    {
78
        $router = $this->createMock(RouterInterface::class);
79
        $routeCollection = $this->createMock(RouteCollection::class);
80
        $routeCollection
81
            ->method('all')
0 ignored issues
show
Bug introduced by
The method method() does not exist on PHPUnit\Framework\MockObject\MockObject. ( Ignorable by Annotation )

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

81
            ->/** @scrutinizer ignore-call */ 
82
              method('all')

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
82
            ->willReturn([
83
                'admin_home' => null,
84
                'admin_dashboard' => null,
85
                'admin_profile' => null,
86
                'home_page' => null,
87
                'create_account' => null,
88
                'api_get_info' => null,
89
                'api_set_info' => null
90
            ]);
91
        $router
92
            ->method('getRouteCollection')
93
            ->willReturn($routeCollection);
94
        $routeToRoleConverter = $this->createMock(NamingStrategyInterface::class);
95
        $routeToRoleConverter
96
            ->method('generateRoleForRoute')
97
            ->will($this->returnCallback(function ($route) {
98
                return 'ROLE_'.strtoupper($route);
99
            }));
100
        $configuration = [
101
            'enable_access_control' => true,
102
            'secured_routes' => ['admin_home'],
103
            'secured_routes_format' => '/^admin_/',
104
            'ignored_routes' => ['home_page'],
105
            'ignored_routes_format' => '/^api_/',
106
        ];
107
108
        return new AccessControl($router, $routeToRoleConverter, $configuration);
109
    }
110
111
    protected function mockUser()
112
    {
113
        $user = $this->createMock(UserInterface::class);
114
        $user
115
            ->method('getRoles')
116
            ->willReturn(['ROLE_ADMIN_DASHBOARD']);
117
118
        return $user;
119
    }
120
}
121