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