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), 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS) )); CakePlugin::loadAll(); $this->Case = new ControllerTestCase(); Router::reload(); } /** * teardown * * @return void */ public function tearDown() { parent::tearDown(); CakePlugin::unload(); $this->Case->controller = null; } /** * Test that ControllerTestCase::generate() creates mock objects correctly */ public function testGenerate() { if (defined('APP_CONTROLLER_EXISTS')) { $this->markTestSkipped('AppController exists, cannot run.'); } $Posts = $this->Case->generate('Posts'); $this->assertEquals($Posts->name, 'Posts'); $this->assertEquals($Posts->modelClass, 'Post'); $this->assertNull($Posts->response->send()); $Posts = $this->Case->generate('Posts', array( 'methods' => array( 'render' ) )); $this->assertNull($Posts->render('index')); $Posts = $this->Case->generate('Posts', array( 'models' => array('Post'), 'components' => array('RequestHandler') )); $this->assertInstanceOf('Post', $Posts->Post); $this->assertNull($Posts->Post->save(array())); $this->assertNull($Posts->Post->find('all')); $this->assertEquals($Posts->Post->useTable, 'posts'); $this->assertNull($Posts->RequestHandler->isAjax()); $Posts = $this->Case->generate('Posts', array( 'models' => array( 'Post' => true ) )); $this->assertNull($Posts->Post->save(array())); $this->assertNull($Posts->Post->find('all')); $Posts = $this->Case->generate('Posts', array( 'models' => array( 'Post' => array('save'), ) )); $this->assertNull($Posts->Post->save(array())); $this->assertInternalType('array', $Posts->Post->find('all')); $Posts = $this->Case->generate('Posts', array( 'models' => array('Post'), 'components' => array( 'RequestHandler' => array('isPut'), 'Email' => array('send'), 'Session' ) )); $Posts->RequestHandler->expects($this->once()) ->method('isPut') ->will($this->returnValue(true)); $this->assertTrue($Posts->RequestHandler->isPut()); $Posts->Auth->Session->expects($this->any()) ->method('write') ->will($this->returnValue('written!')); $this->assertEquals($Posts->Auth->Session->write('something'), 'written!'); } /** * Tests ControllerTestCase::generate() using classes from plugins */ public function testGenerateWithPlugin() { $Tests = $this->Case->generate('TestPlugin.Tests', array( 'models' => array( 'TestPlugin.TestPluginComment' ), 'components' => array( 'TestPlugin.PluginsComponent' ) )); $this->assertEquals($Tests->name, 'Tests'); $this->assertInstanceOf('PluginsComponentComponent', $Tests->PluginsComponent); $result = ClassRegistry::init('TestPlugin.TestPluginComment'); $this->assertInstanceOf('TestPluginComment', $result); $Tests = $this->Case->generate('ControllerTestCaseTest', array( 'models' => array( 'TestPlugin.TestPluginComment' => array('save') ) )); $this->assertInstanceOf('TestPluginComment', $Tests->TestPluginComment); $Tests->TestPluginComment->expects($this->at(0)) ->method('save') ->will($this->returnValue(true)); $Tests->TestPluginComment->expects($this->at(1)) ->method('save') ->will($this->returnValue(false)); $this->assertTrue($Tests->TestPluginComment->save(array())); $this->assertFalse($Tests->TestPluginComment->save(array())); } /** * Tests testAction */ public function testTestAction() { $Controller = $this->Case->generate('TestsApps'); $this->Case->testAction('/tests_apps/index'); $this->assertInternalType('array', $this->Case->controller->viewVars); $this->Case->testAction('/tests_apps/set_action'); $results = $this->Case->controller->viewVars; $expected = array( 'var' => 'string' ); $this->assertEquals($expected, $results); $result = $this->Case->controller->response->body(); $this->assertPattern('/This is the TestsAppsController index view/', $result); $this->Case->testAction('/tests_apps/redirect_to'); $results = $this->Case->headers; $expected = array( 'Location' => 'http://cakephp.org' ); $this->assertEquals($expected, $results); } /** * Tests using loaded routes during tests */ public function testUseRoutes() { Router::connect('/:controller/:action/*'); include CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS . 'routes.php'; $controller = $this->Case->generate('TestsApps'); $controller->Components->load('RequestHandler'); $result = $this->Case->testAction('/tests_apps/index.json', array('return' => 'view')); $result = json_decode($result, true); $expected = array('cakephp' => 'cool'); $this->assertEquals($expected, $result); include CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS . 'routes.php'; $result = $this->Case->testAction('/some_alias'); $this->assertEquals($result, 5); include CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS . 'routes.php'; $this->Case->testAction('/redirect_me_now'); $result = $this->Case->headers['Location']; $this->assertEquals($result, 'http://cakephp.org'); include CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS . 'routes.php'; $this->Case->testAction('/redirect_me'); $result = $this->Case->headers['Location']; $this->assertEquals($result, Router::url(array('controller' => 'tests_apps', 'action' => 'some_method'), true)); } /** * Tests not using loaded routes during tests * * @expectedException MissingActionException */ public function testSkipRoutes() { Router::connect('/:controller/:action/*'); include CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS . 'routes.php'; $this->Case->loadRoutes = false; $result = $this->Case->testAction('/tests_apps/missing_action.json', array('return' => 'view')); } /** * Tests backwards compatibility with setting the return type */ public function testBCSetReturn() { $this->Case->autoMock = true; $result = $this->Case->testAction('/tests_apps/some_method'); $this->assertEquals($result, 5); $data = array('var' => 'set'); $result = $this->Case->testAction('/tests_apps_posts/post_var', array( 'data' => $data, 'return' => 'vars' )); $this->assertEquals($result['data'], $data); $result = $this->Case->testAction('/tests_apps/set_action', array( 'return' => 'view' )); $this->assertEquals($result, 'This is the TestsAppsController index view'); $result = $this->Case->testAction('/tests_apps/set_action', array( 'return' => 'contents' )); $this->assertPattern('/assertPattern('/This is the TestsAppsController index view/', $result); $this->assertPattern('/<\/html>/', $result); } /** * Tests sending POST data to testAction */ public function testTestActionPostData() { $this->Case->autoMock = true; $data = array( 'Post' => array( 'name' => 'Some Post' ) ); $this->Case->testAction('/tests_apps_posts/post_var', array( 'data' => $data )); $this->assertEquals($this->Case->controller->viewVars['data'], $data); $this->assertEquals($this->Case->controller->data, $data); $this->Case->testAction('/tests_apps_posts/post_var/named:param', array( 'data' => $data )); $expected = array( 'named' => 'param' ); $this->assertEqual($this->Case->controller->request->named, $expected); $this->assertEquals($this->Case->controller->data, $data); $result = $this->Case->testAction('/tests_apps_posts/post_var', array( 'return' => 'vars', 'method' => 'post', 'data' => array( 'name' => 'is jonas', 'pork' => 'and beans', ) )); $this->assertEqual(array_keys($result['data']), array('name', 'pork')); $result = $this->Case->testAction('/tests_apps_posts/add', array('return' => 'vars')); $this->assertTrue(array_key_exists('posts', $result)); $this->assertEqual(count($result['posts']), 4); } /** * Tests sending GET data to testAction */ public function testTestActionGetData() { $this->Case->autoMock = true; $result = $this->Case->testAction('/tests_apps_posts/url_var', array( 'method' => 'get', 'data' => array( 'some' => 'var', 'lackof' => 'creativity' ) )); $this->assertEquals($this->Case->controller->request->query['some'], 'var'); $this->assertEquals($this->Case->controller->request->query['lackof'], 'creativity'); $result = $this->Case->testAction('/tests_apps_posts/url_var/var1:value1/var2:val2', array( 'return' => 'vars', 'method' => 'get', )); $this->assertEqual(array_keys($result['params']['named']), array('var1', 'var2')); $result = $this->Case->testAction('/tests_apps_posts/url_var/gogo/val2', array( 'return' => 'vars', 'method' => 'get', )); $this->assertEqual($result['params']['pass'], array('gogo', 'val2')); $result = $this->Case->testAction('/tests_apps_posts/url_var', array( 'return' => 'vars', 'method' => 'get', 'data' => array( 'red' => 'health', 'blue' => 'mana' ) )); $query = $this->Case->controller->request->query; $this->assertTrue(isset($query['red'])); $this->assertTrue(isset($query['blue'])); } /** * Tests autoMock ability */ public function testAutoMock() { $this->Case->autoMock = true; $this->Case->testAction('/tests_apps/set_action'); $results = $this->Case->controller->viewVars; $expected = array( 'var' => 'string' ); $this->assertEquals($expected, $results); } /** * Test using testAction and not mocking */ public function testNoMocking() { $result = $this->Case->testAction('/tests_apps/some_method'); $this->Case->assertEquals($result, 5); $data = array('var' => 'set'); $result = $this->Case->testAction('/tests_apps_posts/post_var', array( 'data' => $data, 'return' => 'vars' )); $this->assertEquals($result['data'], $data); $result = $this->Case->testAction('/tests_apps/set_action', array( 'return' => 'view' )); $this->assertEquals($result, 'This is the TestsAppsController index view'); $result = $this->Case->testAction('/tests_apps/set_action', array( 'return' => 'contents' )); $this->assertPattern('/assertPattern('/This is the TestsAppsController index view/', $result); $this->assertPattern('/<\/html>/', $result); } }