Passed
Push — master ( 8d4260...b4da4e )
by Alexander
01:32 queued 18s
created

testDefaultUsedForOptionalParameter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 6
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
namespace Yiisoft\Router\FastRoute\Tests;
4
5
use PHPUnit\Framework\TestCase;
6
use Yiisoft\Router\Group;
7
use Yiisoft\Router\Route;
8
use Yiisoft\Router\RouteNotFoundException;
9
use Yiisoft\Router\UrlGeneratorInterface;
10
11
class UrlGeneratorTest extends TestCase
12
{
13
    private function createUrlGenerator(array $routes): UrlGeneratorInterface
14
    {
15
        $container = new DummyContainer();
16
        $factory = new RouteFactory();
17
18
        return $factory($routes, $container);
19
    }
20
21
    public function testSimpleRouteGenerated(): void
22
    {
23
        $routes = [
24
            Route::get('/home/index')->name('index'),
25
        ];
26
        $url = $this->createUrlGenerator($routes)->generate('index');
27
28
        $this->assertEquals('/home/index', $url);
29
    }
30
31
    public function testRouteWithoutNameNotFound(): void
32
    {
33
        $routes = [
34
            Route::get('/home/index'),
35
            Route::get('/index'),
36
            Route::get('index'),
37
        ];
38
        $urlGenerator = $this->createUrlGenerator($routes);
39
40
        $this->expectException(RouteNotFoundException::class);
41
        $urlGenerator->generate('index');
42
    }
43
44
    public function testParametersSubstituted(): void
45
    {
46
        $routes = [
47
            Route::get('/view/{id:\d+}/{text:~[\w]+}#{tag:\w+}')->name('view'),
48
        ];
49
        $url = $this->createUrlGenerator($routes)->generate('view', ['id' => 100, 'tag' => 'yii', 'text' => '~test']);
50
51
        $this->assertEquals('/view/100/~test#yii', $url);
52
    }
53
54
    public function testExceptionThrownIfParameterPatternDoesntMatch(): void
55
    {
56
        $routes = [
57
            Route::get('/view/{id:\w+}')->name('view'),
58
        ];
59
        $urlGenerator = $this->createUrlGenerator($routes);
60
61
        $this->expectExceptionMessage('Parameter value for [id] did not match the regex `\w+`');
62
        $urlGenerator->generate('view', ['id' => null]);
63
    }
64
65
    public function testExceptionThrownIfAnyParameterIsMissing(): void
66
    {
67
        $routes = [
68
            Route::get('/view/{id:\d+}/{value}')->name('view'),
69
        ];
70
        $urlGenerator = $this->createUrlGenerator($routes);
71
72
        $this->expectExceptionMessage('Route `view` expects at least parameter values for [id,value], but received [id]');
73
        $urlGenerator->generate('view', ['id' => 123]);
74
    }
75
76
    public function testGroupPrefixAppended(): void
77
    {
78
        $routes = [
79
            Group::create('/api', [
80
                Route::get('/post')->name('post/index'),
81
                Route::get('/post/{id}')->name('post/view'),
82
            ]),
83
        ];
84
        $urlGenerator = $this->createUrlGenerator($routes);
85
86
        $url = $urlGenerator->generate('post/index');
87
        $this->assertEquals('/api/post', $url);
88
89
        $url = $urlGenerator->generate('post/view', ['id' => 42]);
90
        $this->assertEquals('/api/post/42', $url);
91
    }
92
93
    public function testNestedGroupsPrefixAppended(): void
94
    {
95
        $routes = [
96
            Group::create('/api', [
97
                Group::create('/v1', [
98
                    Group::create('/blog', [
99
                        Route::get('/post')->name('api-v1-post/index'),
100
                        Route::get('/post/{id}')->name('api-v1-post/view'),
101
                    ]),
102
                ])
103
            ])
104
        ];
105
        $urlGenerator = $this->createUrlGenerator($routes);
106
107
        $url = $urlGenerator->generate('api-v1-post/index');
108
        $this->assertEquals('/api/v1/blog/post', $url);
109
110
        $url = $urlGenerator->generate('api-v1-post/view', ['id' => 42]);
111
        $this->assertEquals('/api/v1/blog/post/42', $url);
112
    }
113
114
    public function testExtraParametersAddedAsQueryString(): void
115
    {
116
        $routes = [
117
            Route::get('/test/{name}')
118
                ->name('test')
119
        ];
120
121
        $url = $this->createUrlGenerator($routes)->generate('test', ['name' => 'post', 'id' => 12, 'sort' => 'asc']);
122
        $this->assertEquals('/test/post?id=12&sort=asc', $url);
123
    }
124
125
    public function testDefaultNotUsedForOptionalParameter(): void
126
    {
127
        $routes = [
128
            Route::get('/[{name}]')
129
                ->name('defaults')
130
                ->defaults(['name' => 'default'])
131
        ];
132
133
        $url = $this->createUrlGenerator($routes)->generate('defaults');
134
        $this->assertEquals('/', $url);
135
    }
136
137
    public function testValueUsedForOptionalParameter(): void
138
    {
139
        $routes = [
140
            Route::get('/[{name}]')
141
                ->name('defaults')
142
                ->defaults(['name' => 'default'])
143
        ];
144
145
        $url = $this->createUrlGenerator($routes)->generate('defaults', ['name' => 'test']);
146
        $this->assertEquals('/test', $url);
147
    }
148
149
    public function testDefaultNotUsedForRequiredParameter(): void
150
    {
151
        $routes = [
152
            Route::get('/{name}')
153
                ->name('defaults')
154
                ->defaults(['name' => 'default'])
155
        ];
156
157
        $this->expectExceptionMessage('Route `defaults` expects at least parameter values for [name], but received []');
158
        $this->createUrlGenerator($routes)->generate('defaults');
159
    }
160
}
161