pictcode / lib / Cake / Test / Case / Routing / Route / CakeRouteTest.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (31.675 KB)
1 | 635eef61 | spyder1211 | <?php
|
---|---|---|---|
2 | /**
|
||
3 | * CakeRequest Test case file.
|
||
4 | *
|
||
5 | * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
||
6 | * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
7 | *
|
||
8 | * Licensed under The MIT License
|
||
9 | * For full copyright and license information, please see the LICENSE.txt
|
||
10 | * Redistributions of files must retain the above copyright notice.
|
||
11 | *
|
||
12 | * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
13 | * @link http://cakephp.org CakePHP(tm) Project
|
||
14 | * @package Cake.Test.Case.Routing.Route
|
||
15 | * @since CakePHP(tm) v 2.0
|
||
16 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
17 | */
|
||
18 | |||
19 | App::uses('CakeRoute', 'Routing/Route'); |
||
20 | App::uses('Router', 'Routing'); |
||
21 | |||
22 | /**
|
||
23 | * Test case for CakeRoute
|
||
24 | *
|
||
25 | * @package Cake.Test.Case.Routing.Route
|
||
26 | */
|
||
27 | class CakeRouteTest extends CakeTestCase { |
||
28 | |||
29 | /**
|
||
30 | * setUp method
|
||
31 | *
|
||
32 | * @return void
|
||
33 | */
|
||
34 | public function setUp() { |
||
35 | parent::setUp();
|
||
36 | Configure::write('Routing', array('admin' => null, 'prefixes' => array())); |
||
37 | } |
||
38 | |||
39 | /**
|
||
40 | * Test the construction of a CakeRoute
|
||
41 | *
|
||
42 | * @return void
|
||
43 | */
|
||
44 | public function testConstruction() { |
||
45 | $route = new CakeRoute('/:controller/:action/:id', array(), array('id' => '[0-9]+')); |
||
46 | |||
47 | $this->assertEquals('/:controller/:action/:id', $route->template); |
||
48 | $this->assertEquals(array(), $route->defaults); |
||
49 | $this->assertEquals(array('id' => '[0-9]+'), $route->options); |
||
50 | $this->assertFalse($route->compiled()); |
||
51 | } |
||
52 | |||
53 | /**
|
||
54 | * test Route compiling.
|
||
55 | *
|
||
56 | * @return void
|
||
57 | */
|
||
58 | public function testBasicRouteCompiling() { |
||
59 | $route = new CakeRoute('/', array('controller' => 'pages', 'action' => 'display', 'home')); |
||
60 | $result = $route->compile(); |
||
61 | $expected = '#^/*$#'; |
||
62 | $this->assertEquals($expected, $result); |
||
63 | $this->assertEquals(array(), $route->keys); |
||
64 | |||
65 | $route = new CakeRoute('/:controller/:action', array('controller' => 'posts')); |
||
66 | $result = $route->compile(); |
||
67 | |||
68 | $this->assertRegExp($result, '/posts/edit'); |
||
69 | $this->assertRegExp($result, '/posts/super_delete'); |
||
70 | $this->assertNotRegExp($result, '/posts'); |
||
71 | $this->assertNotRegExp($result, '/posts/super_delete/1'); |
||
72 | |||
73 | $route = new CakeRoute('/posts/foo:id', array('controller' => 'posts', 'action' => 'view')); |
||
74 | $result = $route->compile(); |
||
75 | |||
76 | $this->assertRegExp($result, '/posts/foo:1'); |
||
77 | $this->assertRegExp($result, '/posts/foo:param'); |
||
78 | $this->assertNotRegExp($result, '/posts'); |
||
79 | $this->assertNotRegExp($result, '/posts/'); |
||
80 | |||
81 | $this->assertEquals(array('id'), $route->keys); |
||
82 | |||
83 | $route = new CakeRoute('/:plugin/:controller/:action/*', array('plugin' => 'test_plugin', 'action' => 'index')); |
||
84 | $result = $route->compile(); |
||
85 | $this->assertRegExp($result, '/test_plugin/posts/index'); |
||
86 | $this->assertRegExp($result, '/test_plugin/posts/edit/5'); |
||
87 | $this->assertRegExp($result, '/test_plugin/posts/edit/5/name:value/nick:name'); |
||
88 | } |
||
89 | |||
90 | /**
|
||
91 | * test that route parameters that overlap don't cause errors.
|
||
92 | *
|
||
93 | * @return void
|
||
94 | */
|
||
95 | public function testRouteParameterOverlap() { |
||
96 | $route = new CakeRoute('/invoices/add/:idd/:id', array('controller' => 'invoices', 'action' => 'add')); |
||
97 | $result = $route->compile(); |
||
98 | $this->assertRegExp($result, '/invoices/add/1/3'); |
||
99 | |||
100 | $route = new CakeRoute('/invoices/add/:id/:idd', array('controller' => 'invoices', 'action' => 'add')); |
||
101 | $result = $route->compile(); |
||
102 | $this->assertRegExp($result, '/invoices/add/1/3'); |
||
103 | } |
||
104 | |||
105 | /**
|
||
106 | * test compiling routes with keys that have patterns
|
||
107 | *
|
||
108 | * @return void
|
||
109 | */
|
||
110 | public function testRouteCompilingWithParamPatterns() { |
||
111 | $route = new CakeRoute( |
||
112 | '/:controller/:action/:id',
|
||
113 | array(),
|
||
114 | array('id' => Router::ID) |
||
115 | ); |
||
116 | $result = $route->compile(); |
||
117 | $this->assertRegExp($result, '/posts/edit/1'); |
||
118 | $this->assertRegExp($result, '/posts/view/518098'); |
||
119 | $this->assertNotRegExp($result, '/posts/edit/name-of-post'); |
||
120 | $this->assertNotRegExp($result, '/posts/edit/4/other:param'); |
||
121 | $this->assertEquals(array('id', 'controller', 'action'), $route->keys); |
||
122 | |||
123 | $route = new CakeRoute( |
||
124 | '/:lang/:controller/:action/:id',
|
||
125 | array('controller' => 'testing4'), |
||
126 | array('id' => Router::ID, 'lang' => '[a-z]{3}') |
||
127 | ); |
||
128 | $result = $route->compile(); |
||
129 | $this->assertRegExp($result, '/eng/posts/edit/1'); |
||
130 | $this->assertRegExp($result, '/cze/articles/view/1'); |
||
131 | $this->assertNotRegExp($result, '/language/articles/view/2'); |
||
132 | $this->assertNotRegExp($result, '/eng/articles/view/name-of-article'); |
||
133 | $this->assertEquals(array('lang', 'id', 'controller', 'action'), $route->keys); |
||
134 | |||
135 | foreach (array(':', '@', ';', '$', '-') as $delim) { |
||
136 | $route = new CakeRoute('/posts/:id' . $delim . ':title'); |
||
137 | $result = $route->compile(); |
||
138 | |||
139 | $this->assertRegExp($result, '/posts/1' . $delim . 'name-of-article'); |
||
140 | $this->assertRegExp($result, '/posts/13244' . $delim . 'name-of_Article[]'); |
||
141 | $this->assertNotRegExp($result, '/posts/11!nameofarticle'); |
||
142 | $this->assertNotRegExp($result, '/posts/11'); |
||
143 | |||
144 | $this->assertEquals(array('title', 'id'), $route->keys); |
||
145 | } |
||
146 | |||
147 | $route = new CakeRoute( |
||
148 | '/posts/:id::title/:year',
|
||
149 | array('controller' => 'posts', 'action' => 'view'), |
||
150 | array('id' => Router::ID, 'year' => Router::YEAR, 'title' => '[a-z-_]+') |
||
151 | ); |
||
152 | $result = $route->compile(); |
||
153 | $this->assertRegExp($result, '/posts/1:name-of-article/2009/'); |
||
154 | $this->assertRegExp($result, '/posts/13244:name-of-article/1999'); |
||
155 | $this->assertNotRegExp($result, '/posts/hey_now:nameofarticle'); |
||
156 | $this->assertNotRegExp($result, '/posts/:nameofarticle/2009'); |
||
157 | $this->assertNotRegExp($result, '/posts/:nameofarticle/01'); |
||
158 | $this->assertEquals(array('year', 'title', 'id'), $route->keys); |
||
159 | |||
160 | $route = new CakeRoute( |
||
161 | '/posts/:url_title-(uuid::id)',
|
||
162 | array('controller' => 'posts', 'action' => 'view'), |
||
163 | array('pass' => array('id', 'url_title'), 'id' => Router::ID) |
||
164 | ); |
||
165 | $result = $route->compile(); |
||
166 | $this->assertRegExp($result, '/posts/some_title_for_article-(uuid:12534)/'); |
||
167 | $this->assertRegExp($result, '/posts/some_title_for_article-(uuid:12534)'); |
||
168 | $this->assertNotRegExp($result, '/posts/'); |
||
169 | $this->assertNotRegExp($result, '/posts/nameofarticle'); |
||
170 | $this->assertNotRegExp($result, '/posts/nameofarticle-12347'); |
||
171 | $this->assertEquals(array('url_title', 'id'), $route->keys); |
||
172 | } |
||
173 | |||
174 | /**
|
||
175 | * test more complex route compiling & parsing with mid route greedy stars
|
||
176 | * and optional routing parameters
|
||
177 | *
|
||
178 | * @return void
|
||
179 | */
|
||
180 | public function testComplexRouteCompilingAndParsing() { |
||
181 | $route = new CakeRoute( |
||
182 | '/posts/:month/:day/:year/*',
|
||
183 | array('controller' => 'posts', 'action' => 'view'), |
||
184 | array('year' => Router::YEAR, 'month' => Router::MONTH, 'day' => Router::DAY) |
||
185 | ); |
||
186 | $result = $route->compile(); |
||
187 | $this->assertRegExp($result, '/posts/08/01/2007/title-of-post'); |
||
188 | $result = $route->parse('/posts/08/01/2007/title-of-post'); |
||
189 | |||
190 | $this->assertEquals(7, count($result)); |
||
191 | $this->assertEquals('posts', $result['controller']); |
||
192 | $this->assertEquals('view', $result['action']); |
||
193 | $this->assertEquals('2007', $result['year']); |
||
194 | $this->assertEquals('08', $result['month']); |
||
195 | $this->assertEquals('01', $result['day']); |
||
196 | $this->assertEquals('title-of-post', $result['pass'][0]); |
||
197 | |||
198 | $route = new CakeRoute( |
||
199 | "/:extra/page/:slug/*",
|
||
200 | array('controller' => 'pages', 'action' => 'view', 'extra' => null), |
||
201 | array("extra" => '[a-z1-9_]*', "slug" => '[a-z1-9_]+', "action" => 'view') |
||
202 | ); |
||
203 | $result = $route->compile(); |
||
204 | |||
205 | $this->assertRegExp($result, '/some_extra/page/this_is_the_slug'); |
||
206 | $this->assertRegExp($result, '/page/this_is_the_slug'); |
||
207 | $this->assertEquals(array('slug', 'extra'), $route->keys); |
||
208 | $this->assertEquals(array('extra' => '[a-z1-9_]*', 'slug' => '[a-z1-9_]+', 'action' => 'view'), $route->options); |
||
209 | $expected = array( |
||
210 | 'controller' => 'pages', |
||
211 | 'action' => 'view' |
||
212 | ); |
||
213 | $this->assertEquals($expected, $route->defaults); |
||
214 | |||
215 | $route = new CakeRoute( |
||
216 | '/:controller/:action/*',
|
||
217 | array('project' => false), |
||
218 | array(
|
||
219 | 'controller' => 'source|wiki|commits|tickets|comments|view', |
||
220 | 'action' => 'branches|history|branch|logs|view|start|add|edit|modify' |
||
221 | ) |
||
222 | ); |
||
223 | $this->assertFalse($route->parse('/chaw_test/wiki')); |
||
224 | |||
225 | $result = $route->compile(); |
||
226 | $this->assertNotRegExp($result, '/some_project/source'); |
||
227 | $this->assertRegExp($result, '/source/view'); |
||
228 | $this->assertRegExp($result, '/source/view/other/params'); |
||
229 | $this->assertNotRegExp($result, '/chaw_test/wiki'); |
||
230 | $this->assertNotRegExp($result, '/source/wierd_action'); |
||
231 | } |
||
232 | |||
233 | /**
|
||
234 | * test that routes match their pattern.
|
||
235 | *
|
||
236 | * @return void
|
||
237 | */
|
||
238 | public function testMatchBasic() { |
||
239 | $route = new CakeRoute('/:controller/:action/:id', array('plugin' => null)); |
||
240 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null)); |
||
241 | $this->assertFalse($result); |
||
242 | |||
243 | $result = $route->match(array('plugin' => null, 'controller' => 'posts', 'action' => 'view', 0)); |
||
244 | $this->assertFalse($result); |
||
245 | |||
246 | $result = $route->match(array('plugin' => null, 'controller' => 'posts', 'action' => 'view', 'id' => 1)); |
||
247 | $this->assertEquals('/posts/view/1', $result); |
||
248 | |||
249 | $route = new CakeRoute('/', array('controller' => 'pages', 'action' => 'display', 'home')); |
||
250 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 'home')); |
||
251 | $this->assertEquals('/', $result); |
||
252 | |||
253 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 'about')); |
||
254 | $this->assertFalse($result); |
||
255 | |||
256 | $route = new CakeRoute('/pages/*', array('controller' => 'pages', 'action' => 'display')); |
||
257 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 'home')); |
||
258 | $this->assertEquals('/pages/home', $result); |
||
259 | |||
260 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 'about')); |
||
261 | $this->assertEquals('/pages/about', $result); |
||
262 | |||
263 | $route = new CakeRoute('/blog/:action', array('controller' => 'posts')); |
||
264 | $result = $route->match(array('controller' => 'posts', 'action' => 'view')); |
||
265 | $this->assertEquals('/blog/view', $result); |
||
266 | |||
267 | $result = $route->match(array('controller' => 'nodes', 'action' => 'view')); |
||
268 | $this->assertFalse($result); |
||
269 | |||
270 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 1)); |
||
271 | $this->assertFalse($result); |
||
272 | |||
273 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'id' => 2)); |
||
274 | $this->assertFalse($result); |
||
275 | |||
276 | $route = new CakeRoute('/foo/:controller/:action', array('action' => 'index')); |
||
277 | $result = $route->match(array('controller' => 'posts', 'action' => 'view')); |
||
278 | $this->assertEquals('/foo/posts/view', $result); |
||
279 | |||
280 | $route = new CakeRoute('/:plugin/:id/*', array('controller' => 'posts', 'action' => 'view')); |
||
281 | $result = $route->match(array('plugin' => 'test', 'controller' => 'posts', 'action' => 'view', 'id' => '1')); |
||
282 | $this->assertEquals('/test/1/', $result); |
||
283 | |||
284 | $result = $route->match(array('plugin' => 'fo', 'controller' => 'posts', 'action' => 'view', 'id' => '1', '0')); |
||
285 | $this->assertEquals('/fo/1/0', $result); |
||
286 | |||
287 | $result = $route->match(array('plugin' => 'fo', 'controller' => 'nodes', 'action' => 'view', 'id' => 1)); |
||
288 | $this->assertFalse($result); |
||
289 | |||
290 | $result = $route->match(array('plugin' => 'fo', 'controller' => 'posts', 'action' => 'edit', 'id' => 1)); |
||
291 | $this->assertFalse($result); |
||
292 | |||
293 | $route = new CakeRoute('/admin/subscriptions/:action/*', array( |
||
294 | 'controller' => 'subscribe', 'admin' => true, 'prefix' => 'admin' |
||
295 | )); |
||
296 | |||
297 | $url = array('controller' => 'subscribe', 'admin' => true, 'action' => 'edit', 1); |
||
298 | $result = $route->match($url); |
||
299 | $expected = '/admin/subscriptions/edit/1'; |
||
300 | $this->assertEquals($expected, $result); |
||
301 | |||
302 | $url = array( |
||
303 | 'controller' => 'subscribe', |
||
304 | 'admin' => true, |
||
305 | 'action' => 'edit_admin_e', |
||
306 | 1
|
||
307 | ); |
||
308 | $result = $route->match($url); |
||
309 | $expected = '/admin/subscriptions/edit_admin_e/1'; |
||
310 | $this->assertEquals($expected, $result); |
||
311 | |||
312 | $url = array('controller' => 'subscribe', 'admin' => true, 'action' => 'admin_edit', 1); |
||
313 | $result = $route->match($url); |
||
314 | $expected = '/admin/subscriptions/edit/1'; |
||
315 | $this->assertEquals($expected, $result); |
||
316 | } |
||
317 | |||
318 | /**
|
||
319 | * test that non-greedy routes fail with extra passed args
|
||
320 | *
|
||
321 | * @return void
|
||
322 | */
|
||
323 | public function testGreedyRouteFailurePassedArg() { |
||
324 | $route = new CakeRoute('/:controller/:action', array('plugin' => null)); |
||
325 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', '0')); |
||
326 | $this->assertFalse($result); |
||
327 | |||
328 | $route = new CakeRoute('/:controller/:action', array('plugin' => null)); |
||
329 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'test')); |
||
330 | $this->assertFalse($result); |
||
331 | } |
||
332 | |||
333 | /**
|
||
334 | * test that non-greedy routes fail with extra passed args
|
||
335 | *
|
||
336 | * @return void
|
||
337 | */
|
||
338 | public function testGreedyRouteFailureNamedParam() { |
||
339 | $route = new CakeRoute('/:controller/:action', array('plugin' => null)); |
||
340 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'page' => 1)); |
||
341 | $this->assertFalse($result); |
||
342 | } |
||
343 | |||
344 | /**
|
||
345 | * test that falsey values do not interrupt a match.
|
||
346 | *
|
||
347 | * @return void
|
||
348 | */
|
||
349 | public function testMatchWithFalseyValues() { |
||
350 | $route = new CakeRoute('/:controller/:action/*', array('plugin' => null)); |
||
351 | $result = $route->match(array( |
||
352 | 'controller' => 'posts', 'action' => 'index', 'plugin' => null, 'admin' => false |
||
353 | )); |
||
354 | $this->assertEquals('/posts/index/', $result); |
||
355 | } |
||
356 | |||
357 | /**
|
||
358 | * test match() with greedy routes, named parameters and passed args.
|
||
359 | *
|
||
360 | * @return void
|
||
361 | */
|
||
362 | public function testMatchWithNamedParametersAndPassedArgs() { |
||
363 | Router::connectNamed(true); |
||
364 | |||
365 | $route = new CakeRoute('/:controller/:action/*', array('plugin' => null)); |
||
366 | $result = $route->match(array('controller' => 'posts', 'action' => 'index', 'plugin' => null, 'page' => 1)); |
||
367 | $this->assertEquals('/posts/index/page:1', $result); |
||
368 | |||
369 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null, 5)); |
||
370 | $this->assertEquals('/posts/view/5', $result); |
||
371 | |||
372 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null, 0)); |
||
373 | $this->assertEquals('/posts/view/0', $result); |
||
374 | |||
375 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null, '0')); |
||
376 | $this->assertEquals('/posts/view/0', $result); |
||
377 | |||
378 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null, 5, 'page' => 1, 'limit' => 20, 'order' => 'title')); |
||
379 | $this->assertEquals('/posts/view/5/page:1/limit:20/order:title', $result); |
||
380 | |||
381 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'plugin' => null, 'word space', 'order' => 'Θ')); |
||
382 | $this->assertEquals('/posts/view/word%20space/order:%CE%98', $result); |
||
383 | |||
384 | $route = new CakeRoute('/test2/*', array('controller' => 'pages', 'action' => 'display', 2)); |
||
385 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 1)); |
||
386 | $this->assertFalse($result); |
||
387 | |||
388 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 2, 'something')); |
||
389 | $this->assertEquals('/test2/something', $result); |
||
390 | |||
391 | $result = $route->match(array('controller' => 'pages', 'action' => 'display', 5, 'something')); |
||
392 | $this->assertFalse($result); |
||
393 | } |
||
394 | |||
395 | /**
|
||
396 | * Ensure that named parameters are urldecoded
|
||
397 | *
|
||
398 | * @return void
|
||
399 | */
|
||
400 | public function testParseNamedParametersUrlDecode() { |
||
401 | Router::connectNamed(true); |
||
402 | $route = new CakeRoute('/:controller/:action/*', array('plugin' => null)); |
||
403 | |||
404 | $result = $route->parse('/posts/index/page:%CE%98'); |
||
405 | $this->assertEquals('Θ', $result['named']['page']); |
||
406 | |||
407 | $result = $route->parse('/posts/index/page[]:%CE%98'); |
||
408 | $this->assertEquals('Θ', $result['named']['page'][0]); |
||
409 | |||
410 | $result = $route->parse('/posts/index/something%20else/page[]:%CE%98'); |
||
411 | $this->assertEquals('Θ', $result['named']['page'][0]); |
||
412 | $this->assertEquals('something else', $result['pass'][0]); |
||
413 | } |
||
414 | |||
415 | /**
|
||
416 | * Ensure that keys at named parameters are urldecoded
|
||
417 | *
|
||
418 | * @return void
|
||
419 | */
|
||
420 | public function testParseNamedKeyUrlDecode() { |
||
421 | Router::connectNamed(true); |
||
422 | $route = new CakeRoute('/:controller/:action/*', array('plugin' => null)); |
||
423 | |||
424 | // checking /post/index/user[0]:a/user[1]:b
|
||
425 | $result = $route->parse('/posts/index/user%5B0%5D:a/user%5B1%5D:b'); |
||
426 | $this->assertArrayHasKey('user', $result['named']); |
||
427 | $this->assertEquals(array('a', 'b'), $result['named']['user']); |
||
428 | |||
429 | // checking /post/index/user[]:a/user[]:b
|
||
430 | $result = $route->parse('/posts/index/user%5B%5D:a/user%5B%5D:b'); |
||
431 | $this->assertArrayHasKey('user', $result['named']); |
||
432 | $this->assertEquals(array('a', 'b'), $result['named']['user']); |
||
433 | } |
||
434 | |||
435 | /**
|
||
436 | * test that named params with null/false are excluded
|
||
437 | *
|
||
438 | * @return void
|
||
439 | */
|
||
440 | public function testNamedParamsWithNullFalse() { |
||
441 | $route = new CakeRoute('/:controller/:action/*'); |
||
442 | $result = $route->match(array('controller' => 'posts', 'action' => 'index', 'page' => null, 'sort' => false)); |
||
443 | $this->assertEquals('/posts/index/', $result); |
||
444 | } |
||
445 | |||
446 | /**
|
||
447 | * test that match with patterns works.
|
||
448 | *
|
||
449 | * @return void
|
||
450 | */
|
||
451 | public function testMatchWithPatterns() { |
||
452 | $route = new CakeRoute('/:controller/:action/:id', array('plugin' => null), array('id' => '[0-9]+')); |
||
453 | $result = $route->match(array('controller' => 'posts', 'action' => 'view', 'id' => 'foo')); |
||
454 | $this->assertFalse($result); |
||
455 | |||
456 | $result = $route->match(array('plugin' => null, 'controller' => 'posts', 'action' => 'view', 'id' => '9')); |
||
457 | $this->assertEquals('/posts/view/9', $result); |
||
458 | |||
459 | $result = $route->match(array('plugin' => null, 'controller' => 'posts', 'action' => 'view', 'id' => '922')); |
||
460 | $this->assertEquals('/posts/view/922', $result); |
||
461 | |||
462 | $result = $route->match(array('plugin' => null, 'controller' => 'posts', 'action' => 'view', 'id' => 'a99')); |
||
463 | $this->assertFalse($result); |
||
464 | } |
||
465 | |||
466 | /**
|
||
467 | * test persistParams ability to persist parameters from $params and remove params.
|
||
468 | *
|
||
469 | * @return void
|
||
470 | */
|
||
471 | public function testPersistParams() { |
||
472 | $route = new CakeRoute( |
||
473 | '/:lang/:color/blog/:action',
|
||
474 | array('controller' => 'posts'), |
||
475 | array('persist' => array('lang', 'color')) |
||
476 | ); |
||
477 | $url = array('controller' => 'posts', 'action' => 'index'); |
||
478 | $params = array('lang' => 'en', 'color' => 'blue'); |
||
479 | $result = $route->persistParams($url, $params); |
||
480 | $this->assertEquals('en', $result['lang']); |
||
481 | $this->assertEquals('blue', $result['color']); |
||
482 | |||
483 | $url = array('controller' => 'posts', 'action' => 'index', 'color' => 'red'); |
||
484 | $params = array('lang' => 'en', 'color' => 'blue'); |
||
485 | $result = $route->persistParams($url, $params); |
||
486 | $this->assertEquals('en', $result['lang']); |
||
487 | $this->assertEquals('red', $result['color']); |
||
488 | } |
||
489 | |||
490 | /**
|
||
491 | * test persist with a non array value
|
||
492 | *
|
||
493 | * @return void
|
||
494 | */
|
||
495 | public function testPersistParamsNonArray() { |
||
496 | $url = array('controller' => 'posts', 'action' => 'index'); |
||
497 | $params = array('lang' => 'en', 'color' => 'blue'); |
||
498 | |||
499 | $route = new CakeRoute( |
||
500 | '/:lang/:color/blog/:action',
|
||
501 | array('controller' => 'posts') |
||
502 | // No persist options
|
||
503 | ); |
||
504 | $result = $route->persistParams($url, $params); |
||
505 | $this->assertEquals($url, $result); |
||
506 | |||
507 | $route = new CakeRoute( |
||
508 | '/:lang/:color/blog/:action',
|
||
509 | array('controller' => 'posts'), |
||
510 | array('persist' => false) |
||
511 | ); |
||
512 | $result = $route->persistParams($url, $params); |
||
513 | $this->assertEquals($url, $result); |
||
514 | |||
515 | $route = new CakeRoute( |
||
516 | '/:lang/:color/blog/:action',
|
||
517 | array('controller' => 'posts'), |
||
518 | array('persist' => 'derp') |
||
519 | ); |
||
520 | $result = $route->persistParams($url, $params); |
||
521 | $this->assertEquals($url, $result); |
||
522 | } |
||
523 | |||
524 | /**
|
||
525 | * test the parse method of CakeRoute.
|
||
526 | *
|
||
527 | * @return void
|
||
528 | */
|
||
529 | public function testParse() { |
||
530 | $route = new CakeRoute( |
||
531 | '/:controller/:action/:id',
|
||
532 | array('controller' => 'testing4', 'id' => null), |
||
533 | array('id' => Router::ID) |
||
534 | ); |
||
535 | $route->compile();
|
||
536 | $result = $route->parse('/posts/view/1'); |
||
537 | $this->assertEquals('posts', $result['controller']); |
||
538 | $this->assertEquals('view', $result['action']); |
||
539 | $this->assertEquals('1', $result['id']); |
||
540 | |||
541 | $route = new Cakeroute( |
||
542 | '/admin/:controller',
|
||
543 | array('prefix' => 'admin', 'admin' => 1, 'action' => 'index') |
||
544 | ); |
||
545 | $route->compile();
|
||
546 | $result = $route->parse('/admin/'); |
||
547 | $this->assertFalse($result); |
||
548 | |||
549 | $result = $route->parse('/admin/posts'); |
||
550 | $this->assertEquals('posts', $result['controller']); |
||
551 | $this->assertEquals('index', $result['action']); |
||
552 | } |
||
553 | |||
554 | /**
|
||
555 | * Test that :key elements are urldecoded
|
||
556 | *
|
||
557 | * @return void
|
||
558 | */
|
||
559 | public function testParseUrlDecodeElements() { |
||
560 | $route = new Cakeroute( |
||
561 | '/:controller/:slug',
|
||
562 | array('action' => 'view') |
||
563 | ); |
||
564 | $route->compile();
|
||
565 | $result = $route->parse('/posts/%E2%88%82%E2%88%82'); |
||
566 | $this->assertEquals('posts', $result['controller']); |
||
567 | $this->assertEquals('view', $result['action']); |
||
568 | $this->assertEquals('∂∂', $result['slug']); |
||
569 | |||
570 | $result = $route->parse('/posts/∂∂'); |
||
571 | $this->assertEquals('posts', $result['controller']); |
||
572 | $this->assertEquals('view', $result['action']); |
||
573 | $this->assertEquals('∂∂', $result['slug']); |
||
574 | } |
||
575 | |||
576 | /**
|
||
577 | * test numerically indexed defaults, get appended to pass
|
||
578 | *
|
||
579 | * @return void
|
||
580 | */
|
||
581 | public function testParseWithPassDefaults() { |
||
582 | $route = new Cakeroute('/:controller', array('action' => 'display', 'home')); |
||
583 | $result = $route->parse('/posts'); |
||
584 | $expected = array( |
||
585 | 'controller' => 'posts', |
||
586 | 'action' => 'display', |
||
587 | 'pass' => array('home'), |
||
588 | 'named' => array() |
||
589 | ); |
||
590 | $this->assertEquals($expected, $result); |
||
591 | } |
||
592 | |||
593 | /**
|
||
594 | * test that http header conditions can cause route failures.
|
||
595 | *
|
||
596 | * @return void
|
||
597 | */
|
||
598 | public function testParseWithHttpHeaderConditions() { |
||
599 | $_SERVER['REQUEST_METHOD'] = 'GET'; |
||
600 | $route = new CakeRoute('/sample', array('controller' => 'posts', 'action' => 'index', '[method]' => 'POST')); |
||
601 | |||
602 | $this->assertFalse($route->parse('/sample')); |
||
603 | } |
||
604 | |||
605 | /**
|
||
606 | * test that patterns work for :action
|
||
607 | *
|
||
608 | * @return void
|
||
609 | */
|
||
610 | public function testPatternOnAction() { |
||
611 | $route = new CakeRoute( |
||
612 | '/blog/:action/*',
|
||
613 | array('controller' => 'blog_posts'), |
||
614 | array('action' => 'other|actions') |
||
615 | ); |
||
616 | $result = $route->match(array('controller' => 'blog_posts', 'action' => 'foo')); |
||
617 | $this->assertFalse($result); |
||
618 | |||
619 | $result = $route->match(array('controller' => 'blog_posts', 'action' => 'actions')); |
||
620 | $this->assertNotEmpty($result); |
||
621 | |||
622 | $result = $route->parse('/blog/other'); |
||
623 | $expected = array('controller' => 'blog_posts', 'action' => 'other', 'pass' => array(), 'named' => array()); |
||
624 | $this->assertEquals($expected, $result); |
||
625 | |||
626 | $result = $route->parse('/blog/foobar'); |
||
627 | $this->assertFalse($result); |
||
628 | } |
||
629 | |||
630 | /**
|
||
631 | * test the parseArgs method
|
||
632 | *
|
||
633 | * @return void
|
||
634 | */
|
||
635 | public function testParsePassedArgument() { |
||
636 | $route = new CakeRoute('/:controller/:action/*'); |
||
637 | $result = $route->parse('/posts/edit/1/2/0'); |
||
638 | $expected = array( |
||
639 | 'controller' => 'posts', |
||
640 | 'action' => 'edit', |
||
641 | 'pass' => array('1', '2', '0'), |
||
642 | 'named' => array() |
||
643 | ); |
||
644 | $this->assertEquals($expected, $result); |
||
645 | |||
646 | $result = $route->parse('/posts/edit/a-string/page:1/sort:value'); |
||
647 | $expected = array( |
||
648 | 'controller' => 'posts', |
||
649 | 'action' => 'edit', |
||
650 | 'pass' => array('a-string'), |
||
651 | 'named' => array( |
||
652 | 'page' => 1, |
||
653 | 'sort' => 'value' |
||
654 | ) |
||
655 | ); |
||
656 | $this->assertEquals($expected, $result); |
||
657 | } |
||
658 | |||
659 | /**
|
||
660 | * test that only named parameter rules are followed.
|
||
661 | *
|
||
662 | * @return void
|
||
663 | */
|
||
664 | public function testParseNamedParametersWithRules() { |
||
665 | $route = new CakeRoute('/:controller/:action/*', array(), array( |
||
666 | 'named' => array( |
||
667 | 'wibble',
|
||
668 | 'fish' => array('action' => 'index'), |
||
669 | 'fizz' => array('controller' => array('comments', 'other')), |
||
670 | 'pattern' => 'val-[\d]+' |
||
671 | ) |
||
672 | )); |
||
673 | $result = $route->parse('/posts/display/wibble:spin/fish:trout/fizz:buzz/unknown:value'); |
||
674 | $expected = array( |
||
675 | 'controller' => 'posts', |
||
676 | 'action' => 'display', |
||
677 | 'pass' => array('fish:trout', 'fizz:buzz', 'unknown:value'), |
||
678 | 'named' => array( |
||
679 | 'wibble' => 'spin' |
||
680 | ) |
||
681 | ); |
||
682 | $this->assertEquals($expected, $result, 'Fish should not be parsed, as action != index'); |
||
683 | |||
684 | $result = $route->parse('/posts/index/wibble:spin/fish:trout/fizz:buzz'); |
||
685 | $expected = array( |
||
686 | 'controller' => 'posts', |
||
687 | 'action' => 'index', |
||
688 | 'pass' => array('fizz:buzz'), |
||
689 | 'named' => array( |
||
690 | 'wibble' => 'spin', |
||
691 | 'fish' => 'trout' |
||
692 | ) |
||
693 | ); |
||
694 | $this->assertEquals($expected, $result, 'Fizz should be parsed, as controller == comments|other'); |
||
695 | |||
696 | $result = $route->parse('/comments/index/wibble:spin/fish:trout/fizz:buzz'); |
||
697 | $expected = array( |
||
698 | 'controller' => 'comments', |
||
699 | 'action' => 'index', |
||
700 | 'pass' => array(), |
||
701 | 'named' => array( |
||
702 | 'wibble' => 'spin', |
||
703 | 'fish' => 'trout', |
||
704 | 'fizz' => 'buzz' |
||
705 | ) |
||
706 | ); |
||
707 | $this->assertEquals($expected, $result, 'All params should be parsed as conditions were met.'); |
||
708 | |||
709 | $result = $route->parse('/comments/index/pattern:val--'); |
||
710 | $expected = array( |
||
711 | 'controller' => 'comments', |
||
712 | 'action' => 'index', |
||
713 | 'pass' => array('pattern:val--'), |
||
714 | 'named' => array() |
||
715 | ); |
||
716 | $this->assertEquals($expected, $result, 'Named parameter pattern unmet.'); |
||
717 | |||
718 | $result = $route->parse('/comments/index/pattern:val-2'); |
||
719 | $expected = array( |
||
720 | 'controller' => 'comments', |
||
721 | 'action' => 'index', |
||
722 | 'pass' => array(), |
||
723 | 'named' => array('pattern' => 'val-2') |
||
724 | ); |
||
725 | $this->assertEquals($expected, $result, 'Named parameter pattern met.'); |
||
726 | } |
||
727 | |||
728 | /**
|
||
729 | * test that greedyNamed ignores rules.
|
||
730 | *
|
||
731 | * @return void
|
||
732 | */
|
||
733 | public function testParseGreedyNamed() { |
||
734 | $route = new CakeRoute('/:controller/:action/*', array(), array( |
||
735 | 'named' => array( |
||
736 | 'fizz' => array('controller' => 'comments'), |
||
737 | 'pattern' => 'val-[\d]+', |
||
738 | ), |
||
739 | 'greedyNamed' => true |
||
740 | )); |
||
741 | $result = $route->parse('/posts/display/wibble:spin/fizz:buzz/pattern:ignored'); |
||
742 | $expected = array( |
||
743 | 'controller' => 'posts', |
||
744 | 'action' => 'display', |
||
745 | 'pass' => array('fizz:buzz', 'pattern:ignored'), |
||
746 | 'named' => array( |
||
747 | 'wibble' => 'spin', |
||
748 | ) |
||
749 | ); |
||
750 | $this->assertEquals($expected, $result, 'Greedy named grabs everything, rules are followed'); |
||
751 | } |
||
752 | |||
753 | /**
|
||
754 | * Having greedNamed enabled should not capture routing.prefixes.
|
||
755 | *
|
||
756 | * @return void
|
||
757 | */
|
||
758 | public function testMatchGreedyNamedExcludesPrefixes() { |
||
759 | Configure::write('Routing.prefixes', array('admin')); |
||
760 | Router::reload();
|
||
761 | |||
762 | $route = new CakeRoute('/sales/*', array('controller' => 'sales', 'action' => 'index')); |
||
763 | $this->assertFalse($route->match(array('controller' => 'sales', 'action' => 'index', 'admin' => 1)), 'Greedy named consume routing prefixes.'); |
||
764 | } |
||
765 | |||
766 | /**
|
||
767 | * test that parsing array format named parameters works
|
||
768 | *
|
||
769 | * @return void
|
||
770 | */
|
||
771 | public function testParseArrayNamedParameters() { |
||
772 | $route = new CakeRoute('/:controller/:action/*'); |
||
773 | $result = $route->parse('/tests/action/var[]:val1/var[]:val2'); |
||
774 | $expected = array( |
||
775 | 'controller' => 'tests', |
||
776 | 'action' => 'action', |
||
777 | 'named' => array( |
||
778 | 'var' => array( |
||
779 | 'val1',
|
||
780 | 'val2'
|
||
781 | ) |
||
782 | ), |
||
783 | 'pass' => array(), |
||
784 | ); |
||
785 | $this->assertEquals($expected, $result); |
||
786 | |||
787 | $result = $route->parse('/tests/action/theanswer[is]:42/var[]:val2/var[]:val3'); |
||
788 | $expected = array( |
||
789 | 'controller' => 'tests', |
||
790 | 'action' => 'action', |
||
791 | 'named' => array( |
||
792 | 'theanswer' => array( |
||
793 | 'is' => 42 |
||
794 | ), |
||
795 | 'var' => array( |
||
796 | 'val2',
|
||
797 | 'val3'
|
||
798 | ) |
||
799 | ), |
||
800 | 'pass' => array(), |
||
801 | ); |
||
802 | $this->assertEquals($expected, $result); |
||
803 | |||
804 | $result = $route->parse('/tests/action/theanswer[is][not]:42/theanswer[]:5/theanswer[is]:6'); |
||
805 | $expected = array( |
||
806 | 'controller' => 'tests', |
||
807 | 'action' => 'action', |
||
808 | 'named' => array( |
||
809 | 'theanswer' => array( |
||
810 | 5,
|
||
811 | 'is' => array( |
||
812 | 6,
|
||
813 | 'not' => 42 |
||
814 | ) |
||
815 | ), |
||
816 | ), |
||
817 | 'pass' => array(), |
||
818 | ); |
||
819 | $this->assertEquals($expected, $result); |
||
820 | } |
||
821 | |||
822 | /**
|
||
823 | * Test that match can handle array named parameters
|
||
824 | *
|
||
825 | * @return void
|
||
826 | */
|
||
827 | public function testMatchNamedParametersArray() { |
||
828 | $route = new CakeRoute('/:controller/:action/*'); |
||
829 | |||
830 | $url = array( |
||
831 | 'controller' => 'posts', |
||
832 | 'action' => 'index', |
||
833 | 'filter' => array( |
||
834 | 'one',
|
||
835 | 'model' => 'value' |
||
836 | ) |
||
837 | ); |
||
838 | $result = $route->match($url); |
||
839 | $expected = '/posts/index/filter%5B0%5D:one/filter%5Bmodel%5D:value'; |
||
840 | $this->assertEquals($expected, $result); |
||
841 | |||
842 | $url = array( |
||
843 | 'controller' => 'posts', |
||
844 | 'action' => 'index', |
||
845 | 'filter' => array( |
||
846 | 'one',
|
||
847 | 'model' => array( |
||
848 | 'two',
|
||
849 | 'order' => 'field' |
||
850 | ) |
||
851 | ) |
||
852 | ); |
||
853 | $result = $route->match($url); |
||
854 | $expected = '/posts/index/filter%5B0%5D:one/filter%5Bmodel%5D%5B0%5D:two/filter%5Bmodel%5D%5Border%5D:field'; |
||
855 | $this->assertEquals($expected, $result); |
||
856 | } |
||
857 | |||
858 | /**
|
||
859 | * Test matching of parameters where one parameter name starts with another parameter name
|
||
860 | *
|
||
861 | * @return void
|
||
862 | */
|
||
863 | public function testMatchSimilarParameters() { |
||
864 | $route = new CakeRoute('/:thisParam/:thisParamIsLonger'); |
||
865 | |||
866 | $url = array( |
||
867 | 'thisParamIsLonger' => 'bar', |
||
868 | 'thisParam' => 'foo', |
||
869 | ); |
||
870 | |||
871 | $result = $route->match($url); |
||
872 | $expected = '/foo/bar'; |
||
873 | $this->assertEquals($expected, $result); |
||
874 | } |
||
875 | |||
876 | /**
|
||
877 | * Test match() with trailing ** style routes.
|
||
878 | *
|
||
879 | * @return void
|
||
880 | */
|
||
881 | public function testMatchTrailing() { |
||
882 | $route = new CakeRoute('/pages/**', array('controller' => 'pages', 'action' => 'display')); |
||
883 | $id = 'test/ spaces/漢字/la†în'; |
||
884 | $result = $route->match(array( |
||
885 | 'controller' => 'pages', |
||
886 | 'action' => 'display', |
||
887 | $id
|
||
888 | )); |
||
889 | $expected = '/pages/test/%20spaces/%E6%BC%A2%E5%AD%97/la%E2%80%A0%C3%AEn'; |
||
890 | $this->assertEquals($expected, $result); |
||
891 | } |
||
892 | |||
893 | /**
|
||
894 | * test restructuring args with pass key
|
||
895 | *
|
||
896 | * @return void
|
||
897 | */
|
||
898 | public function testPassArgRestructure() { |
||
899 | $route = new CakeRoute('/:controller/:action/:slug', array(), array( |
||
900 | 'pass' => array('slug') |
||
901 | )); |
||
902 | $result = $route->parse('/posts/view/my-title'); |
||
903 | $expected = array( |
||
904 | 'controller' => 'posts', |
||
905 | 'action' => 'view', |
||
906 | 'slug' => 'my-title', |
||
907 | 'pass' => array('my-title'), |
||
908 | 'named' => array() |
||
909 | ); |
||
910 | $this->assertEquals($expected, $result, 'Slug should have moved'); |
||
911 | } |
||
912 | |||
913 | /**
|
||
914 | * Test the /** special type on parsing.
|
||
915 | *
|
||
916 | * @return void
|
||
917 | */
|
||
918 | public function testParseTrailing() { |
||
919 | $route = new CakeRoute('/:controller/:action/**'); |
||
920 | $result = $route->parse('/posts/index/1/2/3/foo:bar'); |
||
921 | $expected = array( |
||
922 | 'controller' => 'posts', |
||
923 | 'action' => 'index', |
||
924 | 'pass' => array('1/2/3/foo:bar'), |
||
925 | 'named' => array() |
||
926 | ); |
||
927 | $this->assertEquals($expected, $result); |
||
928 | |||
929 | $result = $route->parse('/posts/index/http://example.com'); |
||
930 | $expected = array( |
||
931 | 'controller' => 'posts', |
||
932 | 'action' => 'index', |
||
933 | 'pass' => array('http://example.com'), |
||
934 | 'named' => array() |
||
935 | ); |
||
936 | $this->assertEquals($expected, $result); |
||
937 | } |
||
938 | |||
939 | /**
|
||
940 | * Test the /** special type on parsing - UTF8.
|
||
941 | *
|
||
942 | * @return void
|
||
943 | */
|
||
944 | public function testParseTrailingUTF8() { |
||
945 | $route = new CakeRoute('/category/**', array('controller' => 'categories', 'action' => 'index')); |
||
946 | $result = $route->parse('/category/%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84'); |
||
947 | $expected = array( |
||
948 | 'controller' => 'categories', |
||
949 | 'action' => 'index', |
||
950 | 'pass' => array('موبایل'), |
||
951 | 'named' => array() |
||
952 | ); |
||
953 | $this->assertEquals($expected, $result); |
||
954 | } |
||
955 | |||
956 | /**
|
||
957 | * test that utf-8 patterns work for :section
|
||
958 | *
|
||
959 | * @return void
|
||
960 | */
|
||
961 | public function testUTF8PatternOnSection() { |
||
962 | $route = new CakeRoute( |
||
963 | '/:section',
|
||
964 | array('plugin' => 'blogs', 'controller' => 'posts', 'action' => 'index'), |
||
965 | array(
|
||
966 | 'persist' => array('section'), |
||
967 | 'section' => 'آموزش|weblog' |
||
968 | ) |
||
969 | ); |
||
970 | |||
971 | $result = $route->parse('/%D8%A2%D9%85%D9%88%D8%B2%D8%B4'); |
||
972 | $expected = array('section' => 'آموزش', 'plugin' => 'blogs', 'controller' => 'posts', 'action' => 'index', 'pass' => array(), 'named' => array()); |
||
973 | $this->assertEquals($expected, $result); |
||
974 | |||
975 | $result = $route->parse('/weblog'); |
||
976 | $expected = array('section' => 'weblog', 'plugin' => 'blogs', 'controller' => 'posts', 'action' => 'index', 'pass' => array(), 'named' => array()); |
||
977 | $this->assertEquals($expected, $result); |
||
978 | } |
||
979 | |||
980 | /**
|
||
981 | * Test for __set_state magic method on CakeRoute
|
||
982 | *
|
||
983 | * @return void
|
||
984 | */
|
||
985 | public function testSetState() { |
||
986 | $route = CakeRoute::__set_state(array( |
||
987 | 'keys' => array(), |
||
988 | 'options' => array(), |
||
989 | 'defaults' => array( |
||
990 | 'controller' => 'pages', |
||
991 | 'action' => 'display', |
||
992 | 'home',
|
||
993 | ), |
||
994 | 'template' => '/', |
||
995 | '_greedy' => false, |
||
996 | '_compiledRoute' => null, |
||
997 | '_headerMap' => array ( |
||
998 | 'type' => 'content_type', |
||
999 | 'method' => 'request_method', |
||
1000 | 'server' => 'server_name', |
||
1001 | ), |
||
1002 | )); |
||
1003 | $this->assertInstanceOf('CakeRoute', $route); |
||
1004 | $this->assertSame('/', $route->match(array('controller' => 'pages', 'action' => 'display', 'home'))); |
||
1005 | $this->assertFalse($route->match(array('controller' => 'pages', 'action' => 'display', 'about'))); |
||
1006 | $expected = array('controller' => 'pages', 'action' => 'display', 'pass' => array('home'), 'named' => array()); |
||
1007 | $this->assertEquals($expected, $route->parse('/')); |
||
1008 | } |
||
1009 | |||
1010 | } |