2 namespace Doctrine\Tests\ORM\Functional\Ticket;
4 use Doctrine\Tests\OrmFunctionalTestCase;
5 use Doctrine\Tests\Models\CMS\CmsUser;
6 use Doctrine\Tests\Models\CMS\CmsGroup;
7 use Doctrine\Tests\Models\CMS\CmsPhonenumber;
8 use Doctrine\Tests\Models\CMS\CmsAddress;
9 use Doctrine\ORM\UnitOfWork;
11 require_once __DIR__ . '/../../../TestInit.php';
14 * ----------------- !! NOTE !! --------------------
15 * To reproduce the manyToMany-Bug it's necessary
16 * to cascade "merge" on cmUser::groups
17 * -------------------------------------------------
20 * @PHPUnit-Version 3.4.11
24 class DDC501Test extends OrmFunctionalTestCase
26 protected function setUp()
28 $this->useModelSet('cms');
32 public function testMergeUnitializedManyToManyAndOneToManyCollections()
35 $user = $this->createAndPersistUser();
38 $this->assertTrue($this->_em->contains($user));
40 $this->assertFalse($this->_em->contains($user));
44 // Reload User from DB *without* any associations (i.e. an uninitialized PersistantCollection)
45 $userReloaded = $this->loadUserFromEntityManager();
47 $this->assertTrue($this->_em->contains($userReloaded));
49 $this->assertFalse($this->_em->contains($userReloaded));
51 // freeze and unfreeze
52 $userClone = unserialize(serialize($userReloaded));
53 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $userClone);
55 // detached user can't know about his phonenumbers
56 $this->assertEquals(0, count($userClone->getPhonenumbers()));
57 $this->assertFalse($userClone->getPhonenumbers()->isInitialized(), "User::phonenumbers should not be marked initialized.");
59 // detached user can't know about his groups either
60 $this->assertEquals(0, count($userClone->getGroups()));
61 $this->assertFalse($userClone->getGroups()->isInitialized(), "User::groups should not be marked initialized.");
63 // Merge back and flush
64 $userClone = $this->_em->merge($userClone);
66 // Back in managed world I would expect to have my phonenumbers back but they aren't!
67 // Remember I didn't touch (and propably didn't need) them at all while in detached mode.
68 $this->assertEquals(4, count($userClone->getPhonenumbers()), 'Phonenumbers are not available anymore');
70 // This works fine as long as cmUser::groups doesn't cascade "merge"
71 $this->assertEquals(2, count($userClone->getGroups()));
76 $this->assertFalse($this->_em->contains($userClone));
78 // Reload user from DB
79 $userFromEntityManager = $this->loadUserFromEntityManager();
81 //Strange: Now the phonenumbers are back again
82 $this->assertEquals(4, count($userFromEntityManager->getPhonenumbers()));
84 // This works fine as long as cmUser::groups doesn't cascade "merge"
85 // Otherwise group memberships are physically deleted now!
86 $this->assertEquals(2, count($userClone->getGroups()));
89 protected function createAndPersistUser()
91 $user = new CmsUser();
93 $user->username = 'lukacho';
94 $user->status = 'developer';
96 foreach(array(1111,2222,3333,4444) as $number) {
97 $phone = new CmsPhonenumber;
98 $phone->phonenumber = $number;
99 $user->addPhonenumber($phone);
102 foreach(array('Moshers', 'Headbangers') as $groupName) {
103 $group = new CmsGroup;
104 $group->setName($groupName);
105 $user->addGroup($group);
108 $this->_em->persist($user);
114 * @return Doctrine\Tests\Models\CMS\CmsUser
116 protected function loadUserFromEntityManager()
119 ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name like :name')
120 ->setParameter('name', 'Luka')