1<?php
2
3/**
4 * This file is part of the Phalcon Framework.
5 *
6 * (c) Phalcon Team <team@phalcon.io>
7 *
8 * For the full copyright and license information, please view the LICENSE.txt
9 * file that was distributed with this source code.
10 */
11
12declare(strict_types=1);
13
14namespace Phalcon\Test\Integration\Mvc\Router\Refactor;
15
16use Codeception\Example;
17use IntegrationTester;
18use Phalcon\Mvc\Router\Annotations;
19use Phalcon\Mvc\Router\Route;
20use Phalcon\Test\Fixtures\Traits\DiTrait;
21
22use function is_object;
23
24/**
25 * Class AnnotationsCest
26 *
27 * @package Phalcon\Test\Integration\Mvc\Router\Refactor
28 * @todo: refactor
29 */
30class AnnotationsCest
31{
32    use DiTrait;
33
34    public function _before(IntegrationTester $I)
35    {
36        $this->newDi();
37        $this->setDiService('request');
38        $this->setDiService('annotations');
39    }
40
41    public function testRouterFullResources1(IntegrationTester $I)
42    {
43        $container = $this->getDi();
44        $router    = new Annotations(false);
45
46        $router->setDI($container);
47
48        $router->addResource("Phalcon\Test\Controllers\Robots", '/');
49        $router->addResource("Phalcon\Test\Controllers\Products", '/products');
50        $router->addResource("Phalcon\Test\Controllers\About", '/about');
51
52        $router->handle('/products');
53
54        $I->assertCount(
55            6,
56            $router->getRoutes()
57        );
58
59
60        $router = new Annotations(false);
61
62        $router->setDI($container);
63
64        $router->addResource("Phalcon\Test\Controllers\Robots", '/');
65        $router->addResource("Phalcon\Test\Controllers\Products", '/products');
66        $router->addResource("Phalcon\Test\Controllers\About", '/about');
67
68        $router->handle('/about');
69
70        $I->assertCount(
71            5,
72            $router->getRoutes()
73        );
74    }
75
76    public function testRouterFullResourcesNamespaced(IntegrationTester $I)
77    {
78        require_once dataDir('fixtures/controllers/NamespacedAnnotationController.php');
79
80        $container = $this->getDi();
81
82
83        $router = new Annotations(false);
84
85        $router->setDI($container);
86
87        $router->setDefaultNamespace('MyNamespace\\Controllers');
88
89        $router->addResource('NamespacedAnnotation', '/namespaced');
90
91        $router->handle('/namespaced');
92
93        $I->assertCount(
94            1,
95            $router->getRoutes()
96        );
97
98
99        $router = new Annotations(false);
100
101        $router->setDI($container);
102
103        $router->addResource(
104            'MyNamespace\\Controllers\\NamespacedAnnotation',
105            '/namespaced'
106        );
107
108        $router->handle('/namespaced/');
109    }
110
111    /**
112     * @dataProvider getRoutes
113     */
114    public function testRouterFullResources2(IntegrationTester $I, Example $example)
115    {
116        $uri        = $example['uri'];
117        $method     = $example['method'];
118        $controller = $example['controller'];
119        $action     = $example['action'];
120        $params     = $example['params'];
121
122        $container = $this->getDi();
123
124        $router = new Annotations(false);
125
126        $router->setDI($container);
127
128        $router->addResource("Phalcon\Test\Controllers\Robots");
129        $router->addResource("Phalcon\Test\Controllers\Products");
130        $router->addResource("Phalcon\Test\Controllers\About");
131        $router->addResource("Phalcon\Test\Controllers\Main");
132
133        $router->handle('/');
134
135        $I->assertCount(
136            9,
137            $router->getRoutes()
138        );
139
140        $route = $router->getRouteByName('save-robot');
141        $I->assertTrue(is_object($route));
142
143        $I->assertInstanceOf(
144            Route::class,
145            $route
146        );
147
148        $route = $router->getRouteByName('save-product');
149        $I->assertTrue(is_object($route));
150
151        $I->assertInstanceOf(
152            Route::class,
153            $route
154        );
155
156        $_SERVER['REQUEST_METHOD'] = $method;
157        $router->handle($uri);
158
159        $I->assertEquals(
160            $controller,
161            $router->getControllerName()
162        );
163
164        $I->assertEquals(
165            $action,
166            $router->getActionName()
167        );
168
169        $I->assertEquals(
170            $params,
171            $router->getParams()
172        );
173    }
174
175    private function getRoutes(): array
176    {
177        return [
178            [
179                'uri'        => '/products/save',
180                'method'     => 'PUT',
181                'controller' => 'products',
182                'action'     => 'save',
183                'params'     => [],
184            ],
185            [
186                'uri'        => '/products/save',
187                'method'     => 'POST',
188                'controller' => 'products',
189                'action'     => 'save',
190                'params'     => [],
191            ],
192            [
193                'uri'        => '/products/edit/100',
194                'method'     => 'GET',
195                'controller' => 'products',
196                'action'     => 'edit',
197                'params'     => [
198                    'id' => '100',
199                ],
200            ],
201            [
202                'uri'        => '/products',
203                'method'     => 'GET',
204                'controller' => 'products',
205                'action'     => 'index',
206                'params'     => [],
207            ],
208            [
209                'uri'        => '/robots/edit/100',
210                'method'     => 'GET',
211                'controller' => 'robots',
212                'action'     => 'edit',
213                'params'     => [
214                    'id' => '100',
215                ],
216            ],
217            [
218                'uri'        => '/robots',
219                'method'     => 'GET',
220                'controller' => 'robots',
221                'action'     => 'index',
222                'params'     => [],
223            ],
224            [
225                'uri'        => '/robots/save',
226                'method'     => 'PUT',
227                'controller' => 'robots',
228                'action'     => 'save',
229                'params'     => [],
230            ],
231            [
232                'uri'        => '/about/team',
233                'method'     => 'GET',
234                'controller' => 'about',
235                'action'     => 'team',
236                'params'     => [],
237            ],
238            [
239                'uri'        => '/about/team',
240                'method'     => 'POST',
241                'controller' => 'about',
242                'action'     => 'teampost',
243                'params'     => [],
244            ],
245            [
246                'uri'        => '/',
247                'method'     => 'GET',
248                'controller' => 'main',
249                'action'     => 'index',
250                'params'     => [],
251            ],
252        ];
253    }
254}
255