You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

791 lines
30 KiB

<?php
/**
* @link https://github.com/paulzi/yii2-nested-sets
* @copyright Copyright (c) 2015 PaulZi <pavel.zimakoff@gmail.com>
* @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
*/
namespace paulzi\nestedsets\tests;
use paulzi\nestedsets\tests\migrations\TestMigration;
use paulzi\nestedsets\tests\models\MultipleTreeNode;
use paulzi\nestedsets\tests\models\Node;
use Yii;
/**
* @author PaulZi <pavel.zimakoff@gmail.com>
*/
class NestedSetsBehaviorTestCase extends BaseTestCase
{
public function testGetParents()
{
$data = [1, 4, 9];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(21)->parents));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(21)->parents));
$data = [];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(1)->parents));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(1)->parents));
$data = [2, 7];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(17)->getParents(2)->all()));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(17)->getParents(2)->all()));
$data = [26, 30];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(38)->parents));
}
public function testGetParent()
{
$this->assertEquals(5, Node::findOne(12)->parent->id);
$this->assertEquals(5, MultipleTreeNode::findOne(12)->parent->id);
$this->assertEquals(1, Node::findOne(4)->getParent()->one()->getAttribute('id'));
$this->assertEquals(26, MultipleTreeNode::findOne(29)->getParent()->one()->getAttribute('id'));
$this->assertEquals(null, Node::findOne(1)->parent);
$this->assertEquals(null, MultipleTreeNode::findOne(1)->parent);
}
public function testGetRoot()
{
$this->assertEquals(1, Node::findOne(16)->root->id);
$this->assertEquals(26, MultipleTreeNode::findOne(28)->root->id);
$this->assertEquals(1, Node::findOne(1)->getRoot()->one()->getAttribute('id'));
$this->assertEquals(26, MultipleTreeNode::findOne(26)->getRoot()->one()->getAttribute('id'));
}
public function testGetDescendants()
{
$data = [8, 9, 20, 21, 22, 10, 23, 24, 25];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->descendants));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->descendants));
$data = [2, 5, 6, 7];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(2)->getDescendants(1, true)->all()));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(2)->getDescendants(1, true)->all()));
$data = [10, 25, 24, 23, 9, 22, 21, 20, 8];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->getDescendants(3, false, true)->all()));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->getDescendants(3, false, true)->all()));
$data = [];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(8)->descendants));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(8)->descendants));
}
public function testGetChildren()
{
$data = [8, 9, 10];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->children));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->children));
$data = [];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(3)->getChildren()->all()));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(28)->getChildren()->all()));
}
public function testGetLeaves()
{
$data = [8, 20, 21, 22, 23, 24, 25];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->leaves));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->leaves));
$data = [3, 8];
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(1)->getLeaves(2)->all()));
$this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(1)->getLeaves(2)->all()));
}
public function testGetPrev()
{
$this->assertEquals(11, Node::findOne(12)->prev->id);
$this->assertEquals(11, MultipleTreeNode::findOne(12)->prev->id);
$this->assertEquals(null, Node::findOne(20)->getPrev()->one());
$this->assertEquals(null, MultipleTreeNode::findOne(20)->getPrev()->one());
}
public function testGetNext()
{
$this->assertEquals(13, Node::findOne(12)->next->id);
$this->assertEquals(13, MultipleTreeNode::findOne(12)->next->id);
$this->assertEquals(null, Node::findOne(19)->getNext()->one());
$this->assertEquals(null, MultipleTreeNode::findOne(19)->getNext()->one());
}
public function testPopulateTree()
{
$node = Node::findOne(2);
$node->populateTree();
$this->assertEquals(true, $node->isRelationPopulated('children'));
$this->assertEquals(true, $node->children[0]->isRelationPopulated('children'));
$this->assertEquals(11, $node->children[0]->children[0]->id);
$node = MultipleTreeNode::findOne(2);
$node->populateTree(1);
$this->assertEquals(true, $node->isRelationPopulated('children'));
$this->assertEquals(false, $node->children[0]->isRelationPopulated('children'));
$this->assertEquals(5, $node->children[0]->id);
$node = Node::findOne(19);
$node->populateTree();
$this->assertEquals(true, $node->isRelationPopulated('children'));
$node = Node::findOne(19);
$node->populateTree(1);
$this->assertEquals(true, $node->isRelationPopulated('children'));
$node = Node::findOne(1);
$node->populateTree(1);
$this->assertEquals(false, $node->children[1]->isRelationPopulated('children'));
$node = Node::findOne(1);
$node->populateTree(2);
$this->assertEquals(true, $node->children[1]->isRelationPopulated('children'));
}
public function testIsRoot()
{
$this->assertTrue(Node::findOne(1)->isRoot());
$this->assertTrue(MultipleTreeNode::findOne(1)->isRoot());
$this->assertTrue(MultipleTreeNode::findOne(26)->isRoot());
$this->assertFalse(Node::findOne(3)->isRoot());
$this->assertFalse(MultipleTreeNode::findOne(3)->isRoot());
$this->assertFalse(MultipleTreeNode::findOne(37)->isRoot());
}
public function testIsChildOf()
{
$this->assertTrue(Node::findOne(10)->isChildOf(Node::findOne(1)));
$this->assertTrue(MultipleTreeNode::findOne(10)->isChildOf(MultipleTreeNode::findOne(1)));
$this->assertTrue(Node::findOne(9)->isChildOf(Node::findOne(4)));
$this->assertTrue(MultipleTreeNode::findOne(9)->isChildOf(MultipleTreeNode::findOne(4)));
$this->assertFalse(Node::findOne(12)->isChildOf(Node::findOne(15)));
$this->assertFalse(MultipleTreeNode::findOne(12)->isChildOf(MultipleTreeNode::findOne(15)));
$this->assertFalse(Node::findOne(21)->isChildOf(Node::findOne(22)));
$this->assertFalse(MultipleTreeNode::findOne(21)->isChildOf(MultipleTreeNode::findOne(22)));
$this->assertFalse(Node::findOne(8)->isChildOf(Node::findOne(8)));
$this->assertFalse(MultipleTreeNode::findOne(8)->isChildOf(MultipleTreeNode::findOne(8)));
$this->assertFalse(MultipleTreeNode::findOne(6)->isChildOf(MultipleTreeNode::findOne(27)));
}
public function testIsLeaf()
{
$this->assertTrue(Node::findOne(3)->isLeaf());
$this->assertTrue(MultipleTreeNode::findOne(3)->isLeaf());
$this->assertFalse(Node::findOne(4)->isLeaf());
$this->assertFalse(MultipleTreeNode::findOne(4)->isLeaf());
}
public function testMakeRootInsert()
{
(new TestMigration())->up();
$dataSet = new ArrayDataSet(require(__DIR__ . '/data/empty.php'));
$this->getDatabaseTester()->setDataSet($dataSet);
$this->getDatabaseTester()->onSetUp();
$node = new Node(['slug' => 'r']);
$this->assertTrue($node->makeRoot()->save());
$node = new MultipleTreeNode(['slug' => 'r1']);
$this->assertTrue($node->makeRoot()->save());
$node = new MultipleTreeNode([
'slug' => 'r2',
'tree' => 100,
]);
$this->assertTrue($node->makeRoot()->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-make-root-insert.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testMakeRootUpdate()
{
$node = MultipleTreeNode::findOne(9);
$this->assertTrue($node->makeRoot()->save());
$node = MultipleTreeNode::findOne(27);
$node->setAttribute('tree', 100);
$this->assertTrue($node->makeRoot()->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-make-root-update.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testMakeRootNewExceptionIsRaisedWhenTreeAttributeIsFalseAndRootIsExists()
{
$node = new Node(['slug' => 'r']);
$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']);
$this->assertTrue($node->prependTo(Node::findOne(1))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-insert-in-no-empty.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToInsertInEmpty()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->prependTo(Node::findOne(15))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(15))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-insert-in-empty.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToUpdateSameNode()
{
$node = Node::findOne(4);
$this->assertTrue($node->prependTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(4);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-same-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToUpdateDeep()
{
$node = Node::findOne(10);
$this->assertTrue($node->prependTo(Node::findOne(18))->save());
$node = MultipleTreeNode::findOne(10);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(18))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-deep.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToUpdateOut()
{
$node = Node::findOne(6);
$this->assertTrue($node->prependTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(6);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-out.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToUpdateAnotherTree()
{
$node = MultipleTreeNode::findOne(30);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(4))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-another-tree.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testPrependToUpdateSelf()
{
$node = Node::findOne(2);
$this->assertTrue($node->prependTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(2);
$this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testPrependToInsertExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->prependTo(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testPrependToUpdateExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = Node::findOne(2);
$node->prependTo(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testPrependToUpdateExceptionIsRaisedWhenTargetIsSame()
{
$node = Node::findOne(3);
$node->prependTo(Node::findOne(3))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testPrependToUpdateExceptionIsRaisedWhenTargetIsChild()
{
$node = Node::findOne(5);
$node->prependTo(Node::findOne(11))->save();
}
public function testAppendToInsertInNoEmpty()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->appendTo(Node::findOne(1))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-insert-in-no-empty.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToInsertInEmpty()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->appendTo(Node::findOne(15))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(15))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-insert-in-empty.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToUpdateSameNode()
{
$node = Node::findOne(2);
$this->assertTrue($node->appendTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(2);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-same-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToUpdateDeep()
{
$node = Node::findOne(10);
$this->assertTrue($node->appendTo(Node::findOne(18))->save());
$node = MultipleTreeNode::findOne(10);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(18))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-deep.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToUpdateOut()
{
$node = Node::findOne(6);
$this->assertTrue($node->appendTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(6);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-out.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToUpdateAnotherTree()
{
$node = MultipleTreeNode::findOne(30);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(4))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-another-tree.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testAppendToUpdateSelf()
{
$node = Node::findOne(4);
$this->assertTrue($node->appendTo(Node::findOne(1))->save());
$node = MultipleTreeNode::findOne(4);
$this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testAppendToInsertExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->appendTo(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testAppendToUpdateExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = Node::findOne(2);
$node->appendTo(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testAppendToUpdateExceptionIsRaisedWhenTargetIsSame()
{
$node = Node::findOne(3);
$node->appendTo(Node::findOne(3))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testAppendToUpdateExceptionIsRaisedWhenTargetIsChild()
{
$node = Node::findOne(5);
$node->appendTo(Node::findOne(11))->save();
}
public function testInsertBeforeMiddle()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->insertBefore(Node::findOne(16))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(33))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-insert-middle.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertBeforeInsertBegin()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->insertBefore(Node::findOne(20))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(31))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-insert-begin.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertBeforeUpdateSameNode()
{
$node = Node::findOne(4);
$this->assertTrue($node->insertBefore(Node::findOne(2))->save());
$node = MultipleTreeNode::findOne(38);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(37))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-same-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertBeforeUpdateOtherNode()
{
$node = Node::findOne(9);
$this->assertTrue($node->insertBefore(Node::findOne(16))->save());
$node = MultipleTreeNode::findOne(35);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(28))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-other-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertBeforeUpdateNext()
{
$node = Node::findOne(12);
$this->assertTrue($node->insertBefore(Node::findOne(13))->save());
$node = MultipleTreeNode::findOne(33);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(34))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertBeforeUpdateAnotherTree()
{
$node = MultipleTreeNode::findOne(26);
$this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(15))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-another-tree.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertBeforeInsertExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->insertBefore(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertBeforeInsertExceptionIsRaisedWhenTargetIsRoot()
{
$node = new Node(['name' => 'new']);
$node->insertBefore(Node::findOne(1))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertBeforeUpdateExceptionIsRaisedWhenTargetIsSame()
{
$node = Node::findOne(3);
$node->insertBefore(Node::findOne(3))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertBeforeUpdateExceptionIsRaisedWhenTargetIsChild()
{
$node = Node::findOne(10);
$node->insertBefore(Node::findOne(23))->save();
}
public function testInsertAfterInsertMiddle()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->insertAfter(Node::findOne(21))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-insert-middle.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertAfterInsertEnd()
{
$node = new Node(['slug' => 'new']);
$this->assertTrue($node->insertAfter(Node::findOne(19))->save());
$node = new MultipleTreeNode(['slug' => 'new']);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(33))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-insert-end.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertAfterUpdateSameNode()
{
$node = Node::findOne(2);
$this->assertTrue($node->insertAfter(Node::findOne(4))->save());
$node = MultipleTreeNode::findOne(36);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-same-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertAfterUpdateOtherNode()
{
$node = Node::findOne(6);
$this->assertTrue($node->insertAfter(Node::findOne(21))->save());
$node = MultipleTreeNode::findOne(32);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(30))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-other-node.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertAfterUpdatePrev()
{
$node = Node::findOne(16);
$this->assertTrue($node->insertAfter(Node::findOne(15))->save());
$node = MultipleTreeNode::findOne(38);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testInsertAfterUpdateAnotherTree()
{
$node = MultipleTreeNode::findOne(26);
$this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(21))->save());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-another-tree.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertAfterInsertExceptionIsRaisedWhenTargetIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->insertAfter(new Node())->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertAfterInsertExceptionIsRaisedWhenTargetIsRoot()
{
$node = new Node(['slug' => 'new']);
$node->insertAfter(Node::findOne(1))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertAfterUpdateExceptionIsRaisedWhenTargetIsSame()
{
$node = Node::findOne(3);
$node->insertAfter(Node::findOne(3))->save();
}
/**
* @expectedException \yii\base\Exception
*/
public function testInsertAfterUpdateExceptionIsRaisedWhenTargetIsChild()
{
$node = Node::findOne(10);
$node->insertAfter(Node::findOne(23))->save();
}
public function testDelete()
{
$this->assertEquals(1, Node::findOne(2)->delete());
$this->assertEquals(1, MultipleTreeNode::findOne(30)->delete());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testDeleteRoot()
{
Node::findOne(1)->delete();
}
/**
* @expectedException \yii\base\Exception
*/
public function testDeleteExceptionIsRaisedWhenNodeIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->delete();
}
public function testDeleteWithChildren()
{
$this->assertEquals(4, Node::findOne(6)->deleteWithChildren());
$this->assertEquals(1, MultipleTreeNode::findOne(28)->deleteWithChildren());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete-with-children.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
public function testDeleteWithChildrenRoot()
{
$this->assertEquals(25, Node::findOne(1)->deleteWithChildren());
$this->assertEquals(14, MultipleTreeNode::findOne(26)->deleteWithChildren());
$dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
$expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete-with-children-root.php'));
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
/**
* @expectedException \yii\base\Exception
*/
public function testDeleteWithChildrenExceptionIsRaisedWhenNodeIsNewRecord()
{
$node = new Node(['slug' => 'new']);
$node->deleteWithChildren();
}
/**
* @expectedException \yii\base\NotSupportedException
*/
public function testExceptionIsRaisedWhenInsertIsCalled()
{
$node = new Node(['slug' => 'new']);
$node->insert();
}
public function testUpdate()
{
$node = Node::findOne(3);
$node->slug = 'update';
$this->assertEquals(1, $node->update());
}
}