3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\CMS\CmsUser;
6 use Doctrine\Tests\Models\CMS\CmsPhonenumber;
7 use Doctrine\Tests\Models\CMS\CmsAddress;
8 use Doctrine\Tests\Models\CMS\CmsArticle;
9 use Doctrine\ORM\UnitOfWork;
11 require_once __DIR__ . '/../../TestInit.php';
14 * Description of DetachedEntityTest
18 class DetachedEntityTest extends \Doctrine\Tests\OrmFunctionalTestCase
20 protected function setUp() {
21 $this->useModelSet('cms');
25 public function testSimpleDetachMerge() {
27 $user->name = 'Roman';
28 $user->username = 'romanb';
29 $user->status = 'dev';
30 $this->_em->persist($user);
34 // $user is now detached
36 $this->assertFalse($this->_em->contains($user));
38 $user->name = 'Roman B.';
40 //$this->assertEquals(UnitOfWork::STATE_DETACHED, $this->_em->getUnitOfWork()->getEntityState($user));
42 $user2 = $this->_em->merge($user);
44 $this->assertFalse($user === $user2);
45 $this->assertTrue($this->_em->contains($user2));
46 $this->assertEquals('Roman B.', $user2->name);
49 public function testSerializeUnserializeModifyMerge()
51 //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
53 $user->name = 'Guilherme';
54 $user->username = 'gblanco';
55 $user->status = 'developer';
57 $ph1 = new CmsPhonenumber;
58 $ph1->phonenumber = "1234";
59 $user->addPhonenumber($ph1);
61 $this->_em->persist($user);
63 $this->assertTrue($this->_em->contains($user));
64 $this->assertTrue($user->phonenumbers->isInitialized());
66 $serialized = serialize($user);
68 $this->assertFalse($this->_em->contains($user));
71 $user = unserialize($serialized);
73 $this->assertEquals(1, count($user->getPhonenumbers()), "Pre-Condition: 1 Phonenumber");
75 $ph2 = new CmsPhonenumber;
76 $ph2->phonenumber = "56789";
77 $user->addPhonenumber($ph2);
78 $oldPhonenumbers = $user->getPhonenumbers();
79 $this->assertEquals(2, count($oldPhonenumbers), "Pre-Condition: 2 Phonenumbers");
80 $this->assertFalse($this->_em->contains($user));
82 $this->_em->persist($ph2);
85 $user = $this->_em->merge($user); // merge cascaded to phonenumbers
86 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $user->phonenumbers[0]->user);
87 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $user->phonenumbers[1]->user);
88 $im = $this->_em->getUnitOfWork()->getIdentityMap();
91 $this->assertTrue($this->_em->contains($user), "Failed to assert that merged user is contained inside EntityManager persistence context.");
92 $phonenumbers = $user->getPhonenumbers();
93 $this->assertNotSame($oldPhonenumbers, $phonenumbers, "Merge should replace the Detached Collection with a new PersistentCollection.");
94 $this->assertEquals(2, count($phonenumbers), "Failed to assert that two phonenumbers are contained in the merged users phonenumber collection.");
96 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $phonenumbers[1]);
97 $this->assertTrue($this->_em->contains($phonenumbers[1]), "Failed to assert that second phonenumber in collection is contained inside EntityManager persistence context.");
99 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $phonenumbers[0]);
100 $this->assertTrue($this->_em->getUnitOfWork()->isInIdentityMap($phonenumbers[0]));
101 $this->assertTrue($this->_em->contains($phonenumbers[0]), "Failed to assert that first phonenumber in collection is contained inside EntityManager persistence context.");
107 public function testDetachedEntityThrowsExceptionOnFlush()
109 $ph = new CmsPhonenumber();
110 $ph->phonenumber = '12345';
111 $this->_em->persist($ph);
114 $this->_em->persist($ph);
118 } catch (\Exception $expected) {}
121 public function testUninitializedLazyAssociationsAreIgnoredOnMerge()
124 $user->name = 'Guilherme';
125 $user->username = 'gblanco';
126 $user->status = 'developer';
128 $address = new CmsAddress;
129 $address->city = 'Berlin';
130 $address->country = 'Germany';
131 $address->street = 'Sesamestreet';
132 $address->zip = 12345;
133 $address->setUser($user);
134 $this->_em->persist($address);
135 $this->_em->persist($user);
140 $address2 = $this->_em->find(get_class($address), $address->id);
141 $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $address2->user);
142 $this->assertFalse($address2->user->__isInitialized__);
143 $detachedAddress2 = unserialize(serialize($address2));
144 $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $detachedAddress2->user);
145 $this->assertFalse($detachedAddress2->user->__isInitialized__);
147 $managedAddress2 = $this->_em->merge($detachedAddress2);
148 $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $managedAddress2->user);
149 $this->assertFalse($managedAddress2->user === $detachedAddress2->user);
150 $this->assertFalse($managedAddress2->user->__isInitialized__);
156 public function testUseDetachedEntityAsQueryParameter()
159 $user->name = 'Guilherme';
160 $user->username = 'gblanco';
161 $user->status = 'developer';
163 $this->_em->persist($user);
166 $this->_em->detach($user);
168 $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1";
169 $query = $this->_em->createQuery($dql);
170 $query->setParameter(1, $user);
172 $newUser = $query->getSingleResult();
174 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $newUser);
175 $this->assertEquals('gblanco', $newUser->username);
181 public function testDetachManagedUnpersistedEntity()
184 $user->name = 'Guilherme';
185 $user->username = 'gblanco';
186 $user->status = 'developer';
188 $this->_em->persist($user);
189 $this->_em->detach($user);
193 $this->assertFalse($this->_em->contains($user));
194 $this->assertFalse($this->_em->getUnitOfWork()->isInIdentityMap($user));
200 public function testMergeArticleWrongVersion()
202 $article = new CmsArticle();
203 $article->topic = "test";
204 $article->text = "test";
206 $this->_em->persist($article);
209 $this->_em->detach($article);
211 $sql = "UPDATE cms_articles SET version = version+1 WHERE id = " . $article->id;
212 $this->_em->getConnection()->executeUpdate($sql);
214 $this->setExpectedException('Doctrine\ORM\OptimisticLockException', 'The optimistic lock failed, version 1 was expected, but is actually 2');
215 $this->_em->merge($article);