Blame | Last modification | View Log | RSS feed
<?php/*** PHP 5** CakePHP(tm) : Rapid Development Framework (http://cakephp.org)* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)** Licensed under The MIT License* Redistributions of files must retain the above copyright notice.** @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)* @link http://cakephp.org CakePHP(tm) Project* @since DebugKit 2.1* @license http://www.opensource.org/licenses/mit-license.php MIT License*/App::uses('Router', 'Routing');App::uses('Controller', 'Controller');App::uses('AppController', 'Controller');App::uses('Component', 'Controller');App::uses('ToolbarComponent', 'DebugKit.Controller/Component');App::uses('DebugMemory', 'DebugKit.Lib');App::uses('DebugTimer', 'DebugKit.Lib');/*** Class TestToolbarComponent** @since DebugKit 2.1*/class TestToolbarComponent extends ToolbarComponent {/*** Load Panels of Toolbar** @param $panels* @param array $settings*/public function loadPanels($panels, $settings = array()) {$this->_loadPanels($panels, $settings);}}/*** ToolbarComponentTestCase Test case**/class ToolbarComponentTestCase extends CakeTestCase {/*** fixtures** @var array*/public $fixtures = array('core.article');/*** url for test** @var string*/public $url;/*** Start test callback** @return void*/public function setUp() {parent::setUp();Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));$this->_server = $_SERVER;$this->_get = $_GET;$this->_paths = array();$this->_paths['plugins'] = App::path('plugins');$this->_paths['views'] = App::path('views');$this->_paths['vendors'] = App::path('vendors');$this->_paths['controllers'] = App::path('controllers');Configure::write('Cache.disable', false);$this->url = '/';}/*** endTest** @return void*/public function tearDown() {$_SERVER = $this->_server;$_GET = $this->_get;parent::tearDown();App::build(array('plugins' => $this->_paths['plugins'],'views' => $this->_paths['views'],'controllers' => $this->_paths['controllers'],'vendors' => $this->_paths['vendors']), true);Configure::write('Cache.disable', true);unset($this->Controller);ClassRegistry::flush();if (class_exists('DebugMemory')) {DebugMemory::clear();}if (class_exists('DebugTimer')) {DebugTimer::clear();}Router::reload();}/*** loading test controller** @param array $settings* @return Controller*/protected function _loadController($settings = array()) {$request = new CakeRequest($this->url);$request->addParams(Router::parse($this->url));$this->Controller = new Controller($request);$this->Controller->uses = null;$this->Controller->components = array('Toolbar' => $settings + array('className' => 'TestToolbar'));$this->Controller->constructClasses();$this->Controller->Components->trigger('initialize', array($this->Controller));return $this->Controller;}/*** test Loading of panel classes** @return void*/public function testLoadPanels() {$this->_loadController();$this->Controller->Toolbar->loadPanels(array('session', 'request'));$this->assertInstanceOf('SessionPanel', $this->Controller->Toolbar->panels['session']);$this->assertInstanceOf('RequestPanel', $this->Controller->Toolbar->panels['request']);$this->Controller->Toolbar->loadPanels(array('history'), array('history' => 10));$this->assertEquals($this->Controller->Toolbar->panels['history']->history, 10);}/*** Test exceptions on bad panel names** @expectedException PHPUnit_Framework_Error* @return void*/public function testLoadPanelsError() {$this->Controller->Toolbar->loadPanels(array('randomNonExisting', 'request'));}/*** test Loading of panel classes from a plugin** @return void*/public function testLoadPluginPanels() {$debugKitPath = App::pluginPath('DebugKit');$noDir = (empty($debugKitPath) || !file_exists($debugKitPath));if ($noDir) {$this->markTestAsSkipped('Could not find DebugKit in plugin paths');}App::build(array('Plugin' => array($debugKitPath . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)));CakePlugin::load('DebugkitTestPlugin');$this->_loadController();$this->Controller->Toolbar->loadPanels(array('DebugkitTestPlugin.PluginTest'));$this->assertInstanceOf('PluginTestPanel',$this->Controller->Toolbar->panels['plugin_test']);}/*** test loading of vendor panels from test_app folder** @return void*/public function testLibPanels() {$debugKitPath = App::pluginPath('DebugKit');$noDir = (empty($debugKitPath) || !file_exists($debugKitPath));if ($noDir) {$this->markTestAsSkipped('Could not find DebugKit in plugin paths');}App::build(array('Lib' => array($debugKitPath . 'Test' . DS . 'test_app' . DS . 'Lib' . DS)));$this->_loadController(array('panels' => array('test'),'className' => 'DebugKit.Toolbar',));$this->assertTrue(isset($this->Controller->Toolbar->panels['test']));$this->assertInstanceOf('TestPanel', $this->Controller->Toolbar->panels['test']);}/*** test construct** @return void*/public function testConstruct() {$this->_loadController();$this->assertFalse(empty($this->Controller->Toolbar->panels));$memory = DebugMemory::getAll();$this->assertTrue(isset($memory['Component initialization']));$events = $this->Controller->getEventManager();$this->assertNotEmpty($events->listeners('Controller.initialize'));$this->assertNotEmpty($events->listeners('Controller.startup'));$this->assertNotEmpty($events->listeners('Controller.beforeRender'));$this->assertNotEmpty($events->listeners('Controller.shutdown'));$this->assertNotEmpty($events->listeners('View.beforeRender'));$this->assertNotEmpty($events->listeners('View.afterRender'));$this->assertNotEmpty($events->listeners('View.beforeLayout'));$this->assertNotEmpty($events->listeners('View.afterLayout'));}/*** test initialize w/ custom panels and defaults** @return void*/public function testInitializeCustomPanelsWithDefaults() {$this->_loadController(array('panels' => array('test'),));$expected = array('history', 'session', 'request', 'sql_log', 'timer','log', 'variables', 'environment', 'include', 'test');$this->assertEquals($expected, array_keys($this->Controller->Toolbar->panels));}/*** test syntax for removing panels** @return void*/public function testInitializeRemovingPanels() {$this->_loadController(array('panels' => array('session' => false,'history' => false,)));$expected = array('request', 'sql_log', 'timer', 'log', 'variables', 'environment', 'include');$this->assertEquals($expected, array_keys($this->Controller->Toolbar->panels));}/*** ensure that Toolbar is not enabled when debug == 0 on initialize** @return void*/public function testDebugDisableOnInitialize() {$_debug = Configure::read('debug');Configure::write('debug', 0);$this->_loadController();Configure::write('debug', $_debug);$this->assertFalse($this->Controller->Components->enabled('Toolbar'));}/*** test that passing in forceEnable will enable the toolbar even if debug = 0** @return void*/public function testForceEnable() {$_debug = Configure::read('debug');Configure::write('debug', 0);$this->_loadController(array('forceEnable' => true,));Configure::write('debug', $_debug);$this->assertTrue($this->Controller->Components->enabled('Toolbar'));}/*** Test disabling autoRunning of toolbar** @return void*/public function testAutoRunSettingFalse() {$this->_loadController(array('autoRun' => false,));$this->assertFalse($this->Controller->Components->enabled('Toolbar'));}/*** test autorun = false with query string param** @return void*/public function testAutoRunSettingWithQueryString() {$this->url = '/?debug=1';$_GET['debug'] = 1;$this->_loadController(array('autoRun' => false,));$this->assertTrue($this->Controller->Components->enabled('Toolbar'));}/*** test startup** @return void*/public function testStartup() {$this->_loadController(array('panels' => array('timer'),));$MockPanel = $this->getMock('DebugPanel');$MockPanel->expects($this->once())->method('startup');$this->Controller->Toolbar->panels['timer'] = $MockPanel;$this->Controller->Toolbar->startup($this->Controller);$timers = DebugTimer::getAll();$this->assertTrue(isset($timers['controllerAction']));$memory = DebugMemory::getAll();$this->assertTrue(isset($memory['Controller action start']));}/*** Test that cache config generation works.** @return void*/public function testCacheConfigGeneration() {$this->_loadController();$this->Controller->Components->trigger('startup', array($this->Controller));$results = Cache::config('debug_kit');$this->assertTrue(is_array($results));}/*** test state saving of toolbar** @return void*/public function testStateSaving() {$this->_loadController();$configName = 'debug_kit';$this->Controller->Toolbar->cacheKey = 'toolbar_history';$this->Controller->Components->trigger('startup', array($this->Controller));$this->Controller->set('test', 'testing');$this->Controller->Components->trigger('beforeRender', array($this->Controller));$result = Cache::read('toolbar_history', $configName);$this->assertEquals($result[0]['variables']['content']['test'], 'testing');Cache::delete('toolbar_history', $configName);}/*** Test Before Render callback** @return void*/public function testBeforeRender() {$this->_loadController(array('panels' => array('timer', 'session'),));$MockPanel = $this->getMock('DebugPanel');$MockPanel->expects($this->once())->method('beforeRender');$this->Controller->Toolbar->panels['timer'] = $MockPanel;$this->Controller->Toolbar->beforeRender($this->Controller);$this->assertTrue(isset($this->Controller->helpers['DebugKit.Toolbar']));$this->assertEquals($this->Controller->helpers['DebugKit.Toolbar']['output'], 'DebugKit.HtmlToolbar');$this->assertEquals($this->Controller->helpers['DebugKit.Toolbar']['cacheConfig'], 'debug_kit');$this->assertTrue(isset($this->Controller->helpers['DebugKit.Toolbar']['cacheKey']));$this->assertTrue(isset($this->Controller->viewVars['debugToolbarPanels']));$vars = $this->Controller->viewVars['debugToolbarPanels'];$expected = array('plugin' => 'DebugKit','elementName' => 'session_panel','content' => $this->Controller->Toolbar->Session->read(),'disableTimer' => true,'title' => '');$this->assertEquals($expected, $vars['session']);$memory = DebugMemory::getAll();$this->assertTrue(isset($memory['Controller render start']));}/*** test that vars are gathered and state is saved on beforeRedirect** @return void*/public function testBeforeRedirect() {$this->_loadController(array('panels' => array('session', 'history'),));$configName = 'debug_kit';$this->Controller->Toolbar->cacheKey = 'toolbar_history';Cache::delete('toolbar_history', $configName);DebugTimer::start('controllerAction', 'testing beforeRedirect');$MockPanel = $this->getMock('DebugPanel');$MockPanel->expects($this->once())->method('beforeRender');$this->Controller->Toolbar->panels['session'] = $MockPanel;$this->Controller->Toolbar->beforeRedirect($this->Controller, '/another/url');$result = Cache::read('toolbar_history', $configName);$this->assertTrue(isset($result[0]['session']));$this->assertFalse(isset($result[0]['history']));$timers = DebugTimer::getAll();$this->assertTrue(isset($timers['controllerAction']));}/*** test that loading state (accessing cache) works.** @return void*/public function testLoadState() {$this->_loadController();$this->Controller->Toolbar->cacheKey = 'toolbar_history';$data = array(0 => array('my data'));Cache::write('toolbar_history', $data, 'debug_kit');$result = $this->Controller->Toolbar->loadState(0);$this->assertEquals($result, $data[0]);}/*** Test that history state urls set prefix = null and admin = null so generated urls do not* adopt these params.** @return void*/public function testHistoryUrlGenerationWithPrefixes() {$this->url = '/debugkit_url_with_prefixes_test';Router::connect($this->url, array('controller' => 'posts','action' => 'edit','admin' => 1,'prefix' => 'admin','plugin' => 'cms',));$this->_loadController();$this->Controller->Toolbar->cacheKey = 'url_test';$this->Controller->Components->trigger('startup', array($this->Controller));$this->Controller->Components->trigger('beforeRender', array($this->Controller));$result = $this->Controller->Toolbar->panels['history']->beforeRender($this->Controller);$expected = array('plugin' => 'debug_kit','controller' => 'toolbar_access','action' => 'history_state',0 => 1,'admin' => false,);$this->assertEquals($result[0]['url'], $expected);Cache::delete('url_test', 'debug_kit');}/*** Test that the FireCake toolbar is used on AJAX requests** @return void*/public function testAjaxToolbar() {$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';$this->_loadController();$this->Controller->Components->trigger('startup', array($this->Controller));$this->Controller->Components->trigger('beforeRender', array($this->Controller));$this->assertEquals($this->Controller->helpers['DebugKit.Toolbar']['output'], 'DebugKit.FirePhpToolbar');}/*** Test that the toolbar does not interfere with requestAction** @return void*/public function testNoRequestActionInterference() {$debugKitPath = App::pluginPath('DebugKit');$noDir = (empty($debugKitPath) || !file_exists($debugKitPath));if ($noDir) {$this->markTestAsSkipped('Could not find DebugKit in plugin paths');}App::build(array('Controller' => $debugKitPath . 'Test' . DS . 'test_app' . DS . 'Controller' . DS,'View' => array($debugKitPath . 'Test' . DS . 'test_app' . DS . 'View' . DS,CAKE_CORE_INCLUDE_PATH . DS . 'Cake' . DS . 'View' . DS),'plugins' => $this->_paths['plugins']));Router::reload();$this->_loadController();$result = $this->Controller->requestAction('/debug_kit_test/request_action_return', array('return'));$this->assertEquals($result, 'I am some value from requestAction.');$result = $this->Controller->requestAction('/debug_kit_test/request_action_render', array('return'));$this->assertEquals($result, 'I have been rendered.');}}