Completed
Push — master ( 6c2bdc...71996f )
by Alex
01:53
created

DynamicRoutesUnitTest   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 189
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 76
c 0
b 0
f 0
dl 0
loc 189
rs 10
wmc 9

4 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 3 1
A testMultyple() 0 16 2
A typesDataProvider() 0 109 3
A testTypes() 0 21 3
1
<?php
2
namespace Mezon\Router\Tests;
3
4
use Mezon\Router\Router;
5
use Mezon\Router\Types\DateRouterType;
6
7
class DynamicRoutesUnitTest extends \PHPUnit\Framework\TestCase
8
{
9
10
    /**
11
     * Default setup
12
     *
13
     * {@inheritdoc}
14
     * @see \PHPUnit\Framework\TestCase::setUp()
15
     */
16
    public function setUp(): void
17
    {
18
        $_SERVER['REQUEST_METHOD'] = 'GET';
19
    }
20
21
    const TYPES_ROUTE_CATALOG_INT_BAR = '/catalog/[i:bar]/';
22
23
    const TYPES_ROUTE_CATALOG_FIX_POINT_BAR = '/catalog/[fp:bar]/';
24
25
    /**
26
     * Data provider for the testTypes
27
     *
28
     * @return array test data
29
     */
30
    public function typesDataProvider(): array
31
    {
32
        $data = [
33
            // #0
34
            [
35
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_INT_BAR,
36
                '/catalog/1/',
37
                1
38
            ],
39
            // #1
40
            [
41
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_INT_BAR,
42
                '/catalog/-1/',
43
                - 1
44
            ],
45
            // #2
46
            [
47
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_INT_BAR,
48
                '/catalog/+1/',
49
                1
50
            ],
51
            // #3
52
            [
53
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_FIX_POINT_BAR,
54
                '/catalog/1.1/',
55
                1.1
56
            ],
57
            // #4
58
            [
59
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_FIX_POINT_BAR,
60
                '/catalog/-1.1/',
61
                - 1.1
62
            ],
63
            // #5
64
            [
65
                DynamicRoutesUnitTest::TYPES_ROUTE_CATALOG_FIX_POINT_BAR,
66
                '/catalog/+1.1/',
67
                1.1
68
            ],
69
            // #6
70
            [
71
                '/[a:bar]/',
72
                '/.-@/',
73
                '.-@'
74
            ],
75
            // #7
76
            [
77
                '/[s:bar]/',
78
                '/, ;:/',
79
                ', ;:'
80
            ],
81
            // #8
82
            [
83
                [
84
                    '/[fp:number]/',
85
                    '/[s:bar]/'
86
                ],
87
                '/abc/',
88
                'abc'
89
            ],
90
            // #9
91
            [
92
                '/catalog/[il:bar]/',
93
                '/catalog/123,456,789/',
94
                '123,456,789'
95
            ],
96
            // #10
97
            [
98
                '/catalog/[s:bar]/',
99
                '/catalog/123&456/',
100
                '123&456'
101
            ],
102
            // #11, parameter name chars testing
103
            [
104
                '/[s:Aa_x-0]/',
105
                '/abc123/',
106
                'abc123',
107
                'Aa_x-0'
108
            ],
109
            // #12, date type testing 1
110
            [
111
                '/[date:dfield]/',
112
                '/2020-02-02/',
113
                '2020-02-02',
114
                'dfield'
115
            ],
116
            // #13, date type testing 2
117
            [
118
                '/posts-[date:dfield]/',
119
                '/posts-2020-02-02/',
120
                '2020-02-02',
121
                'dfield'
122
            ]
123
        ];
124
125
        $return = [];
126
127
        foreach (Router::getListOfSupportedRequestMethods() as $method) {
128
            $tmp = array_merge($data);
129
130
            foreach ($tmp as $item) {
131
                $item = array_merge([
132
                    $method
133
                ], $item);
134
                $return[] = $item;
135
            }
136
        }
137
138
        return $return;
139
    }
140
141
    /**
142
     * Testing router types
143
     *
144
     * @param mixed $pattern
145
     *            route pattern
146
     * @param string $route
147
     *            real route
148
     * @param mixed $expected
149
     *            expected value
150
     * @param string $paramName
151
     *            name of the validating parameter
152
     * @dataProvider typesDataProvider
153
     */
154
    public function testTypes(string $method, $pattern, string $route, $expected, string $paramName = 'bar'): void
155
    {
156
        // setup
157
        $_SERVER['REQUEST_METHOD'] = $method;
158
        $router = new \Mezon\Router\Router();
159
        $router->addType('date', DateRouterType::class);
160
        if (is_string($pattern)) {
161
            $router->addRoute($pattern, function () {
162
                // do nothing
163
            }, $method);
164
        } else {
165
            foreach ($pattern as $r) {
166
                $router->addRoute($r, function () {
167
                    // do nothing
168
                }, $method);
169
            }
170
        }
171
        $router->callRoute($route);
172
173
        // test body and assertions
174
        $this->assertEquals($expected, $router->getParam($paramName));
175
    }
176
177
    /**
178
     * Testing multyple routes
179
     */
180
    public function testMultyple(): void
181
    {
182
        // setup
183
        $router = new Router();
184
        for ($i = 0; $i < 15; $i ++) {
185
            $router->addRoute('/multiple/' . $i . '/[i:id]', function () {
186
                return 'done!';
187
            });
188
        }
189
190
        // test body
191
        $result = $router->callRoute('/multiple/' . rand(0, 14) . '/12345');
192
193
        // assertions
194
        $this->assertEquals('done!', $result);
195
        $this->assertEquals('12345', $router->getParam('id'));
196
    }
197
}
198