pictcode / lib / Cake / Test / Case / Controller / ControllerTest.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (40.514 KB)
1 | 635eef61 | spyder1211 | <?php
|
---|---|---|---|
2 | /**
|
||
3 | * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
||
4 | * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
5 | *
|
||
6 | * Licensed under The MIT License
|
||
7 | * For full copyright and license information, please see the LICENSE.txt
|
||
8 | * Redistributions of files must retain the above copyright notice.
|
||
9 | *
|
||
10 | * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
11 | * @link http://cakephp.org CakePHP Project
|
||
12 | * @package Cake.Test.Case.Controller
|
||
13 | * @since CakePHP(tm) v 1.2.0.5436
|
||
14 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
15 | */
|
||
16 | |||
17 | App::uses('Controller', 'Controller'); |
||
18 | App::uses('Router', 'Routing'); |
||
19 | App::uses('CakeRequest', 'Network'); |
||
20 | App::uses('CakeResponse', 'Network'); |
||
21 | App::uses('SecurityComponent', 'Controller/Component'); |
||
22 | App::uses('CookieComponent', 'Controller/Component'); |
||
23 | |||
24 | /**
|
||
25 | * AppController class
|
||
26 | *
|
||
27 | * @package Cake.Test.Case.Controller
|
||
28 | */
|
||
29 | class ControllerTestAppController extends Controller { |
||
30 | |||
31 | /**
|
||
32 | * helpers property
|
||
33 | *
|
||
34 | * @var array
|
||
35 | */
|
||
36 | public $helpers = array('Html'); |
||
37 | |||
38 | /**
|
||
39 | * uses property
|
||
40 | *
|
||
41 | * @var array
|
||
42 | */
|
||
43 | public $uses = array('ControllerPost'); |
||
44 | |||
45 | /**
|
||
46 | * components property
|
||
47 | *
|
||
48 | * @var array
|
||
49 | */
|
||
50 | public $components = array('Cookie'); |
||
51 | } |
||
52 | |||
53 | /**
|
||
54 | * ControllerPost class
|
||
55 | *
|
||
56 | * @package Cake.Test.Case.Controller
|
||
57 | */
|
||
58 | class ControllerPost extends CakeTestModel { |
||
59 | |||
60 | /**
|
||
61 | * useTable property
|
||
62 | *
|
||
63 | * @var string
|
||
64 | */
|
||
65 | public $useTable = 'posts'; |
||
66 | |||
67 | /**
|
||
68 | * invalidFields property
|
||
69 | *
|
||
70 | * @var array
|
||
71 | */
|
||
72 | public $invalidFields = array('name' => 'error_msg'); |
||
73 | |||
74 | /**
|
||
75 | * lastQuery property
|
||
76 | *
|
||
77 | * @var mixed
|
||
78 | */
|
||
79 | public $lastQuery = null; |
||
80 | |||
81 | /**
|
||
82 | * beforeFind method
|
||
83 | *
|
||
84 | * @param mixed $query
|
||
85 | * @return void
|
||
86 | */
|
||
87 | public function beforeFind($query) { |
||
88 | $this->lastQuery = $query; |
||
89 | } |
||
90 | |||
91 | /**
|
||
92 | * find method
|
||
93 | *
|
||
94 | * @param string $type
|
||
95 | * @param array $options
|
||
96 | * @return void
|
||
97 | */
|
||
98 | public function find($type = 'first', $options = array()) { |
||
99 | if ($type === 'popular') { |
||
100 | $conditions = array($this->name . '.' . $this->primaryKey . ' > ' => '1'); |
||
101 | $options = Hash::merge($options, compact('conditions')); |
||
102 | return parent::find('all', $options); |
||
103 | } |
||
104 | return parent::find($type, $options); |
||
105 | } |
||
106 | |||
107 | } |
||
108 | |||
109 | /**
|
||
110 | * ControllerPostsController class
|
||
111 | *
|
||
112 | * @package Cake.Test.Case.Controller
|
||
113 | */
|
||
114 | class ControllerCommentsController extends ControllerTestAppController { |
||
115 | |||
116 | protected $_mergeParent = 'ControllerTestAppController'; |
||
117 | } |
||
118 | |||
119 | /**
|
||
120 | * ControllerComment class
|
||
121 | *
|
||
122 | * @package Cake.Test.Case.Controller
|
||
123 | */
|
||
124 | class ControllerComment extends CakeTestModel { |
||
125 | |||
126 | /**
|
||
127 | * name property
|
||
128 | *
|
||
129 | * @var string
|
||
130 | */
|
||
131 | public $name = 'Comment'; |
||
132 | |||
133 | /**
|
||
134 | * useTable property
|
||
135 | *
|
||
136 | * @var string
|
||
137 | */
|
||
138 | public $useTable = 'comments'; |
||
139 | |||
140 | /**
|
||
141 | * data property
|
||
142 | *
|
||
143 | * @var array
|
||
144 | */
|
||
145 | public $data = array('name' => 'Some Name'); |
||
146 | |||
147 | /**
|
||
148 | * alias property
|
||
149 | *
|
||
150 | * @var string
|
||
151 | */
|
||
152 | public $alias = 'ControllerComment'; |
||
153 | } |
||
154 | |||
155 | /**
|
||
156 | * ControllerAlias class
|
||
157 | *
|
||
158 | * @package Cake.Test.Case.Controller
|
||
159 | */
|
||
160 | class ControllerAlias extends CakeTestModel { |
||
161 | |||
162 | /**
|
||
163 | * alias property
|
||
164 | *
|
||
165 | * @var string
|
||
166 | */
|
||
167 | public $alias = 'ControllerSomeAlias'; |
||
168 | |||
169 | /**
|
||
170 | * useTable property
|
||
171 | *
|
||
172 | * @var string
|
||
173 | */
|
||
174 | public $useTable = 'posts'; |
||
175 | } |
||
176 | |||
177 | /**
|
||
178 | * NameTest class
|
||
179 | *
|
||
180 | * @package Cake.Test.Case.Controller
|
||
181 | */
|
||
182 | class NameTest extends CakeTestModel { |
||
183 | |||
184 | /**
|
||
185 | * name property
|
||
186 | * @var string
|
||
187 | */
|
||
188 | public $name = 'Name'; |
||
189 | |||
190 | /**
|
||
191 | * useTable property
|
||
192 | * @var string
|
||
193 | */
|
||
194 | public $useTable = 'comments'; |
||
195 | |||
196 | /**
|
||
197 | * alias property
|
||
198 | *
|
||
199 | * @var string
|
||
200 | */
|
||
201 | public $alias = 'Name'; |
||
202 | } |
||
203 | |||
204 | /**
|
||
205 | * TestController class
|
||
206 | *
|
||
207 | * @package Cake.Test.Case.Controller
|
||
208 | */
|
||
209 | class TestController extends ControllerTestAppController { |
||
210 | |||
211 | /**
|
||
212 | * helpers property
|
||
213 | *
|
||
214 | * @var array
|
||
215 | */
|
||
216 | public $helpers = array('Session'); |
||
217 | |||
218 | /**
|
||
219 | * components property
|
||
220 | *
|
||
221 | * @var array
|
||
222 | */
|
||
223 | public $components = array('Security'); |
||
224 | |||
225 | /**
|
||
226 | * uses property
|
||
227 | *
|
||
228 | * @var array
|
||
229 | */
|
||
230 | public $uses = array('ControllerComment', 'ControllerAlias'); |
||
231 | |||
232 | protected $_mergeParent = 'ControllerTestAppController'; |
||
233 | |||
234 | /**
|
||
235 | * index method
|
||
236 | *
|
||
237 | * @param mixed $testId
|
||
238 | * @param mixed $test2Id
|
||
239 | * @return void
|
||
240 | */
|
||
241 | public function index($testId, $testTwoId) { |
||
242 | $this->data = array( |
||
243 | 'testId' => $testId, |
||
244 | 'test2Id' => $testTwoId |
||
245 | ); |
||
246 | } |
||
247 | |||
248 | /**
|
||
249 | * view method
|
||
250 | *
|
||
251 | * @param mixed $testId
|
||
252 | * @param mixed $test2Id
|
||
253 | * @return void
|
||
254 | */
|
||
255 | public function view($testId, $testTwoId) { |
||
256 | $this->data = array( |
||
257 | 'testId' => $testId, |
||
258 | 'test2Id' => $testTwoId |
||
259 | ); |
||
260 | } |
||
261 | |||
262 | public function returner() { |
||
263 | return 'I am from the controller.'; |
||
264 | } |
||
265 | |||
266 | //@codingStandardsIgnoreStart
|
||
267 | protected function protected_m() { |
||
268 | } |
||
269 | |||
270 | private function private_m() { |
||
271 | } |
||
272 | |||
273 | public function _hidden() { |
||
274 | } |
||
275 | //@codingStandardsIgnoreEnd
|
||
276 | |||
277 | public function admin_add() { |
||
278 | } |
||
279 | |||
280 | } |
||
281 | |||
282 | /**
|
||
283 | * TestComponent class
|
||
284 | *
|
||
285 | * @package Cake.Test.Case.Controller
|
||
286 | */
|
||
287 | class TestComponent extends Object { |
||
288 | |||
289 | /**
|
||
290 | * beforeRedirect method
|
||
291 | *
|
||
292 | * @return void
|
||
293 | */
|
||
294 | public function beforeRedirect() { |
||
295 | } |
||
296 | |||
297 | /**
|
||
298 | * initialize method
|
||
299 | *
|
||
300 | * @return void
|
||
301 | */
|
||
302 | public function initialize(Controller $controller) { |
||
303 | } |
||
304 | |||
305 | /**
|
||
306 | * startup method
|
||
307 | *
|
||
308 | * @return void
|
||
309 | */
|
||
310 | public function startup(Controller $controller) { |
||
311 | } |
||
312 | |||
313 | /**
|
||
314 | * shutdown method
|
||
315 | *
|
||
316 | * @return void
|
||
317 | */
|
||
318 | public function shutdown(Controller $controller) { |
||
319 | } |
||
320 | |||
321 | /**
|
||
322 | * beforeRender callback
|
||
323 | *
|
||
324 | * @return void
|
||
325 | */
|
||
326 | public function beforeRender(Controller $controller) { |
||
327 | if ($this->viewclass) { |
||
328 | $controller->viewClass = $this->viewclass; |
||
329 | } |
||
330 | } |
||
331 | |||
332 | } |
||
333 | |||
334 | class Test2Component extends TestComponent { |
||
335 | |||
336 | public $model; |
||
337 | |||
338 | public function __construct(ComponentCollection $collection, $settings) { |
||
339 | $this->controller = $collection->getController(); |
||
340 | $this->model = $this->controller->modelClass; |
||
341 | } |
||
342 | |||
343 | public function beforeRender(Controller $controller) { |
||
344 | return false; |
||
345 | } |
||
346 | |||
347 | } |
||
348 | |||
349 | /**
|
||
350 | * AnotherTestController class
|
||
351 | *
|
||
352 | * @package Cake.Test.Case.Controller
|
||
353 | */
|
||
354 | class AnotherTestController extends ControllerTestAppController { |
||
355 | |||
356 | /**
|
||
357 | * uses property
|
||
358 | *
|
||
359 | * @var array
|
||
360 | */
|
||
361 | public $uses = false; |
||
362 | |||
363 | /**
|
||
364 | * merge parent
|
||
365 | *
|
||
366 | * @var string
|
||
367 | */
|
||
368 | protected $_mergeParent = 'ControllerTestAppController'; |
||
369 | } |
||
370 | |||
371 | /**
|
||
372 | * ControllerTest class
|
||
373 | *
|
||
374 | * @package Cake.Test.Case.Controller
|
||
375 | */
|
||
376 | class ControllerTest extends CakeTestCase { |
||
377 | |||
378 | /**
|
||
379 | * fixtures property
|
||
380 | *
|
||
381 | * @var array
|
||
382 | */
|
||
383 | public $fixtures = array( |
||
384 | 'core.post',
|
||
385 | 'core.comment'
|
||
386 | ); |
||
387 | |||
388 | /**
|
||
389 | * reset environment.
|
||
390 | *
|
||
391 | * @return void
|
||
392 | */
|
||
393 | public function setUp() { |
||
394 | parent::setUp();
|
||
395 | App::objects('plugin', null, false); |
||
396 | App::build();
|
||
397 | Router::reload();
|
||
398 | } |
||
399 | |||
400 | /**
|
||
401 | * tearDown
|
||
402 | *
|
||
403 | * @return void
|
||
404 | */
|
||
405 | public function tearDown() { |
||
406 | parent::tearDown();
|
||
407 | CakePlugin::unload();
|
||
408 | } |
||
409 | |||
410 | /**
|
||
411 | * testLoadModel method
|
||
412 | *
|
||
413 | * @return void
|
||
414 | */
|
||
415 | public function testLoadModel() { |
||
416 | $request = new CakeRequest('controller_posts/index'); |
||
417 | $response = $this->getMock('CakeResponse'); |
||
418 | $Controller = new Controller($request, $response); |
||
419 | |||
420 | $this->assertFalse(isset($Controller->ControllerPost)); |
||
421 | |||
422 | $result = $Controller->loadModel('ControllerPost'); |
||
423 | $this->assertTrue($result); |
||
424 | $this->assertInstanceOf('ControllerPost', $Controller->ControllerPost); |
||
425 | $this->assertContains('ControllerPost', $Controller->uses); |
||
426 | } |
||
427 | |||
428 | /**
|
||
429 | * Test loadModel() when uses = true.
|
||
430 | *
|
||
431 | * @return void
|
||
432 | */
|
||
433 | public function testLoadModelUsesTrue() { |
||
434 | $request = new CakeRequest('controller_posts/index'); |
||
435 | $response = $this->getMock('CakeResponse'); |
||
436 | $Controller = new Controller($request, $response); |
||
437 | $Controller->uses = true; |
||
438 | |||
439 | $Controller->loadModel('ControllerPost'); |
||
440 | $this->assertInstanceOf('ControllerPost', $Controller->ControllerPost); |
||
441 | $this->assertContains('ControllerPost', $Controller->uses); |
||
442 | } |
||
443 | |||
444 | /**
|
||
445 | * testLoadModel method from a plugin controller
|
||
446 | *
|
||
447 | * @return void
|
||
448 | */
|
||
449 | public function testLoadModelInPlugins() { |
||
450 | App::build(array( |
||
451 | 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), |
||
452 | 'Controller' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Controller' . DS), |
||
453 | 'Model' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS) |
||
454 | )); |
||
455 | CakePlugin::load('TestPlugin'); |
||
456 | App::uses('TestPluginAppController', 'TestPlugin.Controller'); |
||
457 | App::uses('TestPluginController', 'TestPlugin.Controller'); |
||
458 | |||
459 | $Controller = new TestPluginController(); |
||
460 | $Controller->plugin = 'TestPlugin'; |
||
461 | $Controller->uses = false; |
||
462 | |||
463 | $this->assertFalse(isset($Controller->Comment)); |
||
464 | |||
465 | $result = $Controller->loadModel('Comment'); |
||
466 | $this->assertTrue($result); |
||
467 | $this->assertInstanceOf('Comment', $Controller->Comment); |
||
468 | $this->assertTrue(in_array('Comment', $Controller->uses)); |
||
469 | |||
470 | ClassRegistry::flush(); |
||
471 | unset($Controller); |
||
472 | } |
||
473 | |||
474 | /**
|
||
475 | * testConstructClasses method
|
||
476 | *
|
||
477 | * @return void
|
||
478 | */
|
||
479 | public function testConstructClasses() { |
||
480 | $request = new CakeRequest('controller_posts/index'); |
||
481 | |||
482 | $Controller = new Controller($request); |
||
483 | $Controller->uses = array('ControllerPost', 'ControllerComment'); |
||
484 | $Controller->constructClasses();
|
||
485 | $this->assertInstanceOf('ControllerPost', $Controller->ControllerPost); |
||
486 | $this->assertInstanceOf('ControllerComment', $Controller->ControllerComment); |
||
487 | |||
488 | $this->assertEquals('Comment', $Controller->ControllerComment->name); |
||
489 | |||
490 | unset($Controller); |
||
491 | |||
492 | App::build(array('Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS))); |
||
493 | CakePlugin::load('TestPlugin'); |
||
494 | |||
495 | $Controller = new Controller($request); |
||
496 | $Controller->uses = array('TestPlugin.TestPluginPost'); |
||
497 | $Controller->constructClasses();
|
||
498 | |||
499 | $this->assertTrue(isset($Controller->TestPluginPost)); |
||
500 | $this->assertInstanceOf('TestPluginPost', $Controller->TestPluginPost); |
||
501 | } |
||
502 | |||
503 | /**
|
||
504 | * testConstructClassesWithComponents method
|
||
505 | *
|
||
506 | * @return void
|
||
507 | */
|
||
508 | public function testConstructClassesWithComponents() { |
||
509 | $Controller = new TestPluginController(new CakeRequest(), new CakeResponse()); |
||
510 | $Controller->uses = array('NameTest'); |
||
511 | $Controller->components[] = 'Test2'; |
||
512 | |||
513 | $Controller->constructClasses();
|
||
514 | $this->assertEquals('NameTest', $Controller->Test2->model); |
||
515 | $this->assertEquals('Name', $Controller->NameTest->name); |
||
516 | $this->assertEquals('Name', $Controller->NameTest->alias); |
||
517 | } |
||
518 | |||
519 | /**
|
||
520 | * testAliasName method
|
||
521 | *
|
||
522 | * @return void
|
||
523 | */
|
||
524 | public function testAliasName() { |
||
525 | $request = new CakeRequest('controller_posts/index'); |
||
526 | $Controller = new Controller($request); |
||
527 | $Controller->uses = array('NameTest'); |
||
528 | $Controller->constructClasses();
|
||
529 | |||
530 | $this->assertEquals('Name', $Controller->NameTest->name); |
||
531 | $this->assertEquals('Name', $Controller->NameTest->alias); |
||
532 | |||
533 | unset($Controller); |
||
534 | } |
||
535 | |||
536 | /**
|
||
537 | * testFlash method
|
||
538 | *
|
||
539 | * @return void
|
||
540 | */
|
||
541 | public function testFlash() { |
||
542 | $request = new CakeRequest('controller_posts/index'); |
||
543 | $request->webroot = '/'; |
||
544 | $request->base = '/'; |
||
545 | |||
546 | $Controller = new Controller($request, $this->getMock('CakeResponse', array('_sendHeader'))); |
||
547 | $Controller->flash('this should work', '/flash'); |
||
548 | $result = $Controller->response->body(); |
||
549 | |||
550 | $expected = '<!DOCTYPE html> |
||
551 | <html>
|
||
552 | <head>
|
||
553 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
554 | <title>this should work</title>
|
||
555 | <style><!--
|
||
556 | P { text-align:center; font:bold 1.1em sans-serif }
|
||
557 | A { color:#444; text-decoration:none }
|
||
558 | A:HOVER { text-decoration: underline; color:#44E }
|
||
559 | --></style>
|
||
560 | </head>
|
||
561 | <body>
|
||
562 | <p><a href="/flash">this should work</a></p>
|
||
563 | </body>
|
||
564 | </html>';
|
||
565 | $result = str_replace(array("\t", "\r\n", "\n"), "", $result); |
||
566 | $expected = str_replace(array("\t", "\r\n", "\n"), "", $expected); |
||
567 | $this->assertEquals($expected, $result); |
||
568 | |||
569 | App::build(array( |
||
570 | 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS) |
||
571 | )); |
||
572 | $Controller = new Controller($request); |
||
573 | $Controller->response = $this->getMock('CakeResponse', array('_sendHeader')); |
||
574 | $Controller->flash('this should work', '/flash', 1, 'ajax2'); |
||
575 | $result = $Controller->response->body(); |
||
576 | $this->assertRegExp('/Ajax!/', $result); |
||
577 | App::build();
|
||
578 | } |
||
579 | |||
580 | /**
|
||
581 | * testControllerSet method
|
||
582 | *
|
||
583 | * @return void
|
||
584 | */
|
||
585 | public function testControllerSet() { |
||
586 | $request = new CakeRequest('controller_posts/index'); |
||
587 | $Controller = new Controller($request); |
||
588 | |||
589 | $Controller->set('variable_with_underscores', null); |
||
590 | $this->assertTrue(array_key_exists('variable_with_underscores', $Controller->viewVars)); |
||
591 | |||
592 | $Controller->viewVars = array(); |
||
593 | $viewVars = array('ModelName' => array('id' => 1, 'name' => 'value')); |
||
594 | $Controller->set($viewVars); |
||
595 | $this->assertTrue(array_key_exists('ModelName', $Controller->viewVars)); |
||
596 | |||
597 | $Controller->viewVars = array(); |
||
598 | $Controller->set('variable_with_underscores', 'value'); |
||
599 | $this->assertTrue(array_key_exists('variable_with_underscores', $Controller->viewVars)); |
||
600 | |||
601 | $Controller->viewVars = array(); |
||
602 | $viewVars = array('ModelName' => 'name'); |
||
603 | $Controller->set($viewVars); |
||
604 | $this->assertTrue(array_key_exists('ModelName', $Controller->viewVars)); |
||
605 | |||
606 | $Controller->set('title', 'someTitle'); |
||
607 | $this->assertSame($Controller->viewVars['title'], 'someTitle'); |
||
608 | |||
609 | $Controller->viewVars = array(); |
||
610 | $expected = array('ModelName' => 'name', 'ModelName2' => 'name2'); |
||
611 | $Controller->set(array('ModelName', 'ModelName2'), array('name', 'name2')); |
||
612 | $this->assertSame($expected, $Controller->viewVars); |
||
613 | |||
614 | $Controller->viewVars = array(); |
||
615 | $Controller->set(array(3 => 'three', 4 => 'four')); |
||
616 | $Controller->set(array(1 => 'one', 2 => 'two')); |
||
617 | $expected = array(3 => 'three', 4 => 'four', 1 => 'one', 2 => 'two'); |
||
618 | $this->assertEquals($expected, $Controller->viewVars); |
||
619 | } |
||
620 | |||
621 | /**
|
||
622 | * testRender method
|
||
623 | *
|
||
624 | * @return void
|
||
625 | */
|
||
626 | public function testRender() { |
||
627 | App::build(array( |
||
628 | 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS) |
||
629 | ), App::RESET); |
||
630 | ClassRegistry::flush(); |
||
631 | $request = new CakeRequest('controller_posts/index'); |
||
632 | $request->params['action'] = 'index'; |
||
633 | |||
634 | $Controller = new Controller($request, new CakeResponse()); |
||
635 | $Controller->viewPath = 'Posts'; |
||
636 | |||
637 | $result = $Controller->render('index'); |
||
638 | $this->assertRegExp('/posts index/', (string)$result); |
||
639 | |||
640 | $Controller->view = 'index'; |
||
641 | $result = $Controller->render(); |
||
642 | $this->assertRegExp('/posts index/', (string)$result); |
||
643 | |||
644 | $result = $Controller->render('/Elements/test_element'); |
||
645 | $this->assertRegExp('/this is the test element/', (string)$result); |
||
646 | $Controller->view = null; |
||
647 | |||
648 | $Controller = new TestController($request, new CakeResponse()); |
||
649 | $Controller->uses = array('ControllerAlias', 'TestPlugin.ControllerComment', 'ControllerPost'); |
||
650 | $Controller->helpers = array('Html'); |
||
651 | $Controller->constructClasses();
|
||
652 | $Controller->ControllerComment->validationErrors = array('title' => 'tooShort'); |
||
653 | $expected = $Controller->ControllerComment->validationErrors; |
||
654 | |||
655 | $Controller->viewPath = 'Posts'; |
||
656 | $Controller->render('index'); |
||
657 | $View = $Controller->View; |
||
658 | $this->assertTrue(isset($View->validationErrors['ControllerComment'])); |
||
659 | $this->assertEquals($expected, $View->validationErrors['ControllerComment']); |
||
660 | |||
661 | $expectedModels = array( |
||
662 | 'ControllerAlias' => array('plugin' => null, 'className' => 'ControllerAlias'), |
||
663 | 'ControllerComment' => array('plugin' => 'TestPlugin', 'className' => 'ControllerComment'), |
||
664 | 'ControllerPost' => array('plugin' => null, 'className' => 'ControllerPost') |
||
665 | ); |
||
666 | $this->assertEquals($expectedModels, $Controller->request->params['models']); |
||
667 | |||
668 | ClassRegistry::flush(); |
||
669 | App::build();
|
||
670 | } |
||
671 | |||
672 | /**
|
||
673 | * test that a component beforeRender can change the controller view class.
|
||
674 | *
|
||
675 | * @return void
|
||
676 | */
|
||
677 | public function testComponentBeforeRenderChangingViewClass() { |
||
678 | App::build(array( |
||
679 | 'View' => array( |
||
680 | CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS |
||
681 | ) |
||
682 | ), true);
|
||
683 | $Controller = new Controller($this->getMock('CakeRequest'), new CakeResponse()); |
||
684 | $Controller->uses = array(); |
||
685 | $Controller->components = array('Test'); |
||
686 | $Controller->constructClasses();
|
||
687 | $Controller->Test->viewclass = 'Theme'; |
||
688 | $Controller->viewPath = 'Posts'; |
||
689 | $Controller->theme = 'TestTheme'; |
||
690 | $result = $Controller->render('index'); |
||
691 | $this->assertRegExp('/default test_theme layout/', (string)$result); |
||
692 | App::build();
|
||
693 | } |
||
694 | |||
695 | /**
|
||
696 | * test that a component beforeRender can change the controller view class.
|
||
697 | *
|
||
698 | * @return void
|
||
699 | */
|
||
700 | public function testComponentCancelRender() { |
||
701 | $Controller = new Controller($this->getMock('CakeRequest'), new CakeResponse()); |
||
702 | $Controller->uses = array(); |
||
703 | $Controller->components = array('Test2'); |
||
704 | $Controller->constructClasses();
|
||
705 | $result = $Controller->render('index'); |
||
706 | $this->assertInstanceOf('CakeResponse', $result); |
||
707 | } |
||
708 | |||
709 | /**
|
||
710 | * testToBeInheritedGuardmethods method
|
||
711 | *
|
||
712 | * @return void
|
||
713 | */
|
||
714 | public function testToBeInheritedGuardmethods() { |
||
715 | $request = new CakeRequest('controller_posts/index'); |
||
716 | |||
717 | $Controller = new Controller($request, $this->getMock('CakeResponse')); |
||
718 | $this->assertTrue($Controller->beforeScaffold('')); |
||
719 | $this->assertTrue($Controller->afterScaffoldSave('')); |
||
720 | $this->assertTrue($Controller->afterScaffoldSaveError('')); |
||
721 | $this->assertFalse($Controller->scaffoldError('')); |
||
722 | } |
||
723 | |||
724 | /**
|
||
725 | * Generates status codes for redirect test.
|
||
726 | *
|
||
727 | * @return void
|
||
728 | */
|
||
729 | public static function statusCodeProvider() { |
||
730 | return array( |
||
731 | array(300, "Multiple Choices"), |
||
732 | array(301, "Moved Permanently"), |
||
733 | array(302, "Found"), |
||
734 | array(303, "See Other"), |
||
735 | array(304, "Not Modified"), |
||
736 | array(305, "Use Proxy"), |
||
737 | array(307, "Temporary Redirect"), |
||
738 | array(403, "Forbidden"), |
||
739 | ); |
||
740 | } |
||
741 | |||
742 | /**
|
||
743 | * testRedirect method
|
||
744 | *
|
||
745 | * @dataProvider statusCodeProvider
|
||
746 | * @return void
|
||
747 | */
|
||
748 | public function testRedirectByCode($code, $msg) { |
||
749 | $Controller = new Controller(null); |
||
750 | $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); |
||
751 | |||
752 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
753 | |||
754 | $Controller->response->expects($this->once())->method('statusCode') |
||
755 | ->with($code);
|
||
756 | $Controller->response->expects($this->once())->method('header') |
||
757 | ->with('Location', 'http://cakephp.org'); |
||
758 | |||
759 | $Controller->redirect('http://cakephp.org', (int)$code, false); |
||
760 | $this->assertFalse($Controller->autoRender); |
||
761 | } |
||
762 | |||
763 | /**
|
||
764 | * test redirecting by message
|
||
765 | *
|
||
766 | * @dataProvider statusCodeProvider
|
||
767 | * @return void
|
||
768 | */
|
||
769 | public function testRedirectByMessage($code, $msg) { |
||
770 | $Controller = new Controller(null); |
||
771 | $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); |
||
772 | |||
773 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
774 | |||
775 | $Controller->response->expects($this->once())->method('statusCode') |
||
776 | ->with($code);
|
||
777 | |||
778 | $Controller->response->expects($this->once())->method('header') |
||
779 | ->with('Location', 'http://cakephp.org'); |
||
780 | |||
781 | $Controller->redirect('http://cakephp.org', $msg, false); |
||
782 | $this->assertFalse($Controller->autoRender); |
||
783 | } |
||
784 | |||
785 | /**
|
||
786 | * test that redirect triggers methods on the components.
|
||
787 | *
|
||
788 | * @return void
|
||
789 | */
|
||
790 | public function testRedirectTriggeringComponentsReturnNull() { |
||
791 | $Controller = new Controller(null); |
||
792 | $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); |
||
793 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
794 | |||
795 | $Controller->Components->expects($this->once())->method('trigger') |
||
796 | ->will($this->returnValue(null)); |
||
797 | |||
798 | $Controller->response->expects($this->once())->method('statusCode') |
||
799 | ->with(301);
|
||
800 | |||
801 | $Controller->response->expects($this->once())->method('header') |
||
802 | ->with('Location', 'http://cakephp.org'); |
||
803 | |||
804 | $Controller->redirect('http://cakephp.org', 301, false); |
||
805 | } |
||
806 | |||
807 | /**
|
||
808 | * test that beforeRedirect callback returning null doesn't affect things.
|
||
809 | *
|
||
810 | * @return void
|
||
811 | */
|
||
812 | public function testRedirectBeforeRedirectModifyingParams() { |
||
813 | $Controller = new Controller(null); |
||
814 | $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); |
||
815 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
816 | |||
817 | $Controller->Components->expects($this->once())->method('trigger') |
||
818 | ->will($this->returnValue(array('http://book.cakephp.org'))); |
||
819 | |||
820 | $Controller->response->expects($this->once())->method('statusCode') |
||
821 | ->with(301);
|
||
822 | |||
823 | $Controller->response->expects($this->once())->method('header') |
||
824 | ->with('Location', 'http://book.cakephp.org'); |
||
825 | |||
826 | $Controller->redirect('http://cakephp.org', 301, false); |
||
827 | } |
||
828 | |||
829 | /**
|
||
830 | * test that beforeRedirect callback returning null doesn't affect things.
|
||
831 | *
|
||
832 | * @return void
|
||
833 | */
|
||
834 | public function testRedirectBeforeRedirectModifyingParamsArrayReturn() { |
||
835 | $Controller = $this->getMock('Controller', array('header', '_stop')); |
||
836 | $Controller->response = $this->getMock('CakeResponse'); |
||
837 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
838 | |||
839 | $return = array( |
||
840 | array(
|
||
841 | 'url' => 'http://example.com/test/1', |
||
842 | 'exit' => false, |
||
843 | 'status' => 302 |
||
844 | ), |
||
845 | array(
|
||
846 | 'url' => 'http://example.com/test/2', |
||
847 | ), |
||
848 | ); |
||
849 | $Controller->Components->expects($this->once())->method('trigger') |
||
850 | ->will($this->returnValue($return)); |
||
851 | |||
852 | $Controller->response->expects($this->once())->method('header') |
||
853 | ->with('Location', 'http://example.com/test/2'); |
||
854 | |||
855 | $Controller->response->expects($this->at(1))->method('statusCode') |
||
856 | ->with(302);
|
||
857 | |||
858 | $Controller->expects($this->never())->method('_stop'); |
||
859 | $Controller->redirect('http://cakephp.org', 301); |
||
860 | } |
||
861 | |||
862 | /**
|
||
863 | * test that beforeRedirect callback returning false in controller
|
||
864 | *
|
||
865 | * @return void
|
||
866 | */
|
||
867 | public function testRedirectBeforeRedirectInController() { |
||
868 | $Controller = $this->getMock('Controller', array('_stop', 'beforeRedirect')); |
||
869 | $Controller->response = $this->getMock('CakeResponse', array('header')); |
||
870 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
871 | |||
872 | $Controller->expects($this->once())->method('beforeRedirect') |
||
873 | ->with('http://cakephp.org')
|
||
874 | ->will($this->returnValue(false)); |
||
875 | $Controller->response->expects($this->never())->method('header'); |
||
876 | $Controller->expects($this->never())->method('_stop'); |
||
877 | $Controller->redirect('http://cakephp.org'); |
||
878 | } |
||
879 | |||
880 | /**
|
||
881 | * Test that beforeRedirect works with returning an array from the controller method.
|
||
882 | *
|
||
883 | * @return void
|
||
884 | */
|
||
885 | public function testRedirectBeforeRedirectInControllerWithArray() { |
||
886 | $Controller = $this->getMock('Controller', array('_stop', 'beforeRedirect')); |
||
887 | $Controller->response = $this->getMock('CakeResponse', array('header')); |
||
888 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
889 | |||
890 | $Controller->expects($this->once()) |
||
891 | ->method('beforeRedirect')
|
||
892 | ->with('http://cakephp.org', null, true) |
||
893 | ->will($this->returnValue(array( |
||
894 | 'url' => 'http://example.org', |
||
895 | 'status' => 302, |
||
896 | 'exit' => true |
||
897 | ))); |
||
898 | |||
899 | $Controller->response->expects($this->at(0)) |
||
900 | ->method('header')
|
||
901 | ->with('Location', 'http://example.org'); |
||
902 | |||
903 | $Controller->expects($this->once())->method('_stop'); |
||
904 | $Controller->redirect('http://cakephp.org'); |
||
905 | } |
||
906 | |||
907 | /**
|
||
908 | * testMergeVars method
|
||
909 | *
|
||
910 | * @return void
|
||
911 | */
|
||
912 | public function testMergeVars() { |
||
913 | $request = new CakeRequest('controller_posts/index'); |
||
914 | |||
915 | $TestController = new TestController($request); |
||
916 | $TestController->constructClasses();
|
||
917 | |||
918 | $testVars = get_class_vars('TestController'); |
||
919 | $appVars = get_class_vars('ControllerTestAppController'); |
||
920 | |||
921 | $components = is_array($appVars['components']) |
||
922 | ? array_merge($appVars['components'], $testVars['components']) |
||
923 | : $testVars['components']; |
||
924 | if (!in_array('Session', $components)) { |
||
925 | $components[] = 'Session'; |
||
926 | } |
||
927 | $helpers = is_array($appVars['helpers']) |
||
928 | ? array_merge($appVars['helpers'], $testVars['helpers']) |
||
929 | : $testVars['helpers']; |
||
930 | $uses = is_array($appVars['uses']) |
||
931 | ? array_merge($appVars['uses'], $testVars['uses']) |
||
932 | : $testVars['uses']; |
||
933 | |||
934 | $this->assertEquals(0, count(array_diff_key($TestController->helpers, array_flip($helpers)))); |
||
935 | $this->assertEquals(0, count(array_diff($TestController->uses, $uses))); |
||
936 | $this->assertEquals(count(array_diff_assoc(Hash::normalize($TestController->components), Hash::normalize($components))), 0); |
||
937 | |||
938 | $expected = array('ControllerComment', 'ControllerAlias', 'ControllerPost'); |
||
939 | $this->assertEquals($expected, $TestController->uses, '$uses was merged incorrectly, ControllerTestAppController models should be last.'); |
||
940 | |||
941 | $TestController = new AnotherTestController($request); |
||
942 | $TestController->constructClasses();
|
||
943 | |||
944 | $appVars = get_class_vars('ControllerTestAppController'); |
||
945 | $testVars = get_class_vars('AnotherTestController'); |
||
946 | |||
947 | $this->assertTrue(in_array('ControllerPost', $appVars['uses'])); |
||
948 | $this->assertFalse($testVars['uses']); |
||
949 | |||
950 | $this->assertFalse(property_exists($TestController, 'ControllerPost')); |
||
951 | |||
952 | $TestController = new ControllerCommentsController($request); |
||
953 | $TestController->constructClasses();
|
||
954 | |||
955 | $appVars = get_class_vars('ControllerTestAppController'); |
||
956 | $testVars = get_class_vars('ControllerCommentsController'); |
||
957 | |||
958 | $this->assertTrue(in_array('ControllerPost', $appVars['uses'])); |
||
959 | $this->assertEquals(array('ControllerPost'), $testVars['uses']); |
||
960 | |||
961 | $this->assertTrue(isset($TestController->ControllerPost)); |
||
962 | $this->assertTrue(isset($TestController->ControllerComment)); |
||
963 | } |
||
964 | |||
965 | /**
|
||
966 | * test that options from child classes replace those in the parent classes.
|
||
967 | *
|
||
968 | * @return void
|
||
969 | */
|
||
970 | public function testChildComponentOptionsSupercedeParents() { |
||
971 | $request = new CakeRequest('controller_posts/index'); |
||
972 | |||
973 | $TestController = new TestController($request); |
||
974 | |||
975 | $expected = array('foo'); |
||
976 | $TestController->components = array('Cookie' => $expected); |
||
977 | $TestController->constructClasses();
|
||
978 | $this->assertEquals($expected, $TestController->components['Cookie']); |
||
979 | } |
||
980 | |||
981 | /**
|
||
982 | * Ensure that _mergeControllerVars is not being greedy and merging with
|
||
983 | * ControllerTestAppController when you make an instance of Controller
|
||
984 | *
|
||
985 | * @return void
|
||
986 | */
|
||
987 | public function testMergeVarsNotGreedy() { |
||
988 | $request = new CakeRequest('controller_posts/index'); |
||
989 | |||
990 | $Controller = new Controller($request); |
||
991 | $Controller->components = array(); |
||
992 | $Controller->uses = array(); |
||
993 | $Controller->constructClasses();
|
||
994 | |||
995 | $this->assertFalse(isset($Controller->Session)); |
||
996 | $this->assertFalse(isset($Controller->Flash)); |
||
997 | } |
||
998 | |||
999 | /**
|
||
1000 | * testReferer method
|
||
1001 | *
|
||
1002 | * @return void
|
||
1003 | */
|
||
1004 | public function testReferer() { |
||
1005 | $request = $this->getMock('CakeRequest'); |
||
1006 | |||
1007 | $request->expects($this->any())->method('referer') |
||
1008 | ->with(true)
|
||
1009 | ->will($this->returnValue('/posts/index')); |
||
1010 | |||
1011 | $Controller = new Controller($request); |
||
1012 | $result = $Controller->referer(null, true); |
||
1013 | $this->assertEquals('/posts/index', $result); |
||
1014 | |||
1015 | $Controller = new Controller($request); |
||
1016 | $request->setReturnValue('referer', '/', array(true)); |
||
1017 | $result = $Controller->referer(array('controller' => 'posts', 'action' => 'index'), true); |
||
1018 | $this->assertEquals('/posts/index', $result); |
||
1019 | |||
1020 | $request = $this->getMock('CakeRequest'); |
||
1021 | |||
1022 | $request->expects($this->any())->method('referer') |
||
1023 | ->with(false)
|
||
1024 | ->will($this->returnValue('http://localhost/posts/index')); |
||
1025 | |||
1026 | $Controller = new Controller($request); |
||
1027 | $result = $Controller->referer(); |
||
1028 | $this->assertEquals('http://localhost/posts/index', $result); |
||
1029 | |||
1030 | $Controller = new Controller(null); |
||
1031 | $result = $Controller->referer(); |
||
1032 | $this->assertEquals('/', $result); |
||
1033 | } |
||
1034 | |||
1035 | /**
|
||
1036 | * Test that the referer is not absolute if it is '/'.
|
||
1037 | *
|
||
1038 | * This avoids the base path being applied twice on string urls.
|
||
1039 | *
|
||
1040 | * @return void
|
||
1041 | */
|
||
1042 | public function testRefererSlash() { |
||
1043 | $request = $this->getMock('CakeRequest', array('referer')); |
||
1044 | $request->base = '/base'; |
||
1045 | $request->expects($this->any()) |
||
1046 | ->method('referer')
|
||
1047 | ->will($this->returnValue('/')); |
||
1048 | Router::setRequestInfo($request); |
||
1049 | |||
1050 | $controller = new Controller($request); |
||
1051 | $result = $controller->referer('/', true); |
||
1052 | $this->assertEquals('/', $result); |
||
1053 | |||
1054 | $controller = new Controller($request); |
||
1055 | $result = $controller->referer('/some/path', true); |
||
1056 | $this->assertEquals('/base/some/path', $result); |
||
1057 | } |
||
1058 | |||
1059 | /**
|
||
1060 | * testSetAction method
|
||
1061 | *
|
||
1062 | * @return void
|
||
1063 | */
|
||
1064 | public function testSetAction() { |
||
1065 | $request = new CakeRequest('controller_posts/index'); |
||
1066 | |||
1067 | $TestController = new TestController($request); |
||
1068 | $TestController->setAction('view', 1, 2); |
||
1069 | $expected = array('testId' => 1, 'test2Id' => 2); |
||
1070 | $this->assertSame($expected, $TestController->request->data); |
||
1071 | $this->assertSame('view', $TestController->request->params['action']); |
||
1072 | $this->assertSame('view', $TestController->view); |
||
1073 | } |
||
1074 | |||
1075 | /**
|
||
1076 | * testValidateErrors method
|
||
1077 | *
|
||
1078 | * @return void
|
||
1079 | */
|
||
1080 | public function testValidateErrors() { |
||
1081 | ClassRegistry::flush(); |
||
1082 | $request = new CakeRequest('controller_posts/index'); |
||
1083 | |||
1084 | $TestController = new TestController($request); |
||
1085 | $TestController->constructClasses();
|
||
1086 | $this->assertFalse($TestController->validateErrors()); |
||
1087 | $this->assertEquals(0, $TestController->validate()); |
||
1088 | |||
1089 | $TestController->ControllerComment->invalidate('some_field', 'error_message'); |
||
1090 | $TestController->ControllerComment->invalidate('some_field2', 'error_message2'); |
||
1091 | |||
1092 | $comment = new ControllerComment($request); |
||
1093 | $comment->set('someVar', 'data'); |
||
1094 | $result = $TestController->validateErrors($comment); |
||
1095 | $expected = array('some_field' => array('error_message'), 'some_field2' => array('error_message2')); |
||
1096 | $this->assertSame($expected, $result); |
||
1097 | $this->assertEquals(2, $TestController->validate($comment)); |
||
1098 | } |
||
1099 | |||
1100 | /**
|
||
1101 | * test that validateErrors works with any old model.
|
||
1102 | *
|
||
1103 | * @return void
|
||
1104 | */
|
||
1105 | public function testValidateErrorsOnArbitraryModels() { |
||
1106 | Configure::write('Config.language', 'eng'); |
||
1107 | $TestController = new TestController(); |
||
1108 | |||
1109 | $Post = new ControllerPost(); |
||
1110 | $Post->validate = array('title' => 'notBlank'); |
||
1111 | $Post->set('title', ''); |
||
1112 | $result = $TestController->validateErrors($Post); |
||
1113 | |||
1114 | $expected = array('title' => array('This field cannot be left blank')); |
||
1115 | $this->assertEquals($expected, $result); |
||
1116 | } |
||
1117 | |||
1118 | /**
|
||
1119 | * testPostConditions method
|
||
1120 | *
|
||
1121 | * @return void
|
||
1122 | */
|
||
1123 | public function testPostConditions() { |
||
1124 | $request = new CakeRequest('controller_posts/index'); |
||
1125 | |||
1126 | $Controller = new Controller($request); |
||
1127 | |||
1128 | $data = array( |
||
1129 | 'Model1' => array('field1' => '23'), |
||
1130 | 'Model2' => array('field2' => 'string'), |
||
1131 | 'Model3' => array('field3' => '23'), |
||
1132 | ); |
||
1133 | $expected = array( |
||
1134 | 'Model1.field1' => '23', |
||
1135 | 'Model2.field2' => 'string', |
||
1136 | 'Model3.field3' => '23', |
||
1137 | ); |
||
1138 | $result = $Controller->postConditions($data); |
||
1139 | $this->assertSame($expected, $result); |
||
1140 | |||
1141 | $data = array(); |
||
1142 | $Controller->data = array( |
||
1143 | 'Model1' => array('field1' => '23'), |
||
1144 | 'Model2' => array('field2' => 'string'), |
||
1145 | 'Model3' => array('field3' => '23'), |
||
1146 | ); |
||
1147 | $expected = array( |
||
1148 | 'Model1.field1' => '23', |
||
1149 | 'Model2.field2' => 'string', |
||
1150 | 'Model3.field3' => '23', |
||
1151 | ); |
||
1152 | $result = $Controller->postConditions($data); |
||
1153 | $this->assertSame($expected, $result); |
||
1154 | |||
1155 | $data = array(); |
||
1156 | $Controller->data = array(); |
||
1157 | $result = $Controller->postConditions($data); |
||
1158 | $this->assertNull($result); |
||
1159 | |||
1160 | $data = array(); |
||
1161 | $Controller->data = array( |
||
1162 | 'Model1' => array('field1' => '23'), |
||
1163 | 'Model2' => array('field2' => 'string'), |
||
1164 | 'Model3' => array('field3' => '23'), |
||
1165 | ); |
||
1166 | $ops = array( |
||
1167 | 'Model1.field1' => '>', |
||
1168 | 'Model2.field2' => 'LIKE', |
||
1169 | 'Model3.field3' => '<=', |
||
1170 | ); |
||
1171 | $expected = array( |
||
1172 | 'Model1.field1 >' => '23', |
||
1173 | 'Model2.field2 LIKE' => "%string%", |
||
1174 | 'Model3.field3 <=' => '23', |
||
1175 | ); |
||
1176 | $result = $Controller->postConditions($data, $ops); |
||
1177 | $this->assertSame($expected, $result); |
||
1178 | } |
||
1179 | |||
1180 | /**
|
||
1181 | * testControllerHttpCodes method
|
||
1182 | *
|
||
1183 | * @return void
|
||
1184 | */
|
||
1185 | public function testControllerHttpCodes() { |
||
1186 | $response = $this->getMock('CakeResponse', array('httpCodes')); |
||
1187 | $Controller = new Controller(null, $response); |
||
1188 | $Controller->response->expects($this->at(0))->method('httpCodes')->with(null); |
||
1189 | $Controller->response->expects($this->at(1))->method('httpCodes')->with(100); |
||
1190 | $Controller->httpCodes();
|
||
1191 | $Controller->httpCodes(100); |
||
1192 | } |
||
1193 | |||
1194 | /**
|
||
1195 | * Tests that the startup process calls the correct functions
|
||
1196 | *
|
||
1197 | * @return void
|
||
1198 | */
|
||
1199 | public function testStartupProcess() { |
||
1200 | $Controller = $this->getMock('Controller', array('getEventManager')); |
||
1201 | |||
1202 | $eventManager = $this->getMock('CakeEventManager'); |
||
1203 | $eventManager->expects($this->at(0))->method('dispatch') |
||
1204 | ->with( |
||
1205 | $this->logicalAnd(
|
||
1206 | $this->isInstanceOf('CakeEvent'), |
||
1207 | $this->attributeEqualTo('_name', 'Controller.initialize'), |
||
1208 | $this->attributeEqualTo('_subject', $Controller) |
||
1209 | ) |
||
1210 | ); |
||
1211 | $eventManager->expects($this->at(1))->method('dispatch') |
||
1212 | ->with( |
||
1213 | $this->logicalAnd(
|
||
1214 | $this->isInstanceOf('CakeEvent'), |
||
1215 | $this->attributeEqualTo('_name', 'Controller.startup'), |
||
1216 | $this->attributeEqualTo('_subject', $Controller) |
||
1217 | ) |
||
1218 | ); |
||
1219 | $Controller->expects($this->exactly(2))->method('getEventManager') |
||
1220 | ->will($this->returnValue($eventManager)); |
||
1221 | $Controller->startupProcess();
|
||
1222 | } |
||
1223 | |||
1224 | /**
|
||
1225 | * Tests that the shutdown process calls the correct functions
|
||
1226 | *
|
||
1227 | * @return void
|
||
1228 | */
|
||
1229 | public function testStartupProcessIndirect() { |
||
1230 | $Controller = $this->getMock('Controller', array('beforeFilter')); |
||
1231 | |||
1232 | $Controller->components = array('MockShutdown'); |
||
1233 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
1234 | |||
1235 | $Controller->expects($this->once())->method('beforeFilter'); |
||
1236 | $Controller->Components->expects($this->exactly(2))->method('trigger')->with($this->isInstanceOf('CakeEvent')); |
||
1237 | |||
1238 | $Controller->startupProcess();
|
||
1239 | } |
||
1240 | |||
1241 | /**
|
||
1242 | * Tests that the shutdown process calls the correct functions
|
||
1243 | *
|
||
1244 | * @return void
|
||
1245 | */
|
||
1246 | public function testShutdownProcess() { |
||
1247 | $Controller = $this->getMock('Controller', array('getEventManager')); |
||
1248 | |||
1249 | $eventManager = $this->getMock('CakeEventManager'); |
||
1250 | $eventManager->expects($this->once())->method('dispatch') |
||
1251 | ->with( |
||
1252 | $this->logicalAnd(
|
||
1253 | $this->isInstanceOf('CakeEvent'), |
||
1254 | $this->attributeEqualTo('_name', 'Controller.shutdown'), |
||
1255 | $this->attributeEqualTo('_subject', $Controller) |
||
1256 | ) |
||
1257 | ); |
||
1258 | $Controller->expects($this->once())->method('getEventManager') |
||
1259 | ->will($this->returnValue($eventManager)); |
||
1260 | $Controller->shutdownProcess();
|
||
1261 | } |
||
1262 | |||
1263 | /**
|
||
1264 | * Tests that the shutdown process calls the correct functions
|
||
1265 | *
|
||
1266 | * @return void
|
||
1267 | */
|
||
1268 | public function testShutdownProcessIndirect() { |
||
1269 | $Controller = $this->getMock('Controller', array('afterFilter')); |
||
1270 | |||
1271 | $Controller->components = array('MockShutdown'); |
||
1272 | $Controller->Components = $this->getMock('ComponentCollection', array('trigger')); |
||
1273 | |||
1274 | $Controller->expects($this->once())->method('afterFilter'); |
||
1275 | $Controller->Components->expects($this->exactly(1))->method('trigger')->with($this->isInstanceOf('CakeEvent')); |
||
1276 | |||
1277 | $Controller->shutdownProcess();
|
||
1278 | } |
||
1279 | |||
1280 | /**
|
||
1281 | * test that BC works for attributes on the request object.
|
||
1282 | *
|
||
1283 | * @return void
|
||
1284 | */
|
||
1285 | public function testPropertyBackwardsCompatibility() { |
||
1286 | $request = new CakeRequest('posts/index', false); |
||
1287 | $request->addParams(array('controller' => 'posts', 'action' => 'index')); |
||
1288 | $request->data = array('Post' => array('id' => 1)); |
||
1289 | $request->here = '/posts/index'; |
||
1290 | $request->webroot = '/'; |
||
1291 | |||
1292 | $Controller = new TestController($request); |
||
1293 | $this->assertEquals($request->data, $Controller->data); |
||
1294 | $this->assertEquals($request->webroot, $Controller->webroot); |
||
1295 | $this->assertEquals($request->here, $Controller->here); |
||
1296 | $this->assertEquals($request->action, $Controller->action); |
||
1297 | |||
1298 | $this->assertFalse(empty($Controller->data)); |
||
1299 | $this->assertTrue(isset($Controller->data)); |
||
1300 | $this->assertTrue(empty($Controller->something)); |
||
1301 | $this->assertFalse(isset($Controller->something)); |
||
1302 | |||
1303 | $this->assertEquals($request, $Controller->params); |
||
1304 | $this->assertEquals($request->params['controller'], $Controller->params['controller']); |
||
1305 | } |
||
1306 | |||
1307 | /**
|
||
1308 | * test that the BC wrapper doesn't interfere with models and components.
|
||
1309 | *
|
||
1310 | * @return void
|
||
1311 | */
|
||
1312 | public function testPropertyCompatibilityAndModelsComponents() { |
||
1313 | $request = new CakeRequest('controller_posts/index'); |
||
1314 | |||
1315 | $Controller = new TestController($request); |
||
1316 | $Controller->constructClasses();
|
||
1317 | $this->assertInstanceOf('SecurityComponent', $Controller->Security); |
||
1318 | $this->assertInstanceOf('ControllerComment', $Controller->ControllerComment); |
||
1319 | } |
||
1320 | |||
1321 | /**
|
||
1322 | * test that using Controller::paginate() falls back to PaginatorComponent
|
||
1323 | *
|
||
1324 | * @return void
|
||
1325 | */
|
||
1326 | public function testPaginateBackwardsCompatibility() { |
||
1327 | $request = new CakeRequest('controller_posts/index'); |
||
1328 | $request->params['pass'] = $request->params['named'] = array(); |
||
1329 | $response = $this->getMock('CakeResponse', array('httpCodes')); |
||
1330 | |||
1331 | $Controller = new Controller($request, $response); |
||
1332 | $Controller->uses = array('ControllerPost', 'ControllerComment'); |
||
1333 | $Controller->passedArgs[] = '1'; |
||
1334 | $Controller->params['url'] = array(); |
||
1335 | $Controller->constructClasses();
|
||
1336 | $expected = array('page' => 1, 'limit' => 20, 'maxLimit' => 100, 'paramType' => 'named'); |
||
1337 | $this->assertEquals($expected, $Controller->paginate); |
||
1338 | |||
1339 | $results = Hash::extract($Controller->paginate('ControllerPost'), '{n}.ControllerPost.id'); |
||
1340 | $this->assertEquals(array(1, 2, 3), $results); |
||
1341 | |||
1342 | $Controller->passedArgs = array(); |
||
1343 | $Controller->paginate = array('limit' => '1'); |
||
1344 | $this->assertEquals(array('limit' => '1'), $Controller->paginate); |
||
1345 | $Controller->paginate('ControllerPost'); |
||
1346 | $this->assertSame($Controller->params['paging']['ControllerPost']['page'], 1); |
||
1347 | $this->assertSame($Controller->params['paging']['ControllerPost']['pageCount'], 3); |
||
1348 | $this->assertFalse($Controller->params['paging']['ControllerPost']['prevPage']); |
||
1349 | $this->assertTrue($Controller->params['paging']['ControllerPost']['nextPage']); |
||
1350 | } |
||
1351 | |||
1352 | /**
|
||
1353 | * testMissingAction method
|
||
1354 | *
|
||
1355 | * @expectedException MissingActionException
|
||
1356 | * @expectedExceptionMessage Action TestController::missing() could not be found.
|
||
1357 | * @return void
|
||
1358 | */
|
||
1359 | public function testInvokeActionMissingAction() { |
||
1360 | $url = new CakeRequest('test/missing'); |
||
1361 | $url->addParams(array('controller' => 'test_controller', 'action' => 'missing')); |
||
1362 | $response = $this->getMock('CakeResponse'); |
||
1363 | |||
1364 | $Controller = new TestController($url, $response); |
||
1365 | $Controller->invokeAction($url); |
||
1366 | } |
||
1367 | |||
1368 | /**
|
||
1369 | * test invoking private methods.
|
||
1370 | *
|
||
1371 | * @expectedException PrivateActionException
|
||
1372 | * @expectedExceptionMessage Private Action TestController::private_m() is not directly accessible.
|
||
1373 | * @return void
|
||
1374 | */
|
||
1375 | public function testInvokeActionPrivate() { |
||
1376 | $url = new CakeRequest('test/private_m/'); |
||
1377 | $url->addParams(array('controller' => 'test_controller', 'action' => 'private_m')); |
||
1378 | $response = $this->getMock('CakeResponse'); |
||
1379 | |||
1380 | $Controller = new TestController($url, $response); |
||
1381 | $Controller->invokeAction($url); |
||
1382 | } |
||
1383 | |||
1384 | /**
|
||
1385 | * test invoking protected methods.
|
||
1386 | *
|
||
1387 | * @expectedException PrivateActionException
|
||
1388 | * @expectedExceptionMessage Private Action TestController::protected_m() is not directly accessible.
|
||
1389 | * @return void
|
||
1390 | */
|
||
1391 | public function testInvokeActionProtected() { |
||
1392 | $url = new CakeRequest('test/protected_m/'); |
||
1393 | $url->addParams(array('controller' => 'test_controller', 'action' => 'protected_m')); |
||
1394 | $response = $this->getMock('CakeResponse'); |
||
1395 | |||
1396 | $Controller = new TestController($url, $response); |
||
1397 | $Controller->invokeAction($url); |
||
1398 | } |
||
1399 | |||
1400 | /**
|
||
1401 | * test invoking hidden methods.
|
||
1402 | *
|
||
1403 | * @expectedException PrivateActionException
|
||
1404 | * @expectedExceptionMessage Private Action TestController::_hidden() is not directly accessible.
|
||
1405 | * @return void
|
||
1406 | */
|
||
1407 | public function testInvokeActionHidden() { |
||
1408 | $url = new CakeRequest('test/_hidden/'); |
||
1409 | $url->addParams(array('controller' => 'test_controller', 'action' => '_hidden')); |
||
1410 | $response = $this->getMock('CakeResponse'); |
||
1411 | |||
1412 | $Controller = new TestController($url, $response); |
||
1413 | $Controller->invokeAction($url); |
||
1414 | } |
||
1415 | |||
1416 | /**
|
||
1417 | * test invoking controller methods.
|
||
1418 | *
|
||
1419 | * @expectedException PrivateActionException
|
||
1420 | * @expectedExceptionMessage Private Action TestController::redirect() is not directly accessible.
|
||
1421 | * @return void
|
||
1422 | */
|
||
1423 | public function testInvokeActionBaseMethods() { |
||
1424 | $url = new CakeRequest('test/redirect/'); |
||
1425 | $url->addParams(array('controller' => 'test_controller', 'action' => 'redirect')); |
||
1426 | $response = $this->getMock('CakeResponse'); |
||
1427 | |||
1428 | $Controller = new TestController($url, $response); |
||
1429 | $Controller->invokeAction($url); |
||
1430 | } |
||
1431 | |||
1432 | /**
|
||
1433 | * test invoking controller methods.
|
||
1434 | *
|
||
1435 | * @expectedException PrivateActionException
|
||
1436 | * @expectedExceptionMessage Private Action TestController::admin_add() is not directly accessible.
|
||
1437 | * @return void
|
||
1438 | */
|
||
1439 | public function testInvokeActionPrefixProtection() { |
||
1440 | Router::reload();
|
||
1441 | Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin')); |
||
1442 | |||
1443 | $url = new CakeRequest('test/admin_add/'); |
||
1444 | $url->addParams(array('controller' => 'test_controller', 'action' => 'admin_add')); |
||
1445 | $response = $this->getMock('CakeResponse'); |
||
1446 | |||
1447 | $Controller = new TestController($url, $response); |
||
1448 | $Controller->invokeAction($url); |
||
1449 | } |
||
1450 | |||
1451 | /**
|
||
1452 | * test invoking controller methods.
|
||
1453 | *
|
||
1454 | * @expectedException PrivateActionException
|
||
1455 | * @expectedExceptionMessage Private Action TestController::Admin_add() is not directly accessible.
|
||
1456 | * @return void
|
||
1457 | */
|
||
1458 | public function testInvokeActionPrefixProtectionCasing() { |
||
1459 | Router::reload();
|
||
1460 | Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin')); |
||
1461 | |||
1462 | $url = new CakeRequest('test/Admin_add/'); |
||
1463 | $url->addParams(array('controller' => 'test_controller', 'action' => 'Admin_add')); |
||
1464 | $response = $this->getMock('CakeResponse'); |
||
1465 | |||
1466 | $Controller = new TestController($url, $response); |
||
1467 | $Controller->invokeAction($url); |
||
1468 | } |
||
1469 | |||
1470 | /**
|
||
1471 | * test invoking controller methods.
|
||
1472 | *
|
||
1473 | * @return void
|
||
1474 | */
|
||
1475 | public function testInvokeActionReturnValue() { |
||
1476 | $url = new CakeRequest('test/returner/'); |
||
1477 | $url->addParams(array( |
||
1478 | 'controller' => 'test_controller', |
||
1479 | 'action' => 'returner', |
||
1480 | 'pass' => array() |
||
1481 | )); |
||
1482 | $response = $this->getMock('CakeResponse'); |
||
1483 | |||
1484 | $Controller = new TestController($url, $response); |
||
1485 | $result = $Controller->invokeAction($url); |
||
1486 | $this->assertEquals('I am from the controller.', $result); |
||
1487 | } |
||
1488 | |||
1489 | } |