Passed
Push — master ( 143e9b...8d4260 )
by Alexander
04:06 queued 02:56
created

UrlGeneratorTest::testSimpleRouteGenerated()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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