useModelSet('cms'); parent::setUp(); $class = $this->_em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); $class->associationMappings['groups']['fetch'] = ClassMetadataInfo::FETCH_EXTRA_LAZY; $class->associationMappings['groups']['indexBy'] = 'name'; $class->associationMappings['articles']['fetch'] = ClassMetadataInfo::FETCH_EXTRA_LAZY; $class->associationMappings['articles']['indexBy'] = 'topic'; $class->associationMappings['phonenumbers']['fetch'] = ClassMetadataInfo::FETCH_EXTRA_LAZY; $class->associationMappings['phonenumbers']['indexBy'] = 'phonenumber'; $class = $this->_em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'); $class->associationMappings['users']['fetch'] = ClassMetadataInfo::FETCH_EXTRA_LAZY; $this->loadFixture(); } public function tearDown() { parent::tearDown(); $class = $this->_em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); $class->associationMappings['groups']['fetch'] = ClassMetadataInfo::FETCH_LAZY; $class->associationMappings['articles']['fetch'] = ClassMetadataInfo::FETCH_LAZY; $class->associationMappings['phonenumbers']['fetch'] = ClassMetadataInfo::FETCH_LAZY; unset($class->associationMappings['groups']['indexBy']); unset($class->associationMappings['articles']['indexBy']); unset($class->associationMappings['phonenumbers']['indexBy']); $class = $this->_em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'); $class->associationMappings['users']['fetch'] = ClassMetadataInfo::FETCH_LAZY; } /** * @group DDC-546 */ public function testCountNotInitializesCollection() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->groups->isInitialized()); $this->assertEquals(3, count($user->groups)); $this->assertFalse($user->groups->isInitialized()); foreach ($user->groups AS $group) { } $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount(), "Expecting two queries to be fired for count, then iteration."); } /** * @group DDC-546 */ public function testCountWhenNewEntityPresent() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup(); $newGroup->name = "Test4"; $user->addGroup($newGroup); $this->_em->persist($newGroup); $this->assertFalse($user->groups->isInitialized()); $this->assertEquals(4, count($user->groups)); $this->assertFalse($user->groups->isInitialized()); } /** * @group DDC-546 */ public function testCountWhenInitialized() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $queryCount = $this->getCurrentQueryCount(); foreach ($user->groups AS $group) { } $this->assertTrue($user->groups->isInitialized()); $this->assertEquals(3, count($user->groups)); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Should only execute one query to initialize collection, no extra query for count() more."); } /** * @group DDC-546 */ public function testCountInverseCollection() { $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $this->assertFalse($group->users->isInitialized(), "Pre-Condition"); $this->assertEquals(4, count($group->users)); $this->assertFalse($group->users->isInitialized(), "Extra Lazy collection should not be initialized by counting the collection."); } /** * @group DDC-546 */ public function testCountOneToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->groups->isInitialized(), "Pre-Condition"); $this->assertEquals(2, count($user->articles)); } /** * @group DDC-546 */ public function testFullSlice() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->groups->isInitialized(), "Pre-Condition: Collection is not initialized."); $someGroups = $user->groups->slice(null); $this->assertEquals(3, count($someGroups)); } /** * @group DDC-546 */ public function testSlice() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->groups->isInitialized(), "Pre-Condition: Collection is not initialized."); $queryCount = $this->getCurrentQueryCount(); $someGroups = $user->groups->slice(0, 2); $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsGroup', $someGroups); $this->assertEquals(2, count($someGroups)); $this->assertFalse($user->groups->isInitialized(), "Slice should not initialize the collection if it wasn't before!"); $otherGroup = $user->groups->slice(2, 1); $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsGroup', $otherGroup); $this->assertEquals(1, count($otherGroup)); $this->assertFalse($user->groups->isInitialized()); foreach ($user->groups AS $group) { } $this->assertTrue($user->groups->isInitialized()); $this->assertEquals(3, count($user->groups)); $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount()); } /** * @group DDC-546 */ public function testSliceInitializedCollection() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $queryCount = $this->getCurrentQueryCount(); foreach ($user->groups AS $group) { } $someGroups = $user->groups->slice(0, 2); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); $this->assertEquals(2, count($someGroups)); $this->assertTrue($user->groups->contains(array_shift($someGroups))); $this->assertTrue($user->groups->contains(array_shift($someGroups))); } /** * @group DDC-546 */ public function testSliceInverseCollection() { $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $this->assertFalse($group->users->isInitialized(), "Pre-Condition"); $queryCount = $this->getCurrentQueryCount(); $someUsers = $group->users->slice(0, 2); $otherUsers = $group->users->slice(2, 2); $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsUser', $someUsers); $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsUser', $otherUsers); $this->assertEquals(2, count($someUsers)); $this->assertEquals(2, count($otherUsers)); // +2 queries executed by slice $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount(), "Slicing two parts should only execute two additional queries."); } /** * @group DDC-546 */ public function testSliceOneToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->articles->isInitialized(), "Pre-Condition: Collection is not initialized."); $queryCount = $this->getCurrentQueryCount(); $someArticle = $user->articles->slice(0, 1); $otherArticle = $user->articles->slice(1, 1); $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount()); } /** * @group DDC-546 */ public function testContainsOneToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->articles->isInitialized(), "Pre-Condition: Collection is not initialized."); // Test One to Many existence retrieved from DB $article = $this->_em->find('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId); $queryCount = $this->getCurrentQueryCount(); $this->assertTrue($user->articles->contains($article)); $this->assertFalse($user->articles->isInitialized(), "Post-Condition: Collection is not initialized."); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); // Test One to Many existence with state new $article = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article->topic = "Testnew"; $article->text = "blub"; $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->articles->contains($article)); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Checking for contains of new entity should cause no query to be executed."); // Test One to Many existence with state clear $this->_em->persist($article); $this->_em->flush(); $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->articles->contains($article)); $this->assertEquals($queryCount+1, $this->getCurrentQueryCount(), "Checking for contains of persisted entity should cause one query to be executed."); $this->assertFalse($user->articles->isInitialized(), "Post-Condition: Collection is not initialized."); // Test One to Many existence with state managed $article = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article->topic = "How to not fail anymore on tests"; $article->text = "That is simple! Just write more tests!"; $this->_em->persist($article); $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->articles->contains($article)); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Checking for contains of managed entity (but not persisted) should cause no query to be executed."); $this->assertFalse($user->articles->isInitialized(), "Post-Condition: Collection is not initialized."); } /** * @group DDC-546 */ public function testContainsManyToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->groups->isInitialized(), "Pre-Condition: Collection is not initialized."); // Test Many to Many existence retrieved from DB $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $queryCount = $this->getCurrentQueryCount(); $this->assertTrue($user->groups->contains($group)); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Checking for contains of managed entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many existence with state new $group = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group->name = "A New group!"; $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->groups->contains($group)); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Checking for contains of new entity should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many existence with state clear $this->_em->persist($group); $this->_em->flush(); $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->groups->contains($group)); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Checking for contains of persisted entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many existence with state managed $group = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group->name = "My managed group"; $this->_em->persist($group); $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($user->groups->contains($group)); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Checking for contains of managed entity (but not persisted) should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); } /** * @group DDC-546 */ public function testContainsManyToManyInverse() { $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $this->assertFalse($group->users->isInitialized(), "Pre-Condition: Collection is not initialized."); $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $queryCount = $this->getCurrentQueryCount(); $this->assertTrue($group->users->contains($user)); $this->assertEquals($queryCount+1, $this->getCurrentQueryCount(), "Checking for contains of managed entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); $newUser = new \Doctrine\Tests\Models\CMS\CmsUser(); $newUser->name = "A New group!"; $queryCount = $this->getCurrentQueryCount(); $this->assertFalse($group->users->contains($newUser)); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Checking for contains of new entity should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); } /** * */ public function testRemoveElementOneToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->articles->isInitialized(), "Pre-Condition: Collection is not initialized."); // Test One to Many removal with Entity retrieved from DB $article = $this->_em->find('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId); $queryCount = $this->getCurrentQueryCount(); $user->articles->removeElement($article); $this->assertFalse($user->articles->isInitialized(), "Post-Condition: Collection is not initialized."); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); // Test One to Many removal with Entity state as new $article = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article->topic = "Testnew"; $article->text = "blub"; $queryCount = $this->getCurrentQueryCount(); $user->articles->removeElement($article); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Removing a new entity should cause no query to be executed."); // Test One to Many removal with Entity state as clean $this->_em->persist($article); $this->_em->flush(); $queryCount = $this->getCurrentQueryCount(); $user->articles->removeElement($article); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Removing a persisted entity should cause one query to be executed."); $this->assertFalse($user->articles->isInitialized(), "Post-Condition: Collection is not initialized."); // Test One to Many removal with Entity state as managed $article = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article->topic = "How to not fail anymore on tests"; $article->text = "That is simple! Just write more tests!"; $this->_em->persist($article); $queryCount = $this->getCurrentQueryCount(); $user->articles->removeElement($article); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Removing a managed entity should cause no query to be executed."); } /** * */ public function testRemoveElementManyToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $this->assertFalse($user->groups->isInitialized(), "Pre-Condition: Collection is not initialized."); // Test Many to Many removal with Entity retrieved from DB $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $queryCount = $this->getCurrentQueryCount(); $user->groups->removeElement($group); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Removing a persisted entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many removal with Entity state as new $group = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group->name = "A New group!"; $queryCount = $this->getCurrentQueryCount(); $user->groups->removeElement($group); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Removing new entity should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many removal with Entity state as clean $this->_em->persist($group); $this->_em->flush(); $queryCount = $this->getCurrentQueryCount(); $user->groups->removeElement($group); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Removing a persisted entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); // Test Many to Many removal with Entity state as managed $group = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group->name = "A New group!"; $this->_em->persist($group); $queryCount = $this->getCurrentQueryCount(); $user->groups->removeElement($group); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Removing a managed entity should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); } /** * */ public function testRemoveElementManyToManyInverse() { $group = $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId); $this->assertFalse($group->users->isInitialized(), "Pre-Condition: Collection is not initialized."); $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $queryCount = $this->getCurrentQueryCount(); $group->users->removeElement($user); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Removing a managed entity should cause one query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); $newUser = new \Doctrine\Tests\Models\CMS\CmsUser(); $newUser->name = "A New group!"; $queryCount = $this->getCurrentQueryCount(); $group->users->removeElement($newUser); $this->assertEquals($queryCount, $this->getCurrentQueryCount(), "Removing a new entity should cause no query to be executed."); $this->assertFalse($user->groups->isInitialized(), "Post-Condition: Collection is not initialized."); } /** * @group DDC-1399 */ public function testCountAfterAddThenFlush() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); $newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup(); $newGroup->name = "Test4"; $user->addGroup($newGroup); $this->_em->persist($newGroup); $this->assertFalse($user->groups->isInitialized()); $this->assertEquals(4, count($user->groups)); $this->assertFalse($user->groups->isInitialized()); $this->_em->flush(); $this->assertEquals(4, count($user->groups)); } /** * @group DDC-1462 */ public function testSliceOnDirtyCollection() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); /* @var $user CmsUser */ $newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup(); $newGroup->name = "Test4"; $user->addGroup($newGroup); $this->_em->persist($newGroup); $qc = $this->getCurrentQueryCount(); $groups = $user->groups->slice(0, 10); $this->assertEquals(4, count($groups)); $this->assertEquals($qc + 1, $this->getCurrentQueryCount()); } /** * @group DDC-1398 */ public function testGetIndexByIdentifier() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); /* @var $user CmsUser */ $queryCount = $this->getCurrentQueryCount(); $phonenumber = $user->phonenumbers->get($this->phonenumber); $this->assertFalse($user->phonenumbers->isInitialized()); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); $this->assertSame($phonenumber, $this->_em->find('Doctrine\Tests\Models\CMS\CmsPhonenumber', $this->phonenumber)); $article = $user->phonenumbers->get($this->phonenumber); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount(), "Getting the same entity should not cause an extra query to be executed"); } /** * @group DDC-1398 */ public function testGetIndexByOneToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); /* @var $user CmsUser */ $queryCount = $this->getCurrentQueryCount(); $article = $user->articles->get($this->topic); $this->assertFalse($user->articles->isInitialized()); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); $this->assertSame($article, $this->_em->find('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId)); } /** * @group DDC-1398 */ public function testGetIndexByManyToMany() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); /* @var $user CmsUser */ $queryCount = $this->getCurrentQueryCount(); $group = $user->groups->get($this->groupname); $this->assertFalse($user->groups->isInitialized()); $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); $this->assertSame($group, $this->_em->find('Doctrine\Tests\Models\CMS\CmsGroup', $this->groupId)); } /** * @group DDC-1398 */ public function testGetNonExistentIndexBy() { $user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId); /* @var $user CmsUser */ $this->assertNull($user->articles->get(-1)); $this->assertNull($user->groups->get(-1)); } private function loadFixture() { $user1 = new \Doctrine\Tests\Models\CMS\CmsUser(); $user1->username = "beberlei"; $user1->name = "Benjamin"; $user1->status = "active"; $user2 = new \Doctrine\Tests\Models\CMS\CmsUser(); $user2->username = "jwage"; $user2->name = "Jonathan"; $user2->status = "active"; $user3 = new \Doctrine\Tests\Models\CMS\CmsUser(); $user3->username = "romanb"; $user3->name = "Roman"; $user3->status = "active"; $user4 = new \Doctrine\Tests\Models\CMS\CmsUser(); $user4->username = "gblanco"; $user4->name = "Guilherme"; $user4->status = "active"; $this->_em->persist($user1); $this->_em->persist($user2); $this->_em->persist($user3); $this->_em->persist($user4); $group1 = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group1->name = "Test1"; $group2 = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group2->name = "Test2"; $group3 = new \Doctrine\Tests\Models\CMS\CmsGroup(); $group3->name = "Test3"; $user1->addGroup($group1); $user1->addGroup($group2); $user1->addGroup($group3); $user2->addGroup($group1); $user3->addGroup($group1); $user4->addGroup($group1); $this->_em->persist($group1); $this->_em->persist($group2); $this->_em->persist($group3); $article1 = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article1->topic = "Test1"; $article1->text = "Test1"; $article1->setAuthor($user1); $article2 = new \Doctrine\Tests\Models\CMS\CmsArticle(); $article2->topic = "Test2"; $article2->text = "Test2"; $article2->setAuthor($user1); $this->_em->persist($article1); $this->_em->persist($article2); $phonenumber1 = new \Doctrine\Tests\Models\CMS\CmsPhonenumber(); $phonenumber1->phonenumber = '12345'; $phonenumber2 = new \Doctrine\Tests\Models\CMS\CmsPhonenumber(); $phonenumber2->phonenumber = '67890'; $this->_em->persist($phonenumber1); $this->_em->persist($phonenumber2); $this->_em->flush(); $this->_em->clear(); $this->articleId = $article1->id; $this->userId = $user1->getId(); $this->groupId = $group1->id; $this->groupname = $group1->name; $this->topic = $article1->topic; $this->phonenumber = $phonenumber1->phonenumber; } }