DDC501Test.php 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. namespace Doctrine\Tests\ORM\Functional\Ticket;
  3. use Doctrine\Tests\OrmFunctionalTestCase;
  4. use Doctrine\Tests\Models\CMS\CmsUser;
  5. use Doctrine\Tests\Models\CMS\CmsGroup;
  6. use Doctrine\Tests\Models\CMS\CmsPhonenumber;
  7. use Doctrine\Tests\Models\CMS\CmsAddress;
  8. use Doctrine\ORM\UnitOfWork;
  9. require_once __DIR__ . '/../../../TestInit.php';
  10. /**
  11. * ----------------- !! NOTE !! --------------------
  12. * To reproduce the manyToMany-Bug it's necessary
  13. * to cascade "merge" on cmUser::groups
  14. * -------------------------------------------------
  15. *
  16. * @PHP-Version 5.3.2
  17. * @PHPUnit-Version 3.4.11
  18. *
  19. * @author markus
  20. */
  21. class DDC501Test extends OrmFunctionalTestCase
  22. {
  23. protected function setUp()
  24. {
  25. $this->useModelSet('cms');
  26. parent::setUp();
  27. }
  28. public function testMergeUnitializedManyToManyAndOneToManyCollections()
  29. {
  30. // Create User
  31. $user = $this->createAndPersistUser();
  32. $this->_em->flush();
  33. $this->assertTrue($this->_em->contains($user));
  34. $this->_em->clear();
  35. $this->assertFalse($this->_em->contains($user));
  36. unset($user);
  37. // Reload User from DB *without* any associations (i.e. an uninitialized PersistantCollection)
  38. $userReloaded = $this->loadUserFromEntityManager();
  39. $this->assertTrue($this->_em->contains($userReloaded));
  40. $this->_em->clear();
  41. $this->assertFalse($this->_em->contains($userReloaded));
  42. // freeze and unfreeze
  43. $userClone = unserialize(serialize($userReloaded));
  44. $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $userClone);
  45. // detached user can't know about his phonenumbers
  46. $this->assertEquals(0, count($userClone->getPhonenumbers()));
  47. $this->assertFalse($userClone->getPhonenumbers()->isInitialized(), "User::phonenumbers should not be marked initialized.");
  48. // detached user can't know about his groups either
  49. $this->assertEquals(0, count($userClone->getGroups()));
  50. $this->assertFalse($userClone->getGroups()->isInitialized(), "User::groups should not be marked initialized.");
  51. // Merge back and flush
  52. $userClone = $this->_em->merge($userClone);
  53. // Back in managed world I would expect to have my phonenumbers back but they aren't!
  54. // Remember I didn't touch (and propably didn't need) them at all while in detached mode.
  55. $this->assertEquals(4, count($userClone->getPhonenumbers()), 'Phonenumbers are not available anymore');
  56. // This works fine as long as cmUser::groups doesn't cascade "merge"
  57. $this->assertEquals(2, count($userClone->getGroups()));
  58. $this->_em->flush();
  59. $this->_em->clear();
  60. $this->assertFalse($this->_em->contains($userClone));
  61. // Reload user from DB
  62. $userFromEntityManager = $this->loadUserFromEntityManager();
  63. //Strange: Now the phonenumbers are back again
  64. $this->assertEquals(4, count($userFromEntityManager->getPhonenumbers()));
  65. // This works fine as long as cmUser::groups doesn't cascade "merge"
  66. // Otherwise group memberships are physically deleted now!
  67. $this->assertEquals(2, count($userClone->getGroups()));
  68. }
  69. protected function createAndPersistUser()
  70. {
  71. $user = new CmsUser();
  72. $user->name = 'Luka';
  73. $user->username = 'lukacho';
  74. $user->status = 'developer';
  75. foreach(array(1111,2222,3333,4444) as $number) {
  76. $phone = new CmsPhonenumber;
  77. $phone->phonenumber = $number;
  78. $user->addPhonenumber($phone);
  79. }
  80. foreach(array('Moshers', 'Headbangers') as $groupName) {
  81. $group = new CmsGroup;
  82. $group->setName($groupName);
  83. $user->addGroup($group);
  84. }
  85. $this->_em->persist($user);
  86. return $user;
  87. }
  88. /**
  89. * @return Doctrine\Tests\Models\CMS\CmsUser
  90. */
  91. protected function loadUserFromEntityManager()
  92. {
  93. return $this->_em
  94. ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name like :name')
  95. ->setParameter('name', 'Luka')
  96. ->getSingleResult();
  97. }
  98. }