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