Completed
Push — master ( acb828...319569 )
by Grégoire
12s
created

testControllerWithBundleSubFolder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
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 Sonata\AdminBundle\Tests\Route;
15
16
use PHPUnit\Framework\TestCase;
17
use Sonata\AdminBundle\Controller\CRUDController;
18
use Sonata\AdminBundle\Route\RouteCollection;
19
use Symfony\Component\Routing\Route;
20
21
class RouteCollectionTest extends TestCase
22
{
23
    public function testGetter(): void
24
    {
25
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
26
27
        $this->assertSame('base.Code.Route', $routeCollection->getBaseCodeRoute());
28
        $this->assertSame('baseRouteName', $routeCollection->getBaseRouteName());
29
        $this->assertSame('baseRoutePattern', $routeCollection->getBaseRoutePattern());
30
        $this->assertSame('baseControllerName', $routeCollection->getBaseControllerName());
31
    }
32
33
    public function testActionify(): void
34
    {
35
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'BundleName:ControllerName');
36
37
        $this->assertSame('fooBar', $routeCollection->actionify('Foo bar'));
38
        $this->assertSame('bar', $routeCollection->actionify('Foo.bar'));
39
    }
40
41
    public function testActionifyService(): void
42
    {
43
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerService');
44
45
        $this->assertSame('fooBarAction', $routeCollection->actionify('Foo bar'));
46
        $this->assertSame('barAction', $routeCollection->actionify('Foo.bar'));
47
    }
48
49
    public function testCode(): void
50
    {
51
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
52
53
        $this->assertSame('base.Code.Route.test', $routeCollection->getCode('test'));
54
        $this->assertSame('base.Code.Route.test', $routeCollection->getCode('base.Code.Route.test'));
55
    }
56
57
    public function testCollection(): void
58
    {
59
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
60
61
        $routeCollection->add('view');
62
        $this->assertTrue($routeCollection->has('view'));
63
64
        $routeCollection->remove('view');
65
        $this->assertFalse($routeCollection->has('view'));
66
67
        $routeCollection->add('create');
68
        $route = $routeCollection->get('create');
69
70
        $this->assertInstanceOf(Route::class, $route);
71
72
        $routeCollection->add('view');
73
        $routeCollection->add('edit');
74
        $routeCollection->clear();
75
        $this->assertFalse($routeCollection->has('create'));
76
        $this->assertFalse($routeCollection->has('view'));
77
        $this->assertFalse($routeCollection->has('edit'));
78
79
        $routeCollection->add('create');
80
        $routeCollection->add('view');
81
        $routeCollection->add('edit');
82
        $routeCollection->add('list');
83
        $routeCollection->clearExcept(['create', 'edit']);
84
        $this->assertTrue($routeCollection->has('create'));
85
        $this->assertTrue($routeCollection->has('edit'));
86
        $this->assertFalse($routeCollection->has('view'));
87
        $this->assertFalse($routeCollection->has('list'));
88
89
        $routeCollection->clearExcept('create');
90
        $this->assertTrue($routeCollection->has('create'));
91
        $this->assertFalse($routeCollection->has('edit'));
92
    }
93
94
    public function testGetWithException(): void
95
    {
96
        $this->expectException(\InvalidArgumentException::class, 'Element "foo" does not exist.');
97
98
        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
99
        $routeCollection->get('foo');
100
    }
101
102
    public function testChildCollection(): void
103
    {
104
        $childCollection = new RouteCollection('baseCodeRouteChild', 'baseRouteNameChild', 'baseRoutePatternChild', 'baseControllerNameChild');
105
        $childCollection->add('view');
106
        $childCollection->add('create');
107
108
        $parentCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
109
        $parentCollection->add('view');
110
        $parentCollection->add('edit');
111
112
        $parentCollection->addCollection($childCollection);
0 ignored issues
show
Documentation introduced by
$childCollection is of type object<Sonata\AdminBundle\Route\RouteCollection>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
113
114
        $this->assertTrue($parentCollection->has('view'));
115
        $this->assertTrue($parentCollection->has('edit'));
116
        $this->assertFalse($parentCollection->has('create'));
117
118
        $this->assertFalse($parentCollection->has('baseCodeRouteChild.edit'));
119
    }
120
121
    public function testRoute(): void
122
    {
123
        $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'BundleName:ControllerName');
124
125
        $routeCollection->add('view');
126
127
        $route = $routeCollection->get('view');
128
129
        $this->assertSame('BundleName:ControllerName:view', $route->getDefault('_controller'));
130
        $this->assertSame('baseCodeRoute', $route->getDefault('_sonata_admin'));
131
        $this->assertSame('baseRouteName_view', $route->getDefault('_sonata_name'));
132
    }
133
134
    public function testRouteWithAllConstructorParameters(): void
135
    {
136
        $baseCodeRoute = 'baseCodeRoute';
137
        $baseRouteName = 'baseRouteName';
138
        $baseRoutePattern = 'baseRoutePattern';
139
        $routeCollection = new RouteCollection($baseCodeRoute, $baseRouteName, $baseRoutePattern, 'BundleName:ControllerName');
140
141
        $name = 'view';
142
        $pattern = 'view';
143
        $defaults = [
144
            '_controller' => 'BundleName:ControllerName:viewAction',
145
        ];
146
        $requirements = [
147
            'page' => '\d+',
148
        ];
149
        $options = [
150
            'debug' => true,
151
        ];
152
        $host = 'test.local';
153
        $schemes = [
154
            'https',
155
        ];
156
        $methods = [
157
            'GET',
158
            'POST',
159
        ];
160
        $condition = "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'";
161
162
        $routeCollection->add($name, $pattern, $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
163
164
        $route = $routeCollection->get($name);
165
166
        $combinedPattern = '/'.$baseRoutePattern.'/'.($pattern ?: $name);
167
168
        $this->assertSame($combinedPattern, $route->getPath());
169
        $this->assertArrayHasKey('_controller', $route->getDefaults());
170
        $this->assertArrayHasKey('page', $route->getRequirements());
171
        $this->assertArrayHasKey('debug', $route->getOptions());
172
        $this->assertSame($host, $route->getHost());
173
        $this->assertSame($methods, $route->getMethods());
174
        if (method_exists($route, 'getCondition')) {
175
            $this->assertSame($condition, $route->getCondition());
176
        }
177
    }
178
179
    public function testRouteControllerService(): void
180
    {
181
        $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'baseControllerServiceName');
182
183
        $routeCollection->add('view');
184
185
        $route = $routeCollection->get('view');
186
187
        $this->assertSame('baseControllerServiceName:viewAction', $route->getDefault('_controller'));
188
        $this->assertSame('baseCodeRoute', $route->getDefault('_sonata_admin'));
189
        $this->assertSame('baseRouteName_view', $route->getDefault('_sonata_name'));
190
    }
191
192
    public function testControllerWithFQCN(): void
193
    {
194
        $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', CRUDController::class);
195
        $routeCollection->add('view');
196
        $route = $routeCollection->get('view');
197
198
        $this->assertSame('Sonata\AdminBundle\Controller\CRUDController::viewAction', $route->getDefault('_controller'));
199
    }
200
201
    public function testControllerWithBundleSubFolder(): void
202
    {
203
        $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'AppBundle\Admin:Test');
204
        $routeCollection->add('view');
205
        $route = $routeCollection->get('view');
206
207
        $this->assertSame('AppBundle\Admin:Test:view', $route->getDefault('_controller'));
208
    }
209
}
210