diff --git a/NestedSetsBehavior.php b/NestedSetsBehavior.php index d0d1569..96339b3 100644 --- a/NestedSetsBehavior.php +++ b/NestedSetsBehavior.php @@ -492,7 +492,9 @@ class NestedSetsBehavior extends Behavior { switch ($this->operation) { case self::OPERATION_MAKE_ROOT: - $this->moveNodeAsRoot(); + if ($this->treeChange || !$this->isRoot() || $this->owner->getIsNewRecord()) { + $this->moveNodeAsRoot(); + } break; case self::OPERATION_PREPEND_TO: diff --git a/composer.lock b/composer.lock index aaecaca..b5be5af 100644 --- a/composer.lock +++ b/composer.lock @@ -52,7 +52,7 @@ "version": "v1.3.2", "source": { "type": "git", - "url": "https://github.com/bestiejs/punycode.js.git", + "url": "git@github.com:bestiejs/punycode.js.git", "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" }, "dist": { @@ -294,16 +294,16 @@ }, { "name": "yiisoft/yii2-composer", - "version": "2.0.6", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/yiisoft/yii2-composer.git", - "reference": "163419f1f197e02f015713b0d4f85598d8f8aa80" + "reference": "1439e78be1218c492e6cde251ed87d3f128b9534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/163419f1f197e02f015713b0d4f85598d8f8aa80", - "reference": "163419f1f197e02f015713b0d4f85598d8f8aa80", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/1439e78be1218c492e6cde251ed87d3f128b9534", + "reference": "1439e78be1218c492e6cde251ed87d3f128b9534", "shasum": "" }, "require": { @@ -344,7 +344,7 @@ "extension installer", "yii2" ], - "time": "2018-03-21T16:15:55+00:00" + "time": "2018-07-05T15:44:47+00:00" } ], "packages-dev": [ @@ -458,35 +458,29 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157", + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.3.0", "webmozart/assert": "^1.0" }, "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ @@ -505,20 +499,20 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "time": "2017-08-08T06:39:58+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773", + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773", "shasum": "" }, "require": { @@ -552,27 +546,27 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14T14:27:02+00:00" + "time": "2017-06-03T08:32:36+00:00" }, { "name": "phpspec/prophecy", - "version": "1.7.5", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "dfd6be44111a7c41c2e884a336cc4f461b3b2401" + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/dfd6be44111a7c41c2e884a336cc4f461b3b2401", - "reference": "dfd6be44111a7c41c2e884a336cc4f461b3b2401", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { @@ -615,7 +609,7 @@ "spy", "stub" ], - "time": "2018-02-19T10:16:54+00:00" + "time": "2018-04-18T13:57:24+00:00" }, { "name": "phpunit/dbunit", @@ -1425,21 +1419,77 @@ "time": "2015-06-21T13:59:46+00:00" }, { + "name": "symfony/polyfill-ctype", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-04-30T19:57:29+00:00" + }, + { "name": "symfony/yaml", - "version": "v3.4.6", + "version": "v3.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6af42631dcf89e9c616242c900d6c52bd53bd1bb" + "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6af42631dcf89e9c616242c900d6c52bd53bd1bb", - "reference": "6af42631dcf89e9c616242c900d6c52bd53bd1bb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", + "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" @@ -1480,7 +1530,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-02-16T09:50:28+00:00" + "time": "2018-05-03T23:18:14+00:00" }, { "name": "webmozart/assert", diff --git a/tests/NestedSetsBehaviorTestCase.php b/tests/NestedSetsBehaviorTestCase.php index fd2c000..664ec50 100644 --- a/tests/NestedSetsBehaviorTestCase.php +++ b/tests/NestedSetsBehaviorTestCase.php @@ -233,6 +233,16 @@ class NestedSetsBehaviorTestCase extends BaseTestCase $node->makeRoot()->save(); } + public function testMakeRootNoChange() + { + $node = MultipleTreeNode::findOne(1); + $node->slug = 'root'; + $this->assertTrue($node->makeRoot()->save()); + $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']); + $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-make-root-no-change.php')); + $this->assertDataSetsEqual($expectedDataSet, $dataSet); + } + public function testPrependToInsertInNoEmpty() { $node = new Node(['slug' => 'new']); diff --git a/tests/data/test-make-root-no-change.php b/tests/data/test-make-root-no-change.php new file mode 100644 index 0000000..7439e2f --- /dev/null +++ b/tests/data/test-make-root-no-change.php @@ -0,0 +1,72 @@ + array( + array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'), + array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'), + array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'), + array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'), + array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'), + array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'), + array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'), + array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'), + array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'), + array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'), + array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'), + array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'), + array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'), + array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'), + array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'), + array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'), + array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'), + array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'), + array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'), + array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'), + array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'), + array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'), + array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'), + array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'), + array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'), + ), + 'multiple_tree' => array( + array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'root'), + array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'), + array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'), + array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'), + array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'), + array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'), + array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'), + array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'), + array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'), + array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'), + array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'), + array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'), + array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'), + array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'), + array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'), + array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'), + array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'), + array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'), + array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'), + array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'), + array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'), + array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'), + array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'), + array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'), + array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'), + + array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'), + array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'), + array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'), + array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'), + array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'), + array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'), + array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'), + array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'), + array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'), + array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'), + array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'), + array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'), + array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'), + array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'), + ) +); \ No newline at end of file