| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
- use Illuminate\Database\Capsule\Manager as Capsule;
- use Kalnoy\Nestedset\NestedSet;
- class ScopedNodeTest extends PHPUnit\Framework\TestCase
- {
- public static function setUpBeforeClass(): void
- {
- $schema = Capsule::schema();
- $schema->dropIfExists('menu_items');
- Capsule::disableQueryLog();
- $schema->create('menu_items', function (\Illuminate\Database\Schema\Blueprint $table) {
- $table->increments('id');
- $table->unsignedInteger('menu_id');
- $table->string('title')->nullable();
- NestedSet::columns($table);
- });
- Capsule::enableQueryLog();
- }
- public function setUp(): void
- {
- $data = include __DIR__.'/data/menu_items.php';
- Capsule::table('menu_items')->insert($data);
- Capsule::flushQueryLog();
- MenuItem::resetActionsPerformed();
- date_default_timezone_set('America/Denver');
- }
- public function tearDown(): void
- {
- Capsule::table('menu_items')->truncate();
- }
- public function assertTreeNotBroken($menuId)
- {
- $this->assertFalse(MenuItem::scoped([ 'menu_id' => $menuId ])->isBroken());
- }
- public function testNotBroken()
- {
- $this->assertTreeNotBroken(1);
- $this->assertTreeNotBroken(2);
- }
- public function testMovingNodeNotAffectingOtherMenu()
- {
- $node = MenuItem::where('menu_id', '=', 1)->first();
- $node->down();
- $node = MenuItem::where('menu_id', '=', 2)->first();
- $this->assertEquals(1, $node->getLft());
- }
- public function testScoped()
- {
- $node = MenuItem::scoped([ 'menu_id' => 2 ])->first();
- $this->assertEquals(3, $node->getKey());
- }
- public function testSiblings()
- {
- $node = MenuItem::find(1);
- $result = $node->getSiblings();
- $this->assertEquals(1, $result->count());
- $this->assertEquals(2, $result->first()->getKey());
- $result = $node->getNextSiblings();
- $this->assertEquals(2, $result->first()->getKey());
- $node = MenuItem::find(2);
- $result = $node->getPrevSiblings();
- $this->assertEquals(1, $result->first()->getKey());
- }
- public function testDescendants()
- {
- $node = MenuItem::find(2);
- $result = $node->getDescendants();
- $this->assertEquals(1, $result->count());
- $this->assertEquals(5, $result->first()->getKey());
- $node = MenuItem::scoped([ 'menu_id' => 1 ])->with('descendants')->find(2);
- $result = $node->descendants;
- $this->assertEquals(1, $result->count());
- $this->assertEquals(5, $result->first()->getKey());
- }
- public function testAncestors()
- {
- $node = MenuItem::find(5);
- $result = $node->getAncestors();
- $this->assertEquals(1, $result->count());
- $this->assertEquals(2, $result->first()->getKey());
- $node = MenuItem::scoped([ 'menu_id' => 1 ])->with('ancestors')->find(5);
- $result = $node->ancestors;
- $this->assertEquals(1, $result->count());
- $this->assertEquals(2, $result->first()->getKey());
- }
- public function testDepth()
- {
- $node = MenuItem::scoped([ 'menu_id' => 1 ])->withDepth()->where('id', '=', 5)->first();
- $this->assertEquals(1, $node->depth);
- $node = MenuItem::find(2);
- $result = $node->children()->withDepth()->get();
- $this->assertEquals(1, $result->first()->depth);
- }
- public function testSaveAsRoot()
- {
- $node = MenuItem::find(5);
- $node->saveAsRoot();
- $this->assertEquals(5, $node->getLft());
- $this->assertEquals(null, $node->parent_id);
- $this->assertOtherScopeNotAffected();
- }
- public function testInsertion()
- {
- $node = MenuItem::create([ 'menu_id' => 1, 'parent_id' => 5 ]);
- $this->assertEquals(5, $node->parent_id);
- $this->assertEquals(5, $node->getLft());
- $this->assertOtherScopeNotAffected();
- }
- public function testInsertionToParentFromOtherScope()
- {
- $this->expectException(\Illuminate\Database\Eloquent\ModelNotFoundException::class);
- $node = MenuItem::create([ 'menu_id' => 2, 'parent_id' => 5 ]);
- }
- public function testDeletion()
- {
- $node = MenuItem::find(2)->delete();
- $node = MenuItem::find(1);
- $this->assertEquals(2, $node->getRgt());
- $this->assertOtherScopeNotAffected();
- }
- public function testMoving()
- {
- $node = MenuItem::find(1);
- $this->assertTrue($node->down());
- $this->assertOtherScopeNotAffected();
- }
- protected function assertOtherScopeNotAffected()
- {
- $node = MenuItem::find(3);
- $this->assertEquals(1, $node->getLft());
- }
- // Commented, cause there is no assertion here and otherwise the test is marked as risky in PHPUnit 7.
- // What's the purpose of this method? @todo: remove/update?
- /*public function testRebuildsTree()
- {
- $data = [];
- MenuItem::scoped([ 'menu_id' => 2 ])->rebuildTree($data);
- }*/
- public function testAppendingToAnotherScopeFails()
- {
- $this->expectException(LogicException::class);
- $a = MenuItem::find(1);
- $b = MenuItem::find(3);
- $a->appendToNode($b)->save();
- }
- public function testInsertingBeforeAnotherScopeFails()
- {
- $this->expectException(LogicException::class);
- $a = MenuItem::find(1);
- $b = MenuItem::find(3);
- $a->insertAfterNode($b);
- }
- public function testEagerLoadingAncestorsWithScope()
- {
- $filteredNodes = MenuItem::where('title', 'menu item 3')->with(['ancestors'])->get();
- $this->assertEquals(2, $filteredNodes->find(5)->ancestors[0]->id);
- $this->assertEquals(4, $filteredNodes->find(6)->ancestors[0]->id);
- }
- public function testEagerLoadingDescendantsWithScope()
- {
- $filteredNodes = MenuItem::where('title', 'menu item 2')->with(['descendants'])->get();
- $this->assertEquals(5, $filteredNodes->find(2)->descendants[0]->id);
- $this->assertEquals(6, $filteredNodes->find(4)->descendants[0]->id);
- }
- }
|