-- improved support in params in the route
[limb:trunk.git] / web_app / tests / cases / plain / request / lmbRoutesToUrlTest.class.php
1 <?php
2 /*
3  * Limb PHP Framework
4  *
5  * @link http://limb-project.com 
6  * @copyright  Copyright &copy; 2004-2009 BIT(http://bit-creative.com)
7  * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
8  */
9 lmb_require('limb/web_app/src/request/lmbRoutes.class.php');
10 lmb_require('limb/net/src/lmbUri.class.php');
11
12 class lmbRoutesToUrlTest extends UnitTestCase
13 {
14   function setUp()
15   {
16     $toolkit = lmbToolkit :: save();
17   }
18
19   function tearDown()
20   {
21     lmbToolkit :: restore();
22   }
23
24   function testToUrl()
25   {
26     $config = array('blog' => array('path' => '/blog',
27                           'defaults' => array('controller' => 'Blog',
28                                               'action' => 'display')),
29                     'news' => array('path' => '/news',
30                           'defaults' => array('controller' => 'Newsline',
31                                               'action' => 'display')));
32
33     $routes = new lmbRoutes($config);
34     $this->assertEqual($routes->toUrl(array(), 'blog'), '/blog');
35     $this->assertEqual($routes->toUrl(array(), 'news'), '/news');
36   }
37
38   function testToUrlUseNamedParam()
39   {
40     $config = array('default' => array('path' => '/:controller/display',
41                           'defaults' => array('action' => 'display')));
42
43     $routes = new lmbRoutes($config);
44     $this->assertEqual($routes->toUrl(array('controller' => 'news'), 'default'), '/news/display');
45   }
46
47   function testToUrlWithPrefix()
48   {
49     $config = array('default' => array('path' => '/:controller/:action/:id:.html',
50                           'defaults' => array('action' => 'display')));
51
52     $routes = new lmbRoutes($config);
53     $this->assertEqual($routes->toUrl(array('controller' => 'news', 'action' => 'display', 'id' => 'test')), '/news/display/test.html');
54   }
55
56   function testToUrlApplyDefaultParamValue()
57   {
58     $config = array('default' => array('path' => '/:controller/:action',
59                           'defaults' => array('action' => 'display')));
60
61     $routes = new lmbRoutes($config);
62     $this->assertEqual($routes->toUrl(array('controller' => 'news'), 'default'), '/news/');
63   }
64
65   function testToUrlApplyDefaultParamValueWithNoParamsInPath()
66   {
67     $config = array('default' => array('path' => '/news/:action/:id',
68                           'defaults' => array('controller' => 'news', 'action' => 'display')));
69
70     $routes = new lmbRoutes($config);
71     $this->assertEqual($routes->toUrl(array('controller' => 'news', 'action' => 'display', 'id' => 'test')), '/news/display/test');
72   }
73
74   function testThrowExceptionIfNotEnoughParams()
75   {
76     $config = array('default' => array('path' => '/:controller/:action'));
77
78     $routes = new lmbRoutes($config);
79     try
80     {
81       $routes->toUrl(array('controller' => 'news'), 'default');
82       $this->assertTrue(false);
83     }
84     catch(lmbException $e){}
85   }
86
87   function testThrowExceptionIfNotFoundAnyMatchingRoute()
88   {
89     $config = array('default' => array('path' => '/:controller/:action',
90                           'defaults' => array('action' => 'display')));
91
92     $routes = new lmbRoutes($config);
93     try
94     {
95       $routes->toUrl(array(), 'default');
96       $this->assertTrue(false);
97     }
98     catch(lmbException $e){}
99   }
100
101   function testToUrlTryToGuessRoute()
102   {
103     $config = array('default' => array('path' => '/:controller/display',
104                           'defaults' => array('action' => 'display')),
105                      'full' => array('path' => '/:controller/:action',
106                           'defaults' => array('action' => 'display')));
107
108     $routes = new lmbRoutes($config);
109     $this->assertEqual($routes->toUrl(array('controller' => 'news',
110                                             'action' => 'archive')), '/news/archive');
111   }
112
113   function testNoSuchRoute()
114   {
115     $config = array(
116       'AdminPanel' =>
117         array('path' => '/admin',
118               'defaults' => array('controller' => 'AdminPanel',
119                                   'action' => 'admin_display')),
120
121       'EdPrograms' =>
122         array('path' => '/admin/programs/:action',
123               'defaults' => array('controller' => 'EdPrograms',
124                                   'action' => 'admin_display')),
125
126       'EdCourses' =>
127         array('path' => '/admin/courses/:action',
128               'defaults' => array('controller' => 'EdCourses',
129                                   'action' => 'admin_display')),
130
131     );
132
133     $routes = new lmbRoutes($config);
134     try
135     {
136       $routes->toUrl(array('action' => 'create'), 'Course');
137       $this->assertTrue(false);
138     }
139     catch(lmbException $e){}
140   }
141
142   function testApplyUrlFilter()
143   {
144     $config = array('default' => array('path' => '/:controller/:action',
145                                        'defaults' => array('action' => 'display'),
146                                        'url_filter' => array($this, '_processUrlResult')));
147
148     $routes = new lmbRoutes($config);
149     $this->assertEqual($routes->toUrl(array('controller' => 'admin_news',
150                                             'action' => 'archive')), '/admin/news/archive');
151   }
152
153   function _processUrlResult(&$path, $route)
154   {
155     $path = str_replace('/admin_', '/admin/', $path);
156   }
157   
158   function testRemoveUnneededDefaultParamsFromUrl()
159   {
160     $config = array(
161       'default' => array(
162         'path' => '/users/:user/:controller/:action/:id/',
163         'defaults' => array(
164           'user' => 'admin',
165           'controller' => 'blog',
166           'action' => 'display',
167           'id' => 0
168         )
169       )
170     );
171     
172     $routes = new lmbRoutes($config);
173     
174     $this->assertEqual($routes->toUrl(array()), '/users/');
175     $this->assertEqual($routes->toUrl(array('user' => 'bob')), '/users/bob/');
176     $this->assertEqual($routes->toUrl(array('user' => 'admin')), '/users/');
177     $this->assertEqual($routes->toUrl(array('user' => 'bob', 'action' => 'index')), '/users/bob/blog/index/');
178     $this->assertEqual($routes->toUrl(array('controller' => 'article')), '/users/admin/article/');
179     $this->assertEqual($routes->toUrl(array('controller' => 'article', 'id' => 5)), '/users/admin/article/display/5/');
180     $this->assertEqual($routes->toUrl(array('user' => 'admin', 'action' => 'display', 'id' => 0)), '/users/');
181     $this->assertEqual($routes->toUrl(array('user' => 'admin', 'id' => 19)), '/users/admin/blog/display/19/');    
182   }
183   
184   function testToUrlChecksRequirements()
185   {
186     $config = array(
187       'default' => array(
188         'path' => '/:controller/:action/',
189         'requirements' => array(
190           'controller' => '/^blog$/',
191           'action' => '/^[a-z]+$/'        
192         )
193       )    
194     );
195     
196     $routes = new lmbRoutes($config);
197         
198     $this->assertEqual($routes->toUrl(array('controller' => 'blog', 'action' => 'edit')), '/blog/edit/');
199     
200     try 
201     {
202       $routes->toUrl(array('controller' => 'admin', 'action' => '123edit'));
203       $routes->toUrl(array('controller' => 'zzz', 'action' => 'edit'));
204       $routes->toUrl(array('controller' => 'blog', 'action' => '@#%'));
205       $this->fail("Some routes do NOT match required params!");
206     } catch (lmbException $e) 
207     {      
208       $this->assertPattern('/route .* not found .*/i', $e->getMessage());
209     }    
210   }  
211 }
212