Mercurial > hg > Members > shoshi > webvirt
diff cake/tests/cases/libs/controller/component.test.php @ 0:261e66bd5a0c
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Jul 2011 21:08:31 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cake/tests/cases/libs/controller/component.test.php Sun Jul 24 21:08:31 2011 +0900 @@ -0,0 +1,587 @@ +<?php +/** + * ComponentTest file + * + * PHP versions 4 and 5 + * + * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing> + * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The Open Group Test Suite License + * Redistributions of files must retain the above copyright notice. + * + * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests + * @package cake + * @subpackage cake.tests.cases.libs.controller + * @since CakePHP(tm) v 1.2.0.5436 + * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License + */ +App::import('Controller', 'Controller', false); +App::import('Controller', 'Component', false); + +if (!class_exists('AppController')) { + +/** + * AppController class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ + class AppController extends Controller { + +/** + * name property + * + * @var string 'App' + * @access public + */ + var $name = 'App'; + +/** + * uses property + * + * @var array + * @access public + */ + var $uses = array(); + +/** + * helpers property + * + * @var array + * @access public + */ + var $helpers = array(); + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('Orange' => array('colour' => 'blood orange')); + } +} elseif (!defined('APP_CONTROLLER_EXISTS')){ + define('APP_CONTROLLER_EXISTS', true); +} + +/** + * ParamTestComponent + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class ParamTestComponent extends Object { + +/** + * name property + * + * @var string 'ParamTest' + * @access public + */ + var $name = 'ParamTest'; + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('Banana' => array('config' => 'value')); + +/** + * initialize method + * + * @param mixed $controller + * @param mixed $settings + * @access public + * @return void + */ + function initialize(&$controller, $settings) { + foreach ($settings as $key => $value) { + if (is_numeric($key)) { + $this->{$value} = true; + } else { + $this->{$key} = $value; + } + } + } +} + +/** + * ComponentTestController class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class ComponentTestController extends AppController { + +/** + * name property + * + * @var string 'ComponentTest' + * @access public + */ + var $name = 'ComponentTest'; + +/** + * uses property + * + * @var array + * @access public + */ + var $uses = array(); +} + +/** + * AppleComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class AppleComponent extends Object { + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('Orange'); + +/** + * testName property + * + * @var mixed null + * @access public + */ + var $testName = null; + +/** + * startup method + * + * @param mixed $controller + * @access public + * @return void + */ + function startup(&$controller) { + $this->testName = $controller->name; + } +} + +/** + * OrangeComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class OrangeComponent extends Object { + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('Banana'); + +/** + * initialize method + * + * @param mixed $controller + * @access public + * @return void + */ + function initialize(&$controller, $settings) { + $this->Controller = $controller; + $this->Banana->testField = 'OrangeField'; + $this->settings = $settings; + } + +/** + * startup method + * + * @param Controller $controller + * @return string + * @access public + */ + function startup(&$controller) { + $controller->foo = 'pass'; + } +} + +/** + * BananaComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class BananaComponent extends Object { + +/** + * testField property + * + * @var string 'BananaField' + * @access public + */ + var $testField = 'BananaField'; + +/** + * startup method + * + * @param Controller $controller + * @return string + * @access public + */ + function startup(&$controller) { + $controller->bar = 'fail'; + } +} + +/** + * MutuallyReferencingOneComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class MutuallyReferencingOneComponent extends Object { + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('MutuallyReferencingTwo'); +} + +/** + * MutuallyReferencingTwoComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class MutuallyReferencingTwoComponent extends Object { + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('MutuallyReferencingOne'); +} + +/** + * SomethingWithEmailComponent class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class SomethingWithEmailComponent extends Object { + +/** + * components property + * + * @var array + * @access public + */ + var $components = array('Email'); +} + +Mock::generate('Object', 'ComponentMockComponent', array('startup', 'beforeFilter', 'beforeRender', 'other')); + +/** + * ComponentTest class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class ComponentTest extends CakeTestCase { + +/** + * setUp method + * + * @access public + * @return void + */ + function setUp() { + $this->_pluginPaths = App::path('plugins'); + App::build(array( + 'plugins' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins' . DS) + )); + } + +/** + * tearDown method + * + * @access public + * @return void + */ + function tearDown() { + App::build(); + ClassRegistry::flush(); + } + +/** + * testLoadComponents method + * + * @access public + * @return void + */ + function testLoadComponents() { + $Controller =& new ComponentTestController(); + $Controller->components = array('RequestHandler'); + + $Component =& new Component(); + $Component->init($Controller); + + $this->assertTrue(is_a($Controller->RequestHandler, 'RequestHandlerComponent')); + + $Controller =& new ComponentTestController(); + $Controller->plugin = 'test_plugin'; + $Controller->components = array('RequestHandler', 'TestPluginComponent'); + + $Component =& new Component(); + $Component->init($Controller); + + $this->assertTrue(is_a($Controller->RequestHandler, 'RequestHandlerComponent')); + $this->assertTrue(is_a($Controller->TestPluginComponent, 'TestPluginComponentComponent')); + $this->assertTrue(is_a( + $Controller->TestPluginComponent->TestPluginOtherComponent, + 'TestPluginOtherComponentComponent' + )); + $this->assertFalse(isset($Controller->TestPluginOtherComponent)); + + $Controller =& new ComponentTestController(); + $Controller->components = array('Security'); + + $Component =& new Component(); + $Component->init($Controller); + + $this->assertTrue(is_a($Controller->Security, 'SecurityComponent')); + $this->assertTrue(is_a($Controller->Security->Session, 'SessionComponent')); + + $Controller =& new ComponentTestController(); + $Controller->components = array('Security', 'Cookie', 'RequestHandler'); + + $Component =& new Component(); + $Component->init($Controller); + + $this->assertTrue(is_a($Controller->Security, 'SecurityComponent')); + $this->assertTrue(is_a($Controller->Security->RequestHandler, 'RequestHandlerComponent')); + $this->assertTrue(is_a($Controller->RequestHandler, 'RequestHandlerComponent')); + $this->assertTrue(is_a($Controller->Cookie, 'CookieComponent')); + } + +/** + * test component loading + * + * @return void + */ + function testNestedComponentLoading() { + $Controller =& new ComponentTestController(); + $Controller->components = array('Apple'); + $Controller->uses = false; + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + + $this->assertTrue(is_a($Controller->Apple, 'AppleComponent')); + $this->assertTrue(is_a($Controller->Apple->Orange, 'OrangeComponent')); + $this->assertTrue(is_a($Controller->Apple->Orange->Banana, 'BananaComponent')); + $this->assertTrue(is_a($Controller->Apple->Orange->Controller, 'ComponentTestController')); + $this->assertTrue(empty($Controller->Apple->Session)); + $this->assertTrue(empty($Controller->Apple->Orange->Session)); + } + +/** + * Tests Component::startup() and only running callbacks for components directly attached to + * the controller. + * + * @return void + */ + function testComponentStartup() { + $Controller =& new ComponentTestController(); + $Controller->components = array('Apple'); + $Controller->uses = false; + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + $Controller->beforeFilter(); + $Controller->Component->startup($Controller); + + $this->assertTrue(is_a($Controller->Apple, 'AppleComponent')); + $this->assertEqual($Controller->Apple->testName, 'ComponentTest'); + + $expected = !(defined('APP_CONTROLLER_EXISTS') && APP_CONTROLLER_EXISTS); + $this->assertEqual(isset($Controller->foo), $expected); + $this->assertFalse(isset($Controller->bar)); + } + +/** + * test that triggerCallbacks fires methods on all the components, and can trigger any method. + * + * @return void + */ + function testTriggerCallback() { + $Controller =& new ComponentTestController(); + $Controller->components = array('ComponentMock'); + $Controller->uses = null; + $Controller->constructClasses(); + + $Controller->ComponentMock->expectOnce('beforeRender'); + $Controller->Component->triggerCallback('beforeRender', $Controller); + + $Controller->ComponentMock->expectNever('beforeFilter'); + $Controller->ComponentMock->enabled = false; + $Controller->Component->triggerCallback('beforeFilter', $Controller); + } + +/** + * test a component being used more than once. + * + * @return void + */ + function testMultipleComponentInitialize() { + $Controller =& new ComponentTestController(); + $Controller->uses = false; + $Controller->components = array('Orange', 'Banana'); + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + + $this->assertEqual($Controller->Banana->testField, 'OrangeField'); + $this->assertEqual($Controller->Orange->Banana->testField, 'OrangeField'); + } + +/** + * Test Component declarations with Parameters + * tests merging of component parameters and merging / construction of components. + * + * @return void + */ + function testComponentsWithParams() { + if ($this->skipIf(defined('APP_CONTROLLER_EXISTS'), '%s Need a non-existent AppController')) { + return; + } + + $Controller =& new ComponentTestController(); + $Controller->components = array('ParamTest' => array('test' => 'value', 'flag'), 'Apple'); + $Controller->uses = false; + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + + $this->assertTrue(is_a($Controller->ParamTest, 'ParamTestComponent')); + $this->assertTrue(is_a($Controller->ParamTest->Banana, 'BananaComponent')); + $this->assertTrue(is_a($Controller->Orange, 'OrangeComponent')); + $this->assertFalse(isset($Controller->Session)); + $this->assertEqual($Controller->Orange->settings, array('colour' => 'blood orange')); + $this->assertEqual($Controller->ParamTest->test, 'value'); + $this->assertEqual($Controller->ParamTest->flag, true); + + //Settings are merged from app controller and current controller. + $Controller =& new ComponentTestController(); + $Controller->components = array( + 'ParamTest' => array('test' => 'value'), + 'Orange' => array('ripeness' => 'perfect') + ); + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + + $expected = array('colour' => 'blood orange', 'ripeness' => 'perfect'); + $this->assertEqual($Controller->Orange->settings, $expected); + $this->assertEqual($Controller->ParamTest->test, 'value'); + } + +/** + * Ensure that settings are not duplicated when passed into component initialize. + * + * @return void + */ + function testComponentParamsNoDuplication() { + if ($this->skipIf(defined('APP_CONTROLLER_EXISTS'), '%s Need a non-existent AppController')) { + return; + } + $Controller =& new ComponentTestController(); + $Controller->components = array('Orange' => array('setting' => array('itemx'))); + $Controller->uses = false; + + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + $expected = array('setting' => array('itemx'), 'colour' => 'blood orange'); + $this->assertEqual($Controller->Orange->settings, $expected, 'Params duplication has occured %s'); + } + +/** + * Test mutually referencing components. + * + * @return void + */ + function testMutuallyReferencingComponents() { + $Controller =& new ComponentTestController(); + $Controller->components = array('MutuallyReferencingOne'); + $Controller->uses = false; + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + + $this->assertTrue(is_a( + $Controller->MutuallyReferencingOne, + 'MutuallyReferencingOneComponent' + )); + $this->assertTrue(is_a( + $Controller->MutuallyReferencingOne->MutuallyReferencingTwo, + 'MutuallyReferencingTwoComponent' + )); + $this->assertTrue(is_a( + $Controller->MutuallyReferencingOne->MutuallyReferencingTwo->MutuallyReferencingOne, + 'MutuallyReferencingOneComponent' + )); + } + +/** + * Test mutually referencing components. + * + * @return void + */ + function testSomethingReferencingEmailComponent() { + $Controller =& new ComponentTestController(); + $Controller->components = array('SomethingWithEmail'); + $Controller->uses = false; + $Controller->constructClasses(); + $Controller->Component->initialize($Controller); + $Controller->beforeFilter(); + $Controller->Component->startup($Controller); + + $this->assertTrue(is_a( + $Controller->SomethingWithEmail, + 'SomethingWithEmailComponent' + )); + $this->assertTrue(is_a( + $Controller->SomethingWithEmail->Email, + 'EmailComponent' + )); + $this->assertTrue(is_a( + $Controller->SomethingWithEmail->Email->Controller, + 'ComponentTestController' + )); + } + +/** + * Test that SessionComponent doesn't get added if its already in the components array. + * + * @return void + * @access public + */ + function testDoubleLoadingOfSessionComponent() { + if ($this->skipIf(defined('APP_CONTROLLER_EXISTS'), '%s Need a non-existent AppController')) { + return; + } + + $Controller =& new ComponentTestController(); + $Controller->uses = false; + $Controller->components = array('Session'); + $Controller->constructClasses(); + + $this->assertEqual($Controller->components, array('Session' => '', 'Orange' => array('colour' => 'blood orange'))); + } + +}