Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Adding ControllerMergeVarsTestCase to more extensively test merging o…

…f vars in Controller::__mergeVars.

Fixing issue where components declared in AppController would get doubled settings if no components were declared in subclasses.
Fixes #6459

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8201 3807eeeb-6ff5-0310-8944-8be069107fe0
  • Loading branch information...
commit 16eb51e91c53c780c6089df397051516052467b1 1 parent 3e8e7a2
@markstory markstory authored
View
8 cake/libs/controller/controller.php
@@ -393,7 +393,9 @@ function __mergeVars() {
if ($var === 'components') {
$normal = Set::normalize($this->{$var});
$app = Set::normalize($appVars[$var]);
- $this->{$var} = Set::merge($app, $normal);
+ if ($app !== $normal) {
+ $this->{$var} = Set::merge($app, $normal);
+ }
} else {
$this->{$var} = Set::merge($this->{$var}, array_diff($appVars[$var], $this->{$var}));
}
@@ -415,7 +417,9 @@ function __mergeVars() {
if ($var === 'components') {
$normal = Set::normalize($this->{$var});
$app = Set::normalize($appVars[$var]);
- $this->{$var} = Set::merge($normal, array_diff_assoc($app, $normal));
+ if ($app !== $normal) {
+ $this->{$var} = Set::merge($app, $normal);
+ }
} else {
$this->{$var} = Set::merge($this->{$var}, array_diff($appVars[$var], $this->{$var}));
}
View
222 cake/tests/cases/libs/controller/controller_merge_vars.test.php
@@ -0,0 +1,222 @@
+<?php
+/* SVN FILE: $Id$ */
+/**
+ * Controller Merge vars Test file
+ *
+ * Isolated from the Controller and Component test as to not pollute their AppController class
+ *
+ * PHP versions 4 and 5
+ *
+ * CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite>
+ * Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
+ *
+ * Licensed under The Open Group Test Suite License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @filesource
+ * @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
+ * @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller
+ * @since CakePHP(tm) v 1.2.3
+ * @version $Revision$
+ * @modifiedby $LastChangedBy$
+ * @lastmodified $Date$
+ * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
+ */
+if (!class_exists('AppController')) {
+ /**
+ * Test case AppController requred
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+ class AppController extends Controller {
+ /**
+ * components
+ *
+ * @var array
+ **/
+ var $components = array('MergeVar' => array('flag', 'otherFlag', 'redirect' => false));
+ /**
+ * helpers
+ *
+ * @var array
+ **/
+ var $helpers = array('MergeVar' => array('format' => 'html', 'terse'));
+ }
+} elseif (!defined('APP_CONTROLLER_EXISTS')) {
+ define('APP_CONTROLLER_EXISTS', true);
+}
+
+/**
+ * MergeVar Component
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+class MergeVarComponent extends Object {
+
+}
+
+/**
+ * Additional controller for testing
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+class MergeVariablesController extends AppController {
+/**
+ * name
+ *
+ * @var string
+ **/
+ var $name = 'MergeVariables';
+/**
+ * uses
+ *
+ * @var arrays
+ **/
+ var $uses = array();
+}
+
+/**
+ * MergeVarPlugin App Controller
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+class MergeVarPluginAppController extends AppController {
+/**
+ * components
+ *
+ * @var array
+ **/
+ var $components = array('Auth' => array('setting' => 'val', 'otherVal'));
+/**
+ * helpers
+ *
+ * @var array
+ **/
+ var $helpers = array('Javascript');
+}
+
+/**
+ * MergePostsController
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+class MergePostsController extends MergeVarPluginAppController {
+/**
+ * name
+ *
+ * @var string
+ **/
+ var $name = 'MergePosts';
+/**
+ * uses
+ *
+ * @var array
+ **/
+ var $uses = array();
+}
+
+
+/**
+ * Test Case for Controller Merging of Vars.
+ *
+ * @package cake.tests.cases.libs.controller
+ **/
+class ControllerMergeVarsTestCase extends CakeTestCase {
+
+/**
+ * end test
+ *
+ * @return void
+ **/
+ function endTest() {
+ ClassRegistry::flush();
+ }
+/**
+ * test that component settings are not duplicated when merging component settings
+ *
+ * @return void
+ **/
+ function testComponentParamMergingNoDuplication() {
+ $Controller =& new MergeVariablesController();
+ $Controller->constructClasses();
+
+ $expected = array('MergeVar' => array('flag', 'otherFlag', 'redirect' => false));
+ $this->assertEqual($Controller->components, $expected, 'Duplication of settings occured. %s');
+ }
+/**
+ * test component merges with redeclared components
+ *
+ * @return void
+ **/
+ function testComponentMergingWithRedeclarations() {
+ $Controller =& new MergeVariablesController();
+ $Controller->components['MergeVar'] = array('remote', 'redirect' => true);
+ $Controller->constructClasses();
+
+ $expected = array('MergeVar' => array('flag', 'otherFlag', 'redirect' => true, 'remote'));
+ $this->assertEqual($Controller->components, $expected, 'Merging of settings is wrong. %s');
+ }
+/**
+ * test merging of helpers array, ensure no duplication occurs
+ *
+ * @return void
+ **/
+ function testHelperSettingMergingNoDuplication() {
+ $Controller =& new MergeVariablesController();
+ $Controller->constructClasses();
+
+ $expected = array('MergeVar' => array('format' => 'html', 'terse'));
+ $this->assertEqual($Controller->helpers, $expected, 'Duplication of settings occured. %s');
+ }
+/**
+ * test merging of vars with plugin
+ *
+ * @return void
+ **/
+ function testMergeVarsWithPlugin() {
+ $Controller =& new MergePostsController();
+ $Controller->components = array('Email' => array('ports' => 'open'));
+ $Controller->plugin = 'MergeVarPlugin';
+ $Controller->constructClasses();
+
+ $expected = array(
+ 'MergeVar' => array('flag', 'otherFlag', 'redirect' => false),
+ 'Auth' => array('setting' => 'val', 'otherVal'),
+ 'Email' => array('ports' => 'open')
+ );
+ $this->assertEqual($Controller->components, $expected, 'Components are unexpected %s');
+
+ $expected = array(
+ 'Javascript',
+ 'MergeVar' => array('format' => 'html', 'terse')
+ );
+ $this->assertEqual($Controller->helpers, $expected, 'Helpers are unexpected %s');
+
+ $Controller =& new MergePostsController();
+ $Controller->components = array();
+ $Controller->plugin = 'MergeVarPlugin';
+ $Controller->constructClasses();
+
+ $expected = array(
+ 'MergeVar' => array('flag', 'otherFlag', 'redirect' => false),
+ 'Auth' => array('setting' => 'val', 'otherVal'),
+ );
+ $this->assertEqual($Controller->components, $expected, 'Components are unexpected %s');
+ }
+/**
+ * Ensure that __mergeVars is not being greedy and merging with
+ * AppController when you make an instance of Controller
+ *
+ * @return void
+ **/
+ function testMergeVarsNotGreedy() {
+ $Controller =& new Controller();
+ $Controller->components = array();
+ $Controller->uses = array();
+ $Controller->constructClasses();
+
+ $this->assertTrue(isset($Controller->Session));
+ }
+}
Please sign in to comment.
Something went wrong with that request. Please try again.