X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=vendor%2Fdoctrine%2Form%2Ftests%2FDoctrine%2FTests%2FORM%2FFunctional%2FTicket%2FDDC758Test.php;fp=vendor%2Fdoctrine%2Form%2Ftests%2FDoctrine%2FTests%2FORM%2FFunctional%2FTicket%2FDDC758Test.php;h=76bb3bba84c90405fbdaaf9b350fbd5955f06854;hb=8b04b2d11798dee4f3e1358e4f43e97a6df851f6;hp=0000000000000000000000000000000000000000;hpb=73568cf05a785a45f94ca3f2351d9e07bf917958;p=zf2.biz%2Fapplication_blanche.git diff --git a/vendor/doctrine/orm/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC758Test.php b/vendor/doctrine/orm/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC758Test.php new file mode 100644 index 0000000..76bb3bb --- /dev/null +++ b/vendor/doctrine/orm/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC758Test.php @@ -0,0 +1,185 @@ +markTestSkipped('Destroys testsuite'); + $this->useModelSet("cms"); + + parent::setUp(); + } + + /** + * Helper method to set cascade to merge only + */ + private function setCascadeMergeFor($class) + { + $metadata = $this->_em->getMetadataFactory()->getMetaDataFor($class); + foreach ($metadata->associationMappings as $key => $associationMapping) { + $metadata->associationMappings[$key]["isCascadePersist"] = false; + $metadata->associationMappings[$key]["isCascadeMerge"] = true; + $metadata->associationMappings[$key]["isCascadeRemove"] = false; + $metadata->associationMappings[$key]["isCascadeDetach"] = false; + } + } + + /** + * Test that changing associations on detached entities and then cascade merging them + * causes the database to be updated with the new associations. + * This specifically tests adding new associations. + */ + public function testManyToManyMergeAssociationAdds() + { + $this->setCascadeMergeFor('Doctrine\Tests\Models\CMS\CmsUser'); + $this->setCascadeMergeFor('Doctrine\Tests\Models\CMS\CmsGroup'); + + // Put entities in the database + $cmsUser = new CmsUser(); + $cmsUser->username = "dave"; + $cmsUser->name = "Dave Keen"; + $cmsUser->status = "testing"; + + $group1 = new CmsGroup(); + $group1->name = "Group 1"; + + $group2 = new CmsGroup(); + $group2->name = "Group 2"; + + $this->_em->persist($cmsUser); + $this->_em->persist($group1); + $this->_em->persist($group2); + $this->_em->flush(); + + $cmsUserId = $cmsUser->id; + $group1Id = $group1->id; + $group2Id = $group2->id; + + $this->_em->clear(); + + // Now create detached versions of the entities with some new associations. + $cmsUser = new CmsUser(); + $cmsUser->id = $cmsUserId; + $cmsUser->username = "dave"; + $cmsUser->name = "Dave Keen"; + $cmsUser->status = "testing"; + $cmsUser->groups = new ArrayCollection(); + + $group1 = new CmsGroup(); + $group1->id = $group1Id; + $group1->name = "Group 1"; + $group1->users = new ArrayCollection(); + + $group2 = new CmsGroup(); + $group2->id = $group2Id; + $group2->name = "Group 2"; + $group2->users = new ArrayCollection(); + + $cmsUser->addGroup($group1); + $cmsUser->addGroup($group2); + + // Cascade merge of cmsUser followed by a flush should add in the birectional new many-to-many associations between the user and the groups + $this->_em->merge($cmsUser); + $this->_em->flush(); + + $this->_em->clear(); + + $cmsUsers = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')->findAll(); + $cmsGroups = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsGroup')->findAll(); + + // Check the entities are in the database + $this->assertEquals(1, sizeof($cmsUsers)); + $this->assertEquals(2, sizeof($cmsGroups)); + + // Check the associations between the entities are now in the database + $this->assertEquals(2, sizeof($cmsUsers[0]->groups)); + $this->assertEquals(1, sizeof($cmsGroups[0]->users)); + $this->assertEquals(1, sizeof($cmsGroups[1]->users)); + + $this->assertSame($cmsUsers[0]->groups[0], $cmsGroups[0]); + $this->assertSame($cmsUsers[0]->groups[1], $cmsGroups[1]); + $this->assertSame($cmsGroups[0]->users[0], $cmsUsers[0]); + $this->assertSame($cmsGroups[1]->users[0], $cmsUsers[0]); + } + + /** + * Test that changing associations on detached entities and then cascade merging them causes the + * database to be updated with the new associations. + */ + public function testManyToManyMergeAssociationRemoves() + { + $this->setCascadeMergeFor('Doctrine\Tests\Models\CMS\CmsUser'); + $this->setCascadeMergeFor('Doctrine\Tests\Models\CMS\CmsGroup'); + + $cmsUser = new CmsUser(); + $cmsUser->username = "dave"; + $cmsUser->name = "Dave Keen"; + $cmsUser->status = "testing"; + + $group1 = new CmsGroup(); + $group1->name = "Group 1"; + + $group2 = new CmsGroup(); + $group2->name = "Group 2"; + + $cmsUser->addGroup($group1); + $cmsUser->addGroup($group2); + + $this->_em->persist($cmsUser); + $this->_em->persist($group1); + $this->_em->persist($group2); + $this->_em->flush(); + + $cmsUserId = $cmsUser->id; + $group1Id = $group1->id; + $group2Id = $group2->id; + + $this->_em->clear(); + + // Now create detached versions of the entities with NO associations. + $cmsUser = new CmsUser(); + $cmsUser->id = $cmsUserId; + $cmsUser->username = "dave"; + $cmsUser->name = "Dave Keen"; + $cmsUser->status = "testing"; + $cmsUser->groups = new ArrayCollection(); + + $group1 = new CmsGroup(); + $group1->id = $group1Id; + $group1->name = "Group 1"; + $group1->users = new ArrayCollection(); + + $group2 = new CmsGroup(); + $group2->id = $group2Id; + $group2->name = "Group 2"; + $group2->users = new ArrayCollection(); + + // Cascade merge of cmsUser followed by a flush should result in the association array collection being empty + $this->_em->merge($cmsUser); + $this->_em->flush(); + + $this->_em->clear(); + + $cmsUsers = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')->findAll(); + $cmsGroups = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsGroup')->findAll(); + + // Check the entities are in the database + $this->assertEquals(1, sizeof($cmsUsers)); + $this->assertEquals(2, sizeof($cmsGroups)); + + // Check the associations between the entities are now in the database + $this->assertEquals(0, sizeof($cmsUsers[0]->groups)); + $this->assertEquals(0, sizeof($cmsGroups[0]->users)); + $this->assertEquals(0, sizeof($cmsGroups[1]->users)); + } +} \ No newline at end of file