1<?php 2/** 3 * Horde Routes package 4 * 5 * This package is heavily inspired by the Python "Routes" library 6 * by Ben Bangert (http://routes.groovie.org). Routes is based 7 * largely on ideas from Ruby on Rails (http://www.rubyonrails.org). 8 * 9 * @author Maintainable Software, LLC. (http://www.maintainable.com) 10 * @author Mike Naberezny <mike@maintainable.com> 11 * @license http://www.horde.org/licenses/bsd BSD 12 * @package Routes 13 */ 14 15require_once __DIR__ . '/TestHelper.php'; 16 17/** 18 * @package Routes 19 */ 20class Horde_Routes_UtilTest extends PHPUnit_Framework_TestCase 21{ 22 23 public function setUp() 24 { 25 $m = new Horde_Routes_Mapper(); 26 $m->environ = array('HTTP_HOST' => 'www.test.com'); 27 28 $m->connect('archive/:year/:month/:day', 29 array('controller' => 'blog', 30 'action' => 'view', 31 'month' => null, 32 'day' => null, 33 'requirements' => array('month' => '\d{1,2}', 'day' => '\d{1,2}'))); 34 $m->connect('viewpost/:id', array('controller' => 'post', 'action' => 'view')); 35 $m->connect(':controller/:action/:id'); 36 37 $this->mapper = $m; 38 $this->utils = $m->utils; 39 } 40 41 public function testUrlForSelf() 42 { 43 $utils = $this->utils; 44 $utils->mapperDict = array(); 45 46 $this->assertEquals('/blog', $utils->urlFor(array('controller' => 'blog'))); 47 $this->assertEquals('/content', $utils->urlFor()); 48 $this->assertEquals('https://www.test.com/viewpost', $utils->urlFor(array('controller' => 'post', 'action' => 'view', 'protocol' => 'https'))); 49 $this->assertEquals('http://www.test.org/content/view/2', $utils->urlFor(array('host' => 'www.test.org', 'controller' => 'content', 'action' => 'view', 'id' => 2))); 50 } 51 52 public function testUrlForWithDefaults() 53 { 54 $utils = $this->utils; 55 $utils->mapperDict = array('controller' => 'blog', 'action' => 'view', 'id' => 4); 56 57 $this->assertEquals('/blog/view/4', $utils->urlFor()); 58 $this->assertEquals('/post/index/4', $utils->urlFor(array('controller' => 'post'))); 59 $this->assertEquals('/blog/view/2', $utils->urlFor(array('id' => 2))); 60 $this->assertEquals('/viewpost/4', $utils->urlFor(array('controller' => 'post', 'action' => 'view', 'id' => 4))); 61 62 $utils->mapperDict = array('controller' => 'blog', 'action' => 'view', 'year' => 2004); 63 $this->assertEquals('/archive/2004/10', $utils->urlFor(array('month' => 10))); 64 $this->assertEquals('/archive/2004/9/2', $utils->urlFor(array('month' => 9, 'day' => 2))); 65 $this->assertEquals('/blog', $utils->urlFor(array('controller' => 'blog', 'year' => null))); 66 } 67 68 public function testUrlForWithMoreDefaults() 69 { 70 $utils = $this->utils; 71 $utils->mapperDict = array('controller' => 'blog', 'action' => 'view', 'id' => 4); 72 $this->assertEquals('/blog/view/4', $utils->urlFor()); 73 $this->assertEquals('/post/index/4', $utils->urlFor(array('controller' => 'post'))); 74 $this->assertEquals('/viewpost/4', $utils->urlfor(array('controller' => 'post', 'action' => 'view', 'id' => 4))); 75 76 $utils->mapperDict = array('controller' => 'blog', 'action' => 'view', 'year' => 2004); 77 $this->assertEquals('/archive/2004/10', $utils->urlFor(array('month' => 10))); 78 $this->assertEquals('/archive/2004/9/2', $utils->urlFor(array('month' => 9, 'day' => 2))); 79 $this->assertEquals('/blog', $utils->urlFor(array('controller' => 'blog', 'year' => null))); 80 $this->assertEquals('/archive/2004', $utils->urlFor()); 81 } 82 83 public function testUrlForWithDefaultsAndQualified() 84 { 85 $m = $this->mapper; 86 $utils = $m->utils; 87 88 $m->connect('home', '', array('controller' => 'blog', 'action' => 'splash')); 89 $m->connect('category_home', 'category/:section', array('controller' => 'blog', 'action' => 'view', 'section' => 'home')); 90 $m->connect(':controller/:action/:id'); 91 $m->createRegs(array('content', 'blog', 'admin/comments')); 92 93 $environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'www.example.com', 94 'PATH_INFO' => '/blog/view/4'); 95 Horde_Routes_TestHelper::updateMapper($m, $environ); 96 97 $this->assertEquals('/blog/view/4', $utils->urlFor()); 98 $this->assertEquals('/post/index/4', $utils->urlFor(array('controller' => 'post'))); 99 $this->assertEquals('http://www.example.com/blog/view/4', $utils->urlFor(array('qualified' => true))); 100 $this->assertEquals('/blog/view/2', $utils->urlFor(array('id' => 2))); 101 $this->assertEquals('/viewpost/4', $utils->urlFor(array('controller' => 'post', 'action' => 'view', 'id' => 4))); 102 103 $environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'www.example.com:8080', 'PATH_INFO' => '/blog/view/4'); 104 Horde_Routes_TestHelper::updateMapper($m, $environ); 105 106 $this->assertEquals('/post/index/4', 107 $utils->urlFor(array('controller' => 'post'))); 108 $this->assertEquals('http://www.example.com:8080/blog/view/4', 109 $utils->urlFor(array('qualified' => true))); 110 } 111 112 public function testWithRouteNames() 113 { 114 $m = $this->mapper; 115 116 $utils = $this->utils; 117 $utils->mapperDict = array(); 118 119 $m->connect('home', '', array('controller' => 'blog', 'action' => 'splash')); 120 $m->connect('category_home', 'category/:section', 121 array('controller' => 'blog', 'action' => 'view', 'section' => 'home')); 122 $m->createRegs(array('content', 'blog', 'admin/comments')); 123 124 $this->assertEquals('/content/view', 125 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 126 $this->assertEquals('/content', 127 $utils->urlFor(array('controller' => 'content'))); 128 $this->assertEquals('/admin/comments', 129 $utils->urlFor(array('controller' => 'admin/comments'))); 130 $this->assertEquals('/category', 131 $utils->urlFor('category_home')); 132 $this->assertEquals('/category/food', 133 $utils->urlFor('category_home', array('section' => 'food'))); 134 $this->assertNull($utils->urlFor('home', array('action' => 'view', 'section' => 'home'))); 135 $this->assertNull($utils->urlFor('home', array('controller' => 'content'))); 136 $this->assertEquals('/', 137 $utils->urlFor('/')); 138 } 139 140 public function testWithRouteNamesAndDefaults() 141 { 142 $m = $this->mapper; 143 144 $utils = $m->utils; 145 $utils->mapperDict = array(); 146 147 $m->connect('home', '', array('controller' => 'blog', 'action' => 'splash')); 148 $m->connect('category_home', 'category/:section', array('controller' => 'blog', 'action' => 'view', 'section' => 'home')); 149 $m->connect('building', 'building/:campus/:building/alljacks', array('controller' => 'building', 'action' => 'showjacks')); 150 $m->createRegs(array('content', 'blog', 'admin/comments', 'building')); 151 152 $utils->mapperDict = array('controller' => 'building', 'action' => 'showjacks', 'campus' => 'wilma', 'building' => 'port'); 153 $this->assertEquals('/building/wilma/port/alljacks', $utils->urlFor()); 154 $this->assertEquals('/', $utils->urlFor('home')); 155 } 156 157 // callback used by testRedirectTo 158 // Python version is inlined in test_redirect_to 159 public function printer($echo) 160 { 161 $this->redirectToResult = $echo; 162 } 163 164 public function testRedirectTo() 165 { 166 $m = $this->mapper; 167 $m->environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'www.example.com'); 168 169 $utils = $m->utils; 170 $utils->mapperDict = array(); 171 172 $callback = array($this, 'printer'); 173 $utils->redirect = $callback; 174 175 $m->createRegs(array('content', 'blog', 'admin/comments')); 176 177 $this->redirectToResult = null; 178 $utils->redirectTo(array('controller' => 'content', 'action' => 'view')); 179 $this->assertEquals('/content/view', $this->redirectToResult); 180 181 $this->redirectToResult = null; 182 $utils->redirectTo(array('controller' => 'content', 'action' => 'lookup', 'id' => 4)); 183 $this->assertEquals('/content/lookup/4', $this->redirectToResult); 184 185 $this->redirectToResult = null; 186 $utils->redirectTo(array('controller' => 'admin/comments', 'action' => 'splash')); 187 $this->assertEquals('/admin/comments/splash', $this->redirectToResult); 188 189 $this->redirectToResult = null; 190 $utils->redirectTo('http://www.example.com/'); 191 $this->assertEquals('http://www.example.com/', $this->redirectToResult); 192 193 $this->redirectToResult = null; 194 $utils->redirectTo('/somewhere.html', array('var' => 'keyword')); 195 $this->assertEquals('/somewhere.html?var=keyword', $this->redirectToResult); 196 } 197 198 public function testStaticRoute() 199 { 200 $m = $this->mapper; 201 202 $utils = $m->utils; 203 $utils->mapperDict = array(); 204 205 $environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'example.com'); 206 Horde_Routes_TestHelper::updateMapper($m, $environ); 207 208 $m->connect(':controller/:action/:id'); 209 $m->connect('home', 'http://www.groovie.org/', array('_static' => true)); 210 $m->connect('space', '/nasa/images', array('_static' => true)); 211 $m->createRegs(array('content', 'blog')); 212 213 $this->assertEquals('http://www.groovie.org/', 214 $utils->urlFor('home')); 215 $this->assertEquals('http://www.groovie.org/?s=stars', 216 $utils->urlFor('home', array('s' => 'stars'))); 217 $this->assertEquals('/content/view', 218 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 219 $this->assertEquals('/nasa/images?search=all', 220 $utils->urlFor('space', array('search' => 'all'))); 221 } 222 223 public function testStaticRouteWithScript() 224 { 225 $m = $this->mapper; 226 $m->environ = array('SCRIPT_NAME' => '/webapp', 'HTTP_HOST' => 'example.com'); 227 228 $utils = $m->utils; 229 $utils->mapperDict = array(); 230 231 232 $m->connect(':controller/:action/:id'); 233 $m->connect('home', 'http://www.groovie.org/', array('_static' => true)); 234 $m->connect('space', '/nasa/images', array('_static' => true)); 235 $m->createRegs(array('content', 'blog')); 236 237 $this->assertEquals('http://www.groovie.org/', 238 $utils->urlFor('home')); 239 $this->assertEquals('http://www.groovie.org/?s=stars', 240 $utils->urlFor('home', array('s' => 'stars'))); 241 $this->assertEquals('/webapp/content/view', 242 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 243 $this->assertEquals('/webapp/nasa/images?search=all', 244 $utils->urlFor('space', array('search' => 'all'))); 245 $this->assertEquals('http://example.com/webapp/nasa/images', 246 $utils->urlFor('space', array('protocol' => 'http'))); 247 } 248 249 public function testNoNamedPath() 250 { 251 $m = $this->mapper; 252 $m->environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'example.com'); 253 254 $utils = $m->utils; 255 $utils->mapperDict = array(); 256 257 $m->connect(':controller/:action/:id'); 258 $m->connect('home', 'http://www.groovie.org', array('_static' => true)); 259 $m->connect('space', '/nasa/images', array('_static' => true)); 260 $m->createRegs(array('content', 'blog')); 261 262 $this->assertEquals('http://www.google.com/search', 263 $utils->urlFor('http://www.google.com/search')); 264 $this->assertEquals('http://www.google.com/search?q=routes', 265 $utils->urlFor('http://www.google.com/search', array('q'=>'routes'))); 266 $this->assertEquals('/delicious.jpg', 267 $utils->urlFor('/delicious.jpg')); 268 $this->assertEquals('/delicious/search?v=routes', 269 $utils->urlFor('/delicious/search', array('v'=>'routes'))); 270 } 271 272 public function testAppendSlash() 273 { 274 $m = $this->mapper; 275 $m->environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'example.com'); 276 $m->appendSlash = true; 277 278 $utils = $m->utils; 279 $utils->mapperDict = array(); 280 281 $m->connect(':controller/:action/:id'); 282 $m->connect('home', 'http://www.groovie.org/', array('_static' => true)); 283 $m->connect('space', '/nasa/images', array('_static' => true)); 284 $m->createRegs(array('content', 'blog')); 285 286 $this->assertEquals('http://www.google.com/search', 287 $utils->urlFor('http://www.google.com/search')); 288 $this->assertEquals('http://www.google.com/search?q=routes', 289 $utils->urlFor('http://www.google.com/search', array('q'=>'routes'))); 290 $this->assertEquals('/delicious.jpg', 291 $utils->urlFor('/delicious.jpg')); 292 $this->assertEquals('/delicious/search?v=routes', 293 $utils->urlFor('/delicious/search', array('v' => 'routes'))); 294 $this->assertEquals('/content/list/', 295 $utils->urlFor(array('controller' => '/content', 'action' => 'list'))); 296 $this->assertEquals('/content/list/?page=1', 297 $utils->urlFor(array('controller' => '/content', 'action' => 'list', 'page' => '1'))); 298 } 299 300 public function testNoNamedPathWithScript() 301 { 302 $m = $this->mapper; 303 $m->environ = array('SCRIPT_NAME' => '/webapp', 'HTTP_HOST' => 'example.com'); 304 305 $utils = $m->utils; 306 $utils->mapperDict = array(); 307 308 $m->connect(':controller/:action/:id'); 309 $m->connect('home', 'http://www.groovie.org/', array('_static' => true)); 310 $m->connect('space', '/nasa/images', array('_static' => true)); 311 $m->createRegs(array('content', 'blog')); 312 313 $this->assertEquals('http://www.google.com/search', 314 $utils->urlFor('http://www.google.com/search')); 315 $this->assertEquals('http://www.google.com/search?q=routes', 316 $utils->urlFor('http://www.google.com/search', array('q'=>'routes'))); 317 $this->assertEquals('/webapp/delicious.jpg', 318 $utils->urlFor('/delicious.jpg')); 319 $this->assertEquals('/webapp/delicious/search?v=routes', 320 $utils->urlFor('/delicious/search', array('v'=>'routes'))); 321 } 322 323 // callback used by testRouteFilter 324 // Python version is inlined in test_route_filter 325 public function articleFilter($kargs) 326 { 327 $article = isset($kargs['article']) ? $kargs['article'] : null; 328 unset($kargs['article']); 329 330 if ($article !== null) { 331 $kargs['year'] = isset($article['year']) ? $article['year'] : 2004; 332 $kargs['month'] = isset($article['month']) ? $article['month'] : 12; 333 $kargs['day'] = isset($article['day']) ? $article['day'] : 20; 334 $kargs['slug'] = isset($article['slug']) ? $article['slug'] : 'default'; 335 } 336 337 return $kargs; 338 } 339 340 public function testRouteFilter() 341 { 342 $m = new Horde_Routes_Mapper(); 343 $m->environ = array('SCRIPT_NAME' => '', 'HTTP_HOST' => 'example.com'); 344 345 $utils = $m->utils; 346 $utils->mapperDict = array(); 347 348 $callback = array($this, 'articleFilter'); 349 350 $m->connect(':controller/:(action)-:(id).html'); 351 $m->connect('archives', 'archives/:year/:month/:day/:slug', 352 array('controller' =>'archives', 'action' =>'view', '_filter' => $callback)); 353 $m->createRegs(array('content', 'archives', 'admin/comments')); 354 355 $this->assertNull($utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 356 $this->assertNull($utils->urlFor(array('controller' => 'content'))); 357 358 $this->assertEquals('/content/view-3.html', 359 $utils->urlFor(array('controller' => 'content', 'action' => 'view', 'id' => 3))); 360 $this->assertEquals('/content/index-2.html', 361 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 362 363 $this->assertEquals('/archives/2005/10/5/happy', 364 $utils->urlFor('archives', array('year' => 2005, 'month' => 10, 365 'day' => 5, 'slug' => 'happy'))); 366 367 $story = array('year' => 2003, 'month' => 8, 'day' => 2, 'slug' => 'woopee'); 368 $empty = array(); 369 370 $expected = array('controller' => 'archives', 'action' => 'view', 'year' => '2005', 371 'month' => '10', 'day' => '5', 'slug' => 'happy'); 372 $this->assertEquals($expected, $m->match('/archives/2005/10/5/happy')); 373 374 $this->assertEquals('/archives/2003/8/2/woopee', 375 $utils->urlFor('archives', array('article' => $story))); 376 $this->assertEquals('/archives/2004/12/20/default', 377 $utils->urlFor('archives', array('article' => $empty))); 378 } 379 380 public function testWithSslEnviron() 381 { 382 $m = new Horde_Routes_Mapper(); 383 $m->environ = array('SCRIPT_NAME' => '', 'HTTPS' => 'on', 'SERVER_PORT' => '443', 384 'PATH_INFO' => '/', 'HTTP_HOST' => 'example.com', 385 'SERVER_NAME' => 'example.com'); 386 387 $utils = $m->utils; 388 $utils->mapperDict = array(); 389 390 $m->connect(':controller/:action/:id'); 391 $m->createRegs(array('content', 'archives', 'admin/comments')); 392 393 // HTTPS is on, but we're running on a different port internally 394 $this->assertEquals('/content/view', 395 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 396 $this->assertEquals('/content/index/2', 397 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 398 $this->assertEquals('https://nowhere.com/content', 399 $utils->urlFor(array('host' => 'nowhere.com', 'controller' => 'content'))); 400 401 // If HTTPS is on, but the port isn't 443, we'll need to include the port info 402 $m->environ['SERVER_PORT'] = '8080'; 403 404 $utils->mapperDict = array(); 405 406 $this->assertEquals('/content/index/2', 407 $utils->urlFor(array('controller' => 'content', 'id' => '2'))); 408 $this->assertEquals('https://nowhere.com/content', 409 $utils->urlFor(array('host' => 'nowhere.com', 'controller' => 'content'))); 410 $this->assertEquals('https://nowhere.com:8080/content', 411 $utils->urlFor(array('host' => 'nowhere.com:8080', 'controller' => 'content'))); 412 $this->assertEquals('http://nowhere.com/content', 413 $utils->urlFor(array('host' => 'nowhere.com', 'protocol' => 'http', 414 'controller' => 'content'))); 415 } 416 417 public function testWithHttpEnviron() 418 { 419 $m = new Horde_Routes_Mapper(); 420 $m->environ = array('SCRIPT_NAME' => '', 'SERVER_PORT' => '1080', 'PATH_INFO' => '/', 421 'HTTP_HOST' => 'example.com', 'SERVER_NAME' => 'example.com'); 422 423 $utils = $m->utils; 424 $utils->mapperDict = array(); 425 426 $m->connect(':controller/:action/:id'); 427 $m->createRegs(array('content', 'archives', 'admin/comments')); 428 429 $this->assertEquals('/content/view', 430 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 431 $this->assertEquals('/content/index/2', 432 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 433 $this->assertEquals('https://example.com/content', 434 $utils->urlFor(array('protocol' => 'https', 'controller' => 'content'))); 435 } 436 437 public function testSubdomains() 438 { 439 $m = new Horde_Routes_Mapper(); 440 $m->environ = array('SCRIPT_NAME' => '', 'PATH_INFO' => '/', 441 'HTTP_HOST' => 'example.com', 'SERVER_NAME' => 'example.com'); 442 443 $utils = $m->utils; 444 $utils->mapperDict = array(); 445 446 $m->subDomains = true; 447 $m->connect(':controller/:action/:id'); 448 $m->createRegs(array('content', 'archives', 'admin/comments')); 449 450 $this->assertEquals('/content/view', 451 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 452 $this->assertEquals('/content/index/2', 453 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 454 455 $m->environ['HTTP_HOST'] = 'sub.example.com'; 456 457 $utils->mapperDict = array('subDomain' => 'sub'); 458 459 $this->assertEquals('/content/view/3', 460 $utils->urlFor(array('controller' => 'content', 'action' => 'view', 'id' => 3))); 461 $this->assertEquals('http://new.example.com/content', 462 $utils->urlFor(array('controller' => 'content', 'subDomain' => 'new'))); 463 } 464 465 public function testSubdomainsWithExceptions() 466 { 467 $m = new Horde_Routes_Mapper(); 468 $m->environ = array('SCRIPT_NAME' => '', 'PATH_INFO' => '/', 469 'HTTP_HOST' => 'example.com', 'SERVER_NAME' => 'example.com'); 470 471 $utils = $m->utils; 472 $utils->mapperDict = array(); 473 474 $m->subDomains = true; 475 $m->subDomainsIgnore = array('www'); 476 $m->connect(':controller/:action/:id'); 477 $m->createRegs(array('content', 'archives', 'admin/comments')); 478 479 $this->assertEquals('/content/view', 480 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 481 $this->assertEquals('/content/index/2', 482 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 483 484 $m->environ = array('HTTP_HOST' => 'sub.example.com'); 485 486 $utils->mapperDict = array('subDomain' => 'sub'); 487 488 $this->assertEquals('/content/view/3', 489 $utils->urlFor(array('controller' => 'content', 'action' => 'view', 'id' => 3))); 490 $this->assertEquals('http://new.example.com/content', 491 $utils->urlFor(array('controller' => 'content', 'subDomain' => 'new'))); 492 $this->assertEquals('http://example.com/content', 493 $utils->urlFor(array('controller' => 'content', 'subDomain' => 'www'))); 494 495 $utils->mapperDict = array('subDomain' => 'www'); 496 $this->assertEquals('http://example.com/content/view/3', 497 $utils->urlFor(array('controller' => 'content', 'action' => 'view', 'id' => 3))); 498 $this->assertEquals('http://new.example.com/content', 499 $utils->urlFor(array('controller' => 'content', 'subDomain' => 'new'))); 500 $this->assertEquals('/content', 501 $utils->urlFor(array('controller' => 'content', 'subDomain' => 'sub'))); 502 } 503 504 public function testSubdomainsWithNamedRoutes() 505 { 506 $m = new Horde_Routes_Mapper(); 507 $m->environ = array('SCRIPT_NAME' => '', 'PATH_INFO' => '/', 508 'HTTP_HOST' => 'example.com', 'SERVER_NAME' => 'example.com'); 509 510 $utils = $m->utils; 511 $utils->mapperDict = array(); 512 513 $m->subDomains = true; 514 $m->connect(':controller/:action/:id'); 515 $m->connect('category_home', 'category/:section', 516 array('controller' => 'blog', 'action' => 'view', 'section' => 'home')); 517 $m->connect('building', 'building/:campus/:building/alljacks', 518 array('controller' => 'building', 'action' => 'showjacks')); 519 $m->createRegs(array('content','blog','admin/comments','building')); 520 521 $this->assertEquals('/content/view', 522 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 523 $this->assertEquals('/content/index/2', 524 $utils->urlFor(array('controller' => 'content', 'id' => 2))); 525 $this->assertEquals('/category', 526 $utils->urlFor('category_home')); 527 $this->assertEquals('http://new.example.com/category', 528 $utils->urlFor('category_home', array('subDomain' => 'new'))); 529 } 530 531 public function testSubdomainsWithPorts() 532 { 533 $m = new Horde_Routes_Mapper(); 534 $m->environ = array('SCRIPT_NAME' => '', 'PATH_INFO' => '/', 535 'HTTP_HOST' => 'example.com:8000', 'SERVER_NAME' => 'example.com'); 536 537 $utils = $m->utils; 538 $utils->mapperDict = array(); 539 540 $m->subDomains = true; 541 $m->connect(':controller/:action/:id'); 542 $m->connect('category_home', 'category/:section', 543 array('controller' => 'blog', 'action' => 'view', 'section' => 'home')); 544 $m->connect('building', 'building/:campus/:building/alljacks', 545 array('controller' => 'building', 'action' => 'showjacks')); 546 $m->createRegs(array('content', 'blog', 'admin/comments', 'building')); 547 548 $this->assertEquals('/content/view', 549 $utils->urlFor(array('controller' => 'content', 'action' => 'view'))); 550 $this->assertEquals('/category', 551 $utils->urlFor('category_home')); 552 $this->assertEquals('http://new.example.com:8000/category', 553 $utils->urlFor('category_home', array('subDomain' => 'new'))); 554 $this->assertEquals('http://joy.example.com:8000/building/west/merlot/alljacks', 555 $utils->urlFor('building', array('campus' => 'west', 'building' => 'merlot', 556 'subDomain' => 'joy'))); 557 558 $m->environ = array('HTTP_HOST' => 'example.com'); 559 560 $this->assertEquals('http://new.example.com/category', 561 $utils->urlFor('category_home', array('subDomain' => 'new'))); 562 } 563 564 public function testControllerScan() 565 { 566 $hereDir = __DIR__; 567 $controllerDir = "$hereDir/fixtures/controllers"; 568 569 $controllers = Horde_Routes_Utils::controllerScan($controllerDir); 570 571 $this->assertEquals(3, count($controllers)); 572 $this->assertEquals('admin/users', $controllers[0]); 573 $this->assertEquals('content', $controllers[1]); 574 $this->assertEquals('users', $controllers[2]); 575 } 576 577 public function testAutoControllerScan() 578 { 579 $hereDir = __DIR__; 580 $controllerDir = "$hereDir/fixtures/controllers"; 581 582 $m = new Horde_Routes_Mapper(array('directory' => $controllerDir)); 583 $m->alwaysScan = true; 584 585 $m->connect(':controller/:action/:id'); 586 587 $expected = array('action' => 'index', 'controller' => 'content', 'id' => null); 588 $this->assertEquals($expected, $m->match('/content')); 589 590 $expected = array('action' => 'index', 'controller' => 'users', 'id' => null); 591 $this->assertEquals($expected, $m->match('/users')); 592 593 $expected = array('action' => 'index', 'controller' => 'admin/users', 'id' => null); 594 $this->assertEquals($expected, $m->match('/admin/users')); 595 } 596 597} 598