diff --git a/tests/unit/plugins/database/BelongsToManyModelTest.php b/tests/unit/plugins/database/BelongsToManyModelTest.php index 2c08255ed..2b2db1297 100644 --- a/tests/unit/plugins/database/BelongsToManyModelTest.php +++ b/tests/unit/plugins/database/BelongsToManyModelTest.php @@ -24,15 +24,99 @@ class BelongsToManyModelTest extends PluginTestCase $role3 = Role::create(['name' => "Manager", 'description' => "Budget"]); Model::reguard(); - // Add to collection + // Add/remove to collection $this->assertFalse($author->roles->contains($role1)); $author->roles()->add($role1); - - // TODO: Should this occur as part of add() above? - // It probably should simply refresh the relation - $author->roles->push($role1); - + $author->roles()->add($role2); $this->assertTrue($author->roles->contains($role1)); + $this->assertTrue($author->roles->contains($role2)); + + // Set by Model object + $author->roles = $role1; + $this->assertEquals(1, $author->roles->count()); + $this->assertEquals('Designer', $author->roles->first()->name); + + $author->roles = [$role1, $role2, $role3]; + $this->assertEquals(3, $author->roles->count()); + + // Set by primary key + $author->roles = $role2->id; + $this->assertEquals(1, $author->roles->count()); + $this->assertEquals('Programmer', $author->roles->first()->name); + + $author->roles = [$role2->id, $role3->id]; + $this->assertEquals(2, $author->roles->count()); + + // Nullify + $author->roles = null; + $this->assertEquals(0, $author->roles->count()); + + // Deferred in memory + $author->roles = [$role2->id, $role3->id]; + $this->assertEquals(2, $author->roles->count()); + $this->assertEquals('Programmer', $author->roles->first()->name); + } + + public function testGetRelationValue() + { + Model::unguard(); + $author = Author::create(['name' => 'Stevie', 'email' => 'stevie@email.tld']); + $role1 = Role::create(['name' => "Designer", 'description' => "Quality"]); + $role2 = Role::create(['name' => "Programmer", 'description' => "Speed"]); + Model::reguard(); + + $author->roles()->add($role1); + $author->roles()->add($role2); + + $this->assertEquals([$role1->id, $role2->id], $author->getRelationValue('roles')); + } + + public function testDeferredBinding() + { + $sessionKey = uniqid('session_key', true); + + Model::unguard(); + $author = Author::create(['name' => 'Stevie', 'email' => 'stevie@email.tld']); + $role1 = Role::create(['name' => "Designer", 'description' => "Quality"]); + $role2 = Role::create(['name' => "Programmer", 'description' => "Speed"]); + Model::reguard(); + + // Deferred add + $author->roles()->add($role1, $sessionKey); + $author->roles()->add($role2, $sessionKey); + $this->assertEmpty($author->roles); + + $this->assertEquals(0, $author->roles()->count()); + $this->assertEquals(2, $author->roles()->withDeferred($sessionKey)->count()); + + // Get simple value (implicit) + $author->reloadRelations(); + $author->sessionKey = $sessionKey; + $this->assertEquals([$role1->id, $role2->id], $author->getRelationValue('roles')); + + // Get simple value (explicit) + $relatedIds = $author->roles()->getRelatedIds($sessionKey); + $this->assertEquals([$role1->id, $role2->id], $relatedIds); + + // Commit deferred + $author->save(null, $sessionKey); + $this->assertEquals(2, $author->roles()->count()); + $this->assertEquals('Designer', $author->roles->first()->name); + + // New session + $sessionKey = uniqid('session_key', true); + + // Deferred remove + $author->roles()->remove($role1, $sessionKey); + $author->roles()->remove($role2, $sessionKey); + $this->assertEquals(2, $author->roles()->count()); + $this->assertEquals(0, $author->roles()->withDeferred($sessionKey)->count()); + $this->assertEquals('Designer', $author->roles->first()->name); + + // Commit deferred + $author->save(null, $sessionKey); + $this->assertEquals(0, $author->roles()->count()); + $this->assertEquals(0, $author->roles->count()); } public function testDetachAfterDelete()