Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / tests / Doctrine / Tests / ORM / Functional / Ticket / DDC501Test.php
1 <?php
2 namespace Doctrine\Tests\ORM\Functional\Ticket;
3
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;
10
11 require_once __DIR__ . '/../../../TestInit.php';
12
13 /**
14  * ----------------- !! NOTE !! --------------------
15  * To reproduce the manyToMany-Bug it's necessary
16  * to cascade "merge" on cmUser::groups
17  * -------------------------------------------------
18  *
19  * @PHP-Version 5.3.2
20  * @PHPUnit-Version 3.4.11
21  *
22  * @author markus
23  */
24 class DDC501Test extends OrmFunctionalTestCase
25 {
26     protected function setUp()
27     {
28         $this->useModelSet('cms');
29         parent::setUp();
30     }
31
32     public function testMergeUnitializedManyToManyAndOneToManyCollections()
33     {
34         // Create User
35         $user = $this->createAndPersistUser();
36         $this->_em->flush();
37
38         $this->assertTrue($this->_em->contains($user));
39         $this->_em->clear();
40         $this->assertFalse($this->_em->contains($user));
41
42         unset($user);
43
44         // Reload User from DB *without* any associations (i.e. an uninitialized PersistantCollection)
45         $userReloaded = $this->loadUserFromEntityManager();
46
47         $this->assertTrue($this->_em->contains($userReloaded));
48         $this->_em->clear();
49         $this->assertFalse($this->_em->contains($userReloaded));
50
51         // freeze and unfreeze
52         $userClone = unserialize(serialize($userReloaded));
53         $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $userClone);
54
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.");
58
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.");
62
63         // Merge back and flush
64         $userClone = $this->_em->merge($userClone);
65
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');
69
70         // This works fine as long as cmUser::groups doesn't cascade "merge"
71         $this->assertEquals(2, count($userClone->getGroups()));
72
73         $this->_em->flush();
74         $this->_em->clear();
75
76         $this->assertFalse($this->_em->contains($userClone));
77
78         // Reload user from DB
79         $userFromEntityManager = $this->loadUserFromEntityManager();
80
81         //Strange: Now the phonenumbers are back again
82         $this->assertEquals(4, count($userFromEntityManager->getPhonenumbers()));
83
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()));
87     }
88
89     protected function createAndPersistUser()
90     {
91         $user = new CmsUser();
92         $user->name = 'Luka';
93         $user->username = 'lukacho';
94         $user->status = 'developer';
95
96         foreach(array(1111,2222,3333,4444) as $number) {
97             $phone = new CmsPhonenumber;
98             $phone->phonenumber = $number;
99             $user->addPhonenumber($phone);
100         }
101
102         foreach(array('Moshers', 'Headbangers') as $groupName) {
103             $group = new CmsGroup;
104             $group->setName($groupName);
105             $user->addGroup($group);
106         }
107
108         $this->_em->persist($user);
109
110         return $user;
111     }
112
113     /**
114      * @return Doctrine\Tests\Models\CMS\CmsUser
115      */
116     protected function loadUserFromEntityManager()
117     {
118         return $this->_em
119                 ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name like :name')
120                 ->setParameter('name', 'Luka')
121                 ->getSingleResult();
122     }
123
124 }