summaryrefslogtreecommitdiff
path: root/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php')
-rw-r--r--poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php1441
1 files changed, 1441 insertions, 0 deletions
diff --git a/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php b/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php
new file mode 100644
index 0000000..36116ad
--- /dev/null
+++ b/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Controller/ControllerTest.php
@@ -0,0 +1,1441 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link http://cakephp.org CakePHP Project
+ * @package Cake.Test.Case.Controller
+ * @since CakePHP(tm) v 1.2.0.5436
+ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
+ */
+App::uses('Controller', 'Controller');
+App::uses('Router', 'Routing');
+App::uses('CakeRequest', 'Network');
+App::uses('CakeResponse', 'Network');
+App::uses('SecurityComponent', 'Controller/Component');
+App::uses('CookieComponent', 'Controller/Component');
+
+/**
+ * AppController class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerTestAppController extends Controller {
+
+/**
+ * helpers property
+ *
+ * @var array
+ */
+ public $helpers = array('Html');
+
+/**
+ * uses property
+ *
+ * @var array
+ */
+ public $uses = array('ControllerPost');
+
+/**
+ * components property
+ *
+ * @var array
+ */
+ public $components = array('Cookie');
+}
+
+
+/**
+ * ControllerPost class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerPost extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'ControllerPost'
+ */
+ public $name = 'ControllerPost';
+
+/**
+ * useTable property
+ *
+ * @var string 'posts'
+ */
+ public $useTable = 'posts';
+
+/**
+ * invalidFields property
+ *
+ * @var array
+ */
+ public $invalidFields = array('name' => 'error_msg');
+
+/**
+ * lastQuery property
+ *
+ * @var mixed null
+ */
+ public $lastQuery = null;
+
+/**
+ * beforeFind method
+ *
+ * @param mixed $query
+ * @return void
+ */
+ public function beforeFind($query) {
+ $this->lastQuery = $query;
+ }
+
+/**
+ * find method
+ *
+ * @param string $type
+ * @param array $options
+ * @return void
+ */
+ public function find($type = 'first', $options = array()) {
+ if ($type == 'popular') {
+ $conditions = array($this->name . '.' . $this->primaryKey . ' > ' => '1');
+ $options = Hash::merge($options, compact('conditions'));
+ return parent::find('all', $options);
+ }
+ return parent::find($type, $options);
+ }
+
+}
+
+/**
+ * ControllerPostsController class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerCommentsController extends ControllerTestAppController {
+
+/**
+ * name property
+ *
+ * @var string 'ControllerPost'
+ */
+ public $name = 'ControllerComments';
+
+ protected $_mergeParent = 'ControllerTestAppController';
+}
+
+/**
+ * ControllerComment class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerComment extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'ControllerComment'
+ */
+ public $name = 'Comment';
+
+/**
+ * useTable property
+ *
+ * @var string 'comments'
+ */
+ public $useTable = 'comments';
+
+/**
+ * data property
+ *
+ * @var array
+ */
+ public $data = array('name' => 'Some Name');
+
+/**
+ * alias property
+ *
+ * @var string 'ControllerComment'
+ */
+ public $alias = 'ControllerComment';
+}
+
+/**
+ * ControllerAlias class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerAlias extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'ControllerAlias'
+ */
+ public $name = 'ControllerAlias';
+
+/**
+ * alias property
+ *
+ * @var string 'ControllerSomeAlias'
+ */
+ public $alias = 'ControllerSomeAlias';
+
+/**
+ * useTable property
+ *
+ * @var string 'posts'
+ */
+ public $useTable = 'posts';
+}
+
+/**
+ * NameTest class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class NameTest extends CakeTestModel {
+
+/**
+ * name property
+ * @var string 'Name'
+ */
+ public $name = 'Name';
+
+/**
+ * useTable property
+ * @var string 'names'
+ */
+ public $useTable = 'comments';
+
+/**
+ * alias property
+ *
+ * @var string 'ControllerComment'
+ */
+ public $alias = 'Name';
+}
+
+/**
+ * TestController class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class TestController extends ControllerTestAppController {
+
+/**
+ * name property
+ * @var string 'Name'
+ */
+ public $name = 'Test';
+
+/**
+ * helpers property
+ *
+ * @var array
+ */
+ public $helpers = array('Session');
+
+/**
+ * components property
+ *
+ * @var array
+ */
+ public $components = array('Security');
+
+/**
+ * uses property
+ *
+ * @var array
+ */
+ public $uses = array('ControllerComment', 'ControllerAlias');
+
+ protected $_mergeParent = 'ControllerTestAppController';
+
+/**
+ * index method
+ *
+ * @param mixed $testId
+ * @param mixed $test2Id
+ * @return void
+ */
+ public function index($testId, $testTwoId) {
+ $this->data = array(
+ 'testId' => $testId,
+ 'test2Id' => $testTwoId
+ );
+ }
+
+/**
+ * view method
+ *
+ * @param mixed $testId
+ * @param mixed $test2Id
+ * @return void
+ */
+ public function view($testId, $testTwoId) {
+ $this->data = array(
+ 'testId' => $testId,
+ 'test2Id' => $testTwoId
+ );
+ }
+
+ public function returner() {
+ return 'I am from the controller.';
+ }
+
+ //@codingStandardsIgnoreStart
+ protected function protected_m() {
+ }
+
+ private function private_m() {
+ }
+
+ public function _hidden() {
+ }
+ //@codingStandardsIgnoreEnd
+
+ public function admin_add() {
+ }
+
+}
+
+/**
+ * TestComponent class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class TestComponent extends Object {
+
+/**
+ * beforeRedirect method
+ *
+ * @return void
+ */
+ public function beforeRedirect() {
+ }
+
+/**
+ * initialize method
+ *
+ * @return void
+ */
+ public function initialize(Controller $controller) {
+ }
+
+/**
+ * startup method
+ *
+ * @return void
+ */
+ public function startup(Controller $controller) {
+ }
+
+/**
+ * shutdown method
+ *
+ * @return void
+ */
+ public function shutdown(Controller $controller) {
+ }
+
+/**
+ * beforeRender callback
+ *
+ * @return void
+ */
+ public function beforeRender(Controller $controller) {
+ if ($this->viewclass) {
+ $controller->viewClass = $this->viewclass;
+ }
+ }
+
+}
+
+class Test2Component extends TestComponent {
+
+ public function beforeRender(Controller $controller) {
+ return false;
+ }
+
+}
+
+/**
+ * AnotherTestController class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class AnotherTestController extends ControllerTestAppController {
+
+/**
+ * name property
+ * @var string 'Name'
+ */
+ public $name = 'AnotherTest';
+
+/**
+ * uses property
+ *
+ * @var array
+ */
+ public $uses = false;
+
+/**
+ * merge parent
+ *
+ * @var string
+ */
+ protected $_mergeParent = 'ControllerTestAppController';
+}
+
+/**
+ * ControllerTest class
+ *
+ * @package Cake.Test.Case.Controller
+ */
+class ControllerTest extends CakeTestCase {
+
+/**
+ * fixtures property
+ *
+ * @var array
+ */
+ public $fixtures = array(
+ 'core.post',
+ 'core.comment'
+ );
+
+/**
+ * reset environment.
+ *
+ * @return void
+ */
+ public function setUp() {
+ parent::setUp();
+ App::objects('plugin', null, false);
+ App::build();
+ Router::reload();
+ }
+
+/**
+ * tearDown
+ *
+ * @return void
+ */
+ public function tearDown() {
+ parent::tearDown();
+ CakePlugin::unload();
+ }
+
+/**
+ * testLoadModel method
+ *
+ * @return void
+ */
+ public function testLoadModel() {
+ $request = new CakeRequest('controller_posts/index');
+ $response = $this->getMock('CakeResponse');
+ $Controller = new Controller($request, $response);
+
+ $this->assertFalse(isset($Controller->ControllerPost));
+
+ $result = $Controller->loadModel('ControllerPost');
+ $this->assertTrue($result);
+ $this->assertTrue(is_a($Controller->ControllerPost, 'ControllerPost'));
+ $this->assertTrue(in_array('ControllerPost', $Controller->uses));
+
+ ClassRegistry::flush();
+ unset($Controller);
+ }
+
+/**
+ * testLoadModel method from a plugin controller
+ *
+ * @return void
+ */
+ public function testLoadModelInPlugins() {
+ App::build(array(
+ 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS),
+ 'Controller' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Controller' . DS),
+ 'Model' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS)
+ ));
+ CakePlugin::load('TestPlugin');
+ App::uses('TestPluginAppController', 'TestPlugin.Controller');
+ App::uses('TestPluginController', 'TestPlugin.Controller');
+
+ $Controller = new TestPluginController();
+ $Controller->plugin = 'TestPlugin';
+ $Controller->uses = false;
+
+ $this->assertFalse(isset($Controller->Comment));
+
+ $result = $Controller->loadModel('Comment');
+ $this->assertTrue($result);
+ $this->assertInstanceOf('Comment', $Controller->Comment);
+ $this->assertTrue(in_array('Comment', $Controller->uses));
+
+ ClassRegistry::flush();
+ unset($Controller);
+ }
+
+/**
+ * testConstructClasses method
+ *
+ * @return void
+ */
+ public function testConstructClasses() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $Controller = new Controller($request);
+ $Controller->uses = array('ControllerPost', 'ControllerComment');
+ $Controller->constructClasses();
+ $this->assertTrue(is_a($Controller->ControllerPost, 'ControllerPost'));
+ $this->assertTrue(is_a($Controller->ControllerComment, 'ControllerComment'));
+
+ $this->assertEquals('Comment', $Controller->ControllerComment->name);
+
+ unset($Controller);
+
+ App::build(array('Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)));
+ CakePlugin::load('TestPlugin');
+
+ $Controller = new Controller($request);
+ $Controller->uses = array('TestPlugin.TestPluginPost');
+ $Controller->constructClasses();
+
+ $this->assertTrue(isset($Controller->TestPluginPost));
+ $this->assertTrue(is_a($Controller->TestPluginPost, 'TestPluginPost'));
+ }
+
+/**
+ * testAliasName method
+ *
+ * @return void
+ */
+ public function testAliasName() {
+ $request = new CakeRequest('controller_posts/index');
+ $Controller = new Controller($request);
+ $Controller->uses = array('NameTest');
+ $Controller->constructClasses();
+
+ $this->assertEquals('Name', $Controller->NameTest->name);
+ $this->assertEquals('Name', $Controller->NameTest->alias);
+
+ unset($Controller);
+ }
+
+/**
+ * testFlash method
+ *
+ * @return void
+ */
+ public function testFlash() {
+ $request = new CakeRequest('controller_posts/index');
+ $request->webroot = '/';
+ $request->base = '/';
+
+ $Controller = new Controller($request, $this->getMock('CakeResponse', array('_sendHeader')));
+ $Controller->flash('this should work', '/flash');
+ $result = $Controller->response->body();
+
+ $expected = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>this should work</title>
+ <style><!--
+ P { text-align:center; font:bold 1.1em sans-serif }
+ A { color:#444; text-decoration:none }
+ A:HOVER { text-decoration: underline; color:#44E }
+ --></style>
+ </head>
+ <body>
+ <p><a href="/flash">this should work</a></p>
+ </body>
+ </html>';
+ $result = str_replace(array("\t", "\r\n", "\n"), "", $result);
+ $expected = str_replace(array("\t", "\r\n", "\n"), "", $expected);
+ $this->assertEquals($expected, $result);
+
+ App::build(array(
+ 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
+ ));
+ $Controller = new Controller($request);
+ $Controller->response = $this->getMock('CakeResponse', array('_sendHeader'));
+ $Controller->flash('this should work', '/flash', 1, 'ajax2');
+ $result = $Controller->response->body();
+ $this->assertRegExp('/Ajax!/', $result);
+ App::build();
+ }
+
+/**
+ * testControllerSet method
+ *
+ * @return void
+ */
+ public function testControllerSet() {
+ $request = new CakeRequest('controller_posts/index');
+ $Controller = new Controller($request);
+
+ $Controller->set('variable_with_underscores', null);
+ $this->assertTrue(array_key_exists('variable_with_underscores', $Controller->viewVars));
+
+ $Controller->viewVars = array();
+ $viewVars = array('ModelName' => array('id' => 1, 'name' => 'value'));
+ $Controller->set($viewVars);
+ $this->assertTrue(array_key_exists('ModelName', $Controller->viewVars));
+
+ $Controller->viewVars = array();
+ $Controller->set('variable_with_underscores', 'value');
+ $this->assertTrue(array_key_exists('variable_with_underscores', $Controller->viewVars));
+
+ $Controller->viewVars = array();
+ $viewVars = array('ModelName' => 'name');
+ $Controller->set($viewVars);
+ $this->assertTrue(array_key_exists('ModelName', $Controller->viewVars));
+
+ $Controller->set('title', 'someTitle');
+ $this->assertSame($Controller->viewVars['title'], 'someTitle');
+ $this->assertTrue(empty($Controller->pageTitle));
+
+ $Controller->viewVars = array();
+ $expected = array('ModelName' => 'name', 'ModelName2' => 'name2');
+ $Controller->set(array('ModelName', 'ModelName2'), array('name', 'name2'));
+ $this->assertSame($expected, $Controller->viewVars);
+
+ $Controller->viewVars = array();
+ $Controller->set(array(3 => 'three', 4 => 'four'));
+ $Controller->set(array(1 => 'one', 2 => 'two'));
+ $expected = array(3 => 'three', 4 => 'four', 1 => 'one', 2 => 'two');
+ $this->assertEquals($expected, $Controller->viewVars);
+ }
+
+/**
+ * testRender method
+ *
+ * @return void
+ */
+ public function testRender() {
+ App::build(array(
+ 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
+ ), App::RESET);
+ ClassRegistry::flush();
+ $request = new CakeRequest('controller_posts/index');
+ $request->params['action'] = 'index';
+
+ $Controller = new Controller($request, new CakeResponse());
+ $Controller->viewPath = 'Posts';
+
+ $result = $Controller->render('index');
+ $this->assertRegExp('/posts index/', (string)$result);
+
+ $Controller->view = 'index';
+ $result = $Controller->render();
+ $this->assertRegExp('/posts index/', (string)$result);
+
+ $result = $Controller->render('/Elements/test_element');
+ $this->assertRegExp('/this is the test element/', (string)$result);
+ $Controller->view = null;
+
+ $Controller = new TestController($request, new CakeResponse());
+ $Controller->uses = array('ControllerAlias', 'TestPlugin.ControllerComment', 'ControllerPost');
+ $Controller->helpers = array('Html');
+ $Controller->constructClasses();
+ $Controller->ControllerComment->validationErrors = array('title' => 'tooShort');
+ $expected = $Controller->ControllerComment->validationErrors;
+
+ $Controller->viewPath = 'Posts';
+ $result = $Controller->render('index');
+ $View = $Controller->View;
+ $this->assertTrue(isset($View->validationErrors['ControllerComment']));
+ $this->assertEquals($expected, $View->validationErrors['ControllerComment']);
+
+ $expectedModels = array(
+ 'ControllerAlias' => array('plugin' => null, 'className' => 'ControllerAlias'),
+ 'ControllerComment' => array('plugin' => 'TestPlugin', 'className' => 'ControllerComment'),
+ 'ControllerPost' => array('plugin' => null, 'className' => 'ControllerPost')
+ );
+ $this->assertEquals($expectedModels, $Controller->request->params['models']);
+
+ ClassRegistry::flush();
+ App::build();
+ }
+
+/**
+ * test that a component beforeRender can change the controller view class.
+ *
+ * @return void
+ */
+ public function testComponentBeforeRenderChangingViewClass() {
+ App::build(array(
+ 'View' => array(
+ CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS
+ )
+ ), true);
+ $Controller = new Controller($this->getMock('CakeRequest'), new CakeResponse());
+ $Controller->uses = array();
+ $Controller->components = array('Test');
+ $Controller->constructClasses();
+ $Controller->Test->viewclass = 'Theme';
+ $Controller->viewPath = 'Posts';
+ $Controller->theme = 'TestTheme';
+ $result = $Controller->render('index');
+ $this->assertRegExp('/default test_theme layout/', (string)$result);
+ App::build();
+ }
+
+/**
+ * test that a component beforeRender can change the controller view class.
+ *
+ * @return void
+ */
+ public function testComponentCancelRender() {
+ $Controller = new Controller($this->getMock('CakeRequest'), new CakeResponse());
+ $Controller->uses = array();
+ $Controller->components = array('Test2');
+ $Controller->constructClasses();
+ $result = $Controller->render('index');
+ $this->assertInstanceOf('CakeResponse', $result);
+ }
+
+/**
+ * testToBeInheritedGuardmethods method
+ *
+ * @return void
+ */
+ public function testToBeInheritedGuardmethods() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $Controller = new Controller($request, $this->getMock('CakeResponse'));
+ $this->assertTrue($Controller->beforeScaffold(''));
+ $this->assertTrue($Controller->afterScaffoldSave(''));
+ $this->assertTrue($Controller->afterScaffoldSaveError(''));
+ $this->assertFalse($Controller->scaffoldError(''));
+ }
+
+/**
+ * Generates status codes for redirect test.
+ *
+ * @return void
+ */
+ public static function statusCodeProvider() {
+ return array(
+ array(300, "Multiple Choices"),
+ array(301, "Moved Permanently"),
+ array(302, "Found"),
+ array(303, "See Other"),
+ array(304, "Not Modified"),
+ array(305, "Use Proxy"),
+ array(307, "Temporary Redirect"),
+ array(403, "Forbidden"),
+ );
+ }
+
+/**
+ * testRedirect method
+ *
+ * @dataProvider statusCodeProvider
+ * @return void
+ */
+ public function testRedirectByCode($code, $msg) {
+ $Controller = new Controller(null);
+ $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode'));
+
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->response->expects($this->once())->method('statusCode')
+ ->with($code);
+ $Controller->response->expects($this->once())->method('header')
+ ->with('Location', 'http://cakephp.org');
+
+ $Controller->redirect('http://cakephp.org', (int)$code, false);
+ $this->assertFalse($Controller->autoRender);
+ }
+
+/**
+ * test redirecting by message
+ *
+ * @dataProvider statusCodeProvider
+ * @return void
+ */
+ public function testRedirectByMessage($code, $msg) {
+ $Controller = new Controller(null);
+ $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode'));
+
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->response->expects($this->once())->method('statusCode')
+ ->with($code);
+
+ $Controller->response->expects($this->once())->method('header')
+ ->with('Location', 'http://cakephp.org');
+
+ $Controller->redirect('http://cakephp.org', $msg, false);
+ $this->assertFalse($Controller->autoRender);
+ }
+
+/**
+ * test that redirect triggers methods on the components.
+ *
+ * @return void
+ */
+ public function testRedirectTriggeringComponentsReturnNull() {
+ $Controller = new Controller(null);
+ $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode'));
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->Components->expects($this->once())->method('trigger')
+ ->will($this->returnValue(null));
+
+ $Controller->response->expects($this->once())->method('statusCode')
+ ->with(301);
+
+ $Controller->response->expects($this->once())->method('header')
+ ->with('Location', 'http://cakephp.org');
+
+ $Controller->redirect('http://cakephp.org', 301, false);
+ }
+
+/**
+ * test that beforeRedirect callback returning null doesn't affect things.
+ *
+ * @return void
+ */
+ public function testRedirectBeforeRedirectModifyingParams() {
+ $Controller = new Controller(null);
+ $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode'));
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->Components->expects($this->once())->method('trigger')
+ ->will($this->returnValue(array('http://book.cakephp.org')));
+
+ $Controller->response->expects($this->once())->method('statusCode')
+ ->with(301);
+
+ $Controller->response->expects($this->once())->method('header')
+ ->with('Location', 'http://book.cakephp.org');
+
+ $Controller->redirect('http://cakephp.org', 301, false);
+ }
+
+/**
+ * test that beforeRedirect callback returning null doesn't affect things.
+ *
+ * @return void
+ */
+ public function testRedirectBeforeRedirectModifyingParamsArrayReturn() {
+ $Controller = $this->getMock('Controller', array('header', '_stop'));
+ $Controller->response = $this->getMock('CakeResponse');
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $return = array(
+ array(
+ 'url' => 'http://example.com/test/1',
+ 'exit' => false,
+ 'status' => 302
+ ),
+ array(
+ 'url' => 'http://example.com/test/2',
+ ),
+ );
+ $Controller->Components->expects($this->once())->method('trigger')
+ ->will($this->returnValue($return));
+
+ $Controller->response->expects($this->once())->method('header')
+ ->with('Location', 'http://example.com/test/2');
+
+ $Controller->response->expects($this->at(1))->method('statusCode')
+ ->with(302);
+
+ $Controller->expects($this->never())->method('_stop');
+ $Controller->redirect('http://cakephp.org', 301);
+ }
+
+/**
+ * test that beforeRedirect callback returning false in controller
+ *
+ * @return void
+ */
+ public function testRedirectBeforeRedirectInController() {
+ $Controller = $this->getMock('Controller', array('_stop', 'beforeRedirect'));
+ $Controller->response = $this->getMock('CakeResponse', array('header'));
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->expects($this->once())->method('beforeRedirect')
+ ->with('http://cakephp.org')
+ ->will($this->returnValue(false));
+ $Controller->response->expects($this->never())->method('header');
+ $Controller->expects($this->never())->method('_stop');
+ $Controller->redirect('http://cakephp.org');
+ }
+
+/**
+ * Test that beforeRedirect works with returning an array from the controller method.
+ *
+ * @return void
+ */
+ public function testRedirectBeforeRedirectInControllerWithArray() {
+ $Controller = $this->getMock('Controller', array('_stop', 'beforeRedirect'));
+ $Controller->response = $this->getMock('CakeResponse', array('header'));
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->expects($this->once())
+ ->method('beforeRedirect')
+ ->with('http://cakephp.org', null, true)
+ ->will($this->returnValue(array(
+ 'url' => 'http://example.org',
+ 'status' => 302,
+ 'exit' => true
+ )));
+
+ $Controller->response->expects($this->at(0))
+ ->method('header')
+ ->with('Location', 'http://example.org');
+
+ $Controller->expects($this->once())->method('_stop');
+ $Controller->redirect('http://cakephp.org');
+ }
+
+/**
+ * testMergeVars method
+ *
+ * @return void
+ */
+ public function testMergeVars() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $TestController = new TestController($request);
+ $TestController->constructClasses();
+
+ $testVars = get_class_vars('TestController');
+ $appVars = get_class_vars('ControllerTestAppController');
+
+ $components = is_array($appVars['components'])
+ ? array_merge($appVars['components'], $testVars['components'])
+ : $testVars['components'];
+ if (!in_array('Session', $components)) {
+ $components[] = 'Session';
+ }
+ $helpers = is_array($appVars['helpers'])
+ ? array_merge($appVars['helpers'], $testVars['helpers'])
+ : $testVars['helpers'];
+ $uses = is_array($appVars['uses'])
+ ? array_merge($appVars['uses'], $testVars['uses'])
+ : $testVars['uses'];
+
+ $this->assertEquals(0, count(array_diff_key($TestController->helpers, array_flip($helpers))));
+ $this->assertEquals(0, count(array_diff($TestController->uses, $uses)));
+ $this->assertEquals(count(array_diff_assoc(Hash::normalize($TestController->components), Hash::normalize($components))), 0);
+
+ $expected = array('ControllerComment', 'ControllerAlias', 'ControllerPost');
+ $this->assertEquals($expected, $TestController->uses, '$uses was merged incorrectly, ControllerTestAppController models should be last.');
+
+ $TestController = new AnotherTestController($request);
+ $TestController->constructClasses();
+
+ $appVars = get_class_vars('ControllerTestAppController');
+ $testVars = get_class_vars('AnotherTestController');
+
+ $this->assertTrue(in_array('ControllerPost', $appVars['uses']));
+ $this->assertFalse($testVars['uses']);
+
+ $this->assertFalse(property_exists($TestController, 'ControllerPost'));
+
+ $TestController = new ControllerCommentsController($request);
+ $TestController->constructClasses();
+
+ $appVars = get_class_vars('ControllerTestAppController');
+ $testVars = get_class_vars('ControllerCommentsController');
+
+ $this->assertTrue(in_array('ControllerPost', $appVars['uses']));
+ $this->assertEquals(array('ControllerPost'), $testVars['uses']);
+
+ $this->assertTrue(isset($TestController->ControllerPost));
+ $this->assertTrue(isset($TestController->ControllerComment));
+ }
+
+/**
+ * test that options from child classes replace those in the parent classes.
+ *
+ * @return void
+ */
+ public function testChildComponentOptionsSupercedeParents() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $TestController = new TestController($request);
+
+ $expected = array('foo');
+ $TestController->components = array('Cookie' => $expected);
+ $TestController->constructClasses();
+ $this->assertEquals($expected, $TestController->components['Cookie']);
+ }
+
+/**
+ * Ensure that _mergeControllerVars is not being greedy and merging with
+ * ControllerTestAppController when you make an instance of Controller
+ *
+ * @return void
+ */
+ public function testMergeVarsNotGreedy() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $Controller = new Controller($request);
+ $Controller->components = array();
+ $Controller->uses = array();
+ $Controller->constructClasses();
+
+ $this->assertFalse(isset($Controller->Session));
+ }
+
+/**
+ * testReferer method
+ *
+ * @return void
+ */
+ public function testReferer() {
+ $request = $this->getMock('CakeRequest');
+
+ $request->expects($this->any())->method('referer')
+ ->with(true)
+ ->will($this->returnValue('/posts/index'));
+
+ $Controller = new Controller($request);
+ $result = $Controller->referer(null, true);
+ $this->assertEquals('/posts/index', $result);
+
+ $Controller = new Controller($request);
+ $request->setReturnValue('referer', '/', array(true));
+ $result = $Controller->referer(array('controller' => 'posts', 'action' => 'index'), true);
+ $this->assertEquals('/posts/index', $result);
+
+ $request = $this->getMock('CakeRequest');
+
+ $request->expects($this->any())->method('referer')
+ ->with(false)
+ ->will($this->returnValue('http://localhost/posts/index'));
+
+ $Controller = new Controller($request);
+ $result = $Controller->referer();
+ $this->assertEquals('http://localhost/posts/index', $result);
+
+ $Controller = new Controller(null);
+ $result = $Controller->referer();
+ $this->assertEquals('/', $result);
+ }
+
+/**
+ * testSetAction method
+ *
+ * @return void
+ */
+ public function testSetAction() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $TestController = new TestController($request);
+ $TestController->setAction('view', 1, 2);
+ $expected = array('testId' => 1, 'test2Id' => 2);
+ $this->assertSame($expected, $TestController->request->data);
+ $this->assertSame('view', $TestController->request->params['action']);
+ $this->assertSame('view', $TestController->view);
+ }
+
+/**
+ * testValidateErrors method
+ *
+ * @return void
+ */
+ public function testValidateErrors() {
+ ClassRegistry::flush();
+ $request = new CakeRequest('controller_posts/index');
+
+ $TestController = new TestController($request);
+ $TestController->constructClasses();
+ $this->assertFalse($TestController->validateErrors());
+ $this->assertEquals(0, $TestController->validate());
+
+ $TestController->ControllerComment->invalidate('some_field', 'error_message');
+ $TestController->ControllerComment->invalidate('some_field2', 'error_message2');
+
+ $comment = new ControllerComment($request);
+ $comment->set('someVar', 'data');
+ $result = $TestController->validateErrors($comment);
+ $expected = array('some_field' => array('error_message'), 'some_field2' => array('error_message2'));
+ $this->assertSame($expected, $result);
+ $this->assertEquals(2, $TestController->validate($comment));
+ }
+
+/**
+ * test that validateErrors works with any old model.
+ *
+ * @return void
+ */
+ public function testValidateErrorsOnArbitraryModels() {
+ $TestController = new TestController();
+
+ $Post = new ControllerPost();
+ $Post->validate = array('title' => 'notEmpty');
+ $Post->set('title', '');
+ $result = $TestController->validateErrors($Post);
+
+ $expected = array('title' => array('This field cannot be left blank'));
+ $this->assertEquals($expected, $result);
+ }
+
+/**
+ * testPostConditions method
+ *
+ * @return void
+ */
+ public function testPostConditions() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $Controller = new Controller($request);
+
+ $data = array(
+ 'Model1' => array('field1' => '23'),
+ 'Model2' => array('field2' => 'string'),
+ 'Model3' => array('field3' => '23'),
+ );
+ $expected = array(
+ 'Model1.field1' => '23',
+ 'Model2.field2' => 'string',
+ 'Model3.field3' => '23',
+ );
+ $result = $Controller->postConditions($data);
+ $this->assertSame($expected, $result);
+
+ $data = array();
+ $Controller->data = array(
+ 'Model1' => array('field1' => '23'),
+ 'Model2' => array('field2' => 'string'),
+ 'Model3' => array('field3' => '23'),
+ );
+ $expected = array(
+ 'Model1.field1' => '23',
+ 'Model2.field2' => 'string',
+ 'Model3.field3' => '23',
+ );
+ $result = $Controller->postConditions($data);
+ $this->assertSame($expected, $result);
+
+ $data = array();
+ $Controller->data = array();
+ $result = $Controller->postConditions($data);
+ $this->assertNull($result);
+
+ $data = array();
+ $Controller->data = array(
+ 'Model1' => array('field1' => '23'),
+ 'Model2' => array('field2' => 'string'),
+ 'Model3' => array('field3' => '23'),
+ );
+ $ops = array(
+ 'Model1.field1' => '>',
+ 'Model2.field2' => 'LIKE',
+ 'Model3.field3' => '<=',
+ );
+ $expected = array(
+ 'Model1.field1 >' => '23',
+ 'Model2.field2 LIKE' => "%string%",
+ 'Model3.field3 <=' => '23',
+ );
+ $result = $Controller->postConditions($data, $ops);
+ $this->assertSame($expected, $result);
+ }
+
+/**
+ * testControllerHttpCodes method
+ *
+ * @return void
+ */
+ public function testControllerHttpCodes() {
+ $response = $this->getMock('CakeResponse', array('httpCodes'));
+ $Controller = new Controller(null, $response);
+ $Controller->response->expects($this->at(0))->method('httpCodes')->with(null);
+ $Controller->response->expects($this->at(1))->method('httpCodes')->with(100);
+ $Controller->httpCodes();
+ $Controller->httpCodes(100);
+ }
+
+/**
+ * Tests that the startup process calls the correct functions
+ *
+ * @return void
+ */
+ public function testStartupProcess() {
+ $Controller = $this->getMock('Controller', array('getEventManager'));
+
+ $eventManager = $this->getMock('CakeEventManager');
+ $eventManager->expects($this->at(0))->method('dispatch')
+ ->with(
+ $this->logicalAnd(
+ $this->isInstanceOf('CakeEvent'),
+ $this->attributeEqualTo('_name', 'Controller.initialize'),
+ $this->attributeEqualTo('_subject', $Controller)
+ )
+ );
+ $eventManager->expects($this->at(1))->method('dispatch')
+ ->with(
+ $this->logicalAnd(
+ $this->isInstanceOf('CakeEvent'),
+ $this->attributeEqualTo('_name', 'Controller.startup'),
+ $this->attributeEqualTo('_subject', $Controller)
+ )
+ );
+ $Controller->expects($this->exactly(2))->method('getEventManager')
+ ->will($this->returnValue($eventManager));
+ $Controller->startupProcess();
+ }
+
+/**
+ * Tests that the shutdown process calls the correct functions
+ *
+ * @return void
+ */
+ public function testStartupProcessIndirect() {
+ $Controller = $this->getMock('Controller', array('beforeFilter'));
+
+ $Controller->components = array('MockShutdown');
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->expects($this->once())->method('beforeFilter');
+ $Controller->Components->expects($this->exactly(2))->method('trigger')->with($this->isInstanceOf('CakeEvent'));
+
+ $Controller->startupProcess();
+ }
+
+/**
+ * Tests that the shutdown process calls the correct functions
+ *
+ * @return void
+ */
+ public function testShutdownProcess() {
+ $Controller = $this->getMock('Controller', array('getEventManager'));
+
+ $eventManager = $this->getMock('CakeEventManager');
+ $eventManager->expects($this->once())->method('dispatch')
+ ->with(
+ $this->logicalAnd(
+ $this->isInstanceOf('CakeEvent'),
+ $this->attributeEqualTo('_name', 'Controller.shutdown'),
+ $this->attributeEqualTo('_subject', $Controller)
+ )
+ );
+ $Controller->expects($this->once())->method('getEventManager')
+ ->will($this->returnValue($eventManager));
+ $Controller->shutdownProcess();
+ }
+
+/**
+ * Tests that the shutdown process calls the correct functions
+ *
+ * @return void
+ */
+ public function testShutdownProcessIndirect() {
+ $Controller = $this->getMock('Controller', array('afterFilter'));
+
+ $Controller->components = array('MockShutdown');
+ $Controller->Components = $this->getMock('ComponentCollection', array('trigger'));
+
+ $Controller->expects($this->once())->method('afterFilter');
+ $Controller->Components->expects($this->exactly(1))->method('trigger')->with($this->isInstanceOf('CakeEvent'));
+
+ $Controller->shutdownProcess();
+ }
+
+/**
+ * test that BC works for attributes on the request object.
+ *
+ * @return void
+ */
+ public function testPropertyBackwardsCompatibility() {
+ $request = new CakeRequest('posts/index', null);
+ $request->addParams(array('controller' => 'posts', 'action' => 'index'));
+ $request->data = array('Post' => array('id' => 1));
+ $request->here = '/posts/index';
+ $request->webroot = '/';
+
+ $Controller = new TestController($request);
+ $this->assertEquals($request->data, $Controller->data);
+ $this->assertEquals($request->webroot, $Controller->webroot);
+ $this->assertEquals($request->here, $Controller->here);
+ $this->assertEquals($request->action, $Controller->action);
+
+ $this->assertFalse(empty($Controller->data));
+ $this->assertTrue(isset($Controller->data));
+ $this->assertTrue(empty($Controller->something));
+ $this->assertFalse(isset($Controller->something));
+
+ $this->assertEquals($request, $Controller->params);
+ $this->assertEquals($request->params['controller'], $Controller->params['controller']);
+ }
+
+/**
+ * test that the BC wrapper doesn't interfere with models and components.
+ *
+ * @return void
+ */
+ public function testPropertyCompatibilityAndModelsComponents() {
+ $request = new CakeRequest('controller_posts/index');
+
+ $Controller = new TestController($request);
+ $Controller->constructClasses();
+ $this->assertInstanceOf('SecurityComponent', $Controller->Security);
+ $this->assertInstanceOf('ControllerComment', $Controller->ControllerComment);
+ }
+
+/**
+ * test that using Controller::paginate() falls back to PaginatorComponent
+ *
+ * @return void
+ */
+ public function testPaginateBackwardsCompatibility() {
+ $request = new CakeRequest('controller_posts/index');
+ $request->params['pass'] = $request->params['named'] = array();
+ $response = $this->getMock('CakeResponse', array('httpCodes'));
+
+ $Controller = new Controller($request, $response);
+ $Controller->uses = array('ControllerPost', 'ControllerComment');
+ $Controller->passedArgs[] = '1';
+ $Controller->params['url'] = array();
+ $Controller->constructClasses();
+ $expected = array('page' => 1, 'limit' => 20, 'maxLimit' => 100, 'paramType' => 'named');
+ $this->assertEquals($expected, $Controller->paginate);
+
+ $results = Hash::extract($Controller->paginate('ControllerPost'), '{n}.ControllerPost.id');
+ $this->assertEquals(array(1, 2, 3), $results);
+
+ $Controller->passedArgs = array();
+ $Controller->paginate = array('limit' => '-1');
+ $this->assertEquals(array('limit' => '-1'), $Controller->paginate);
+ $Controller->paginate('ControllerPost');
+ $this->assertSame($Controller->params['paging']['ControllerPost']['page'], 1);
+ $this->assertSame($Controller->params['paging']['ControllerPost']['pageCount'], 3);
+ $this->assertSame($Controller->params['paging']['ControllerPost']['prevPage'], false);
+ $this->assertSame($Controller->params['paging']['ControllerPost']['nextPage'], true);
+ }
+
+/**
+ * testMissingAction method
+ *
+ * @expectedException MissingActionException
+ * @expectedExceptionMessage Action TestController::missing() could not be found.
+ * @return void
+ */
+ public function testInvokeActionMissingAction() {
+ $url = new CakeRequest('test/missing');
+ $url->addParams(array('controller' => 'test_controller', 'action' => 'missing'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking private methods.
+ *
+ * @expectedException PrivateActionException
+ * @expectedExceptionMessage Private Action TestController::private_m() is not directly accessible.
+ * @return void
+ */
+ public function testInvokeActionPrivate() {
+ $url = new CakeRequest('test/private_m/');
+ $url->addParams(array('controller' => 'test_controller', 'action' => 'private_m'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking protected methods.
+ *
+ * @expectedException PrivateActionException
+ * @expectedExceptionMessage Private Action TestController::protected_m() is not directly accessible.
+ * @return void
+ */
+ public function testInvokeActionProtected() {
+ $url = new CakeRequest('test/protected_m/');
+ $url->addParams(array('controller' => 'test_controller', 'action' => 'protected_m'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking hidden methods.
+ *
+ * @expectedException PrivateActionException
+ * @expectedExceptionMessage Private Action TestController::_hidden() is not directly accessible.
+ * @return void
+ */
+ public function testInvokeActionHidden() {
+ $url = new CakeRequest('test/_hidden/');
+ $url->addParams(array('controller' => 'test_controller', 'action' => '_hidden'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking controller methods.
+ *
+ * @expectedException PrivateActionException
+ * @expectedExceptionMessage Private Action TestController::redirect() is not directly accessible.
+ * @return void
+ */
+ public function testInvokeActionBaseMethods() {
+ $url = new CakeRequest('test/redirect/');
+ $url->addParams(array('controller' => 'test_controller', 'action' => 'redirect'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking controller methods.
+ *
+ * @expectedException PrivateActionException
+ * @expectedExceptionMessage Private Action TestController::admin_add() is not directly accessible.
+ * @return void
+ */
+ public function testInvokeActionPrefixProtection() {
+ Router::reload();
+ Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin'));
+
+ $url = new CakeRequest('test/admin_add/');
+ $url->addParams(array('controller' => 'test_controller', 'action' => 'admin_add'));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $Controller->invokeAction($url);
+ }
+
+/**
+ * test invoking controller methods.
+ *
+ * @return void
+ */
+ public function testInvokeActionReturnValue() {
+ $url = new CakeRequest('test/returner/');
+ $url->addParams(array(
+ 'controller' => 'test_controller',
+ 'action' => 'returner',
+ 'pass' => array()
+ ));
+ $response = $this->getMock('CakeResponse');
+
+ $Controller = new TestController($url, $response);
+ $result = $Controller->invokeAction($url);
+ $this->assertEquals('I am from the controller.', $result);
+ }
+
+}