diff --git a/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php b/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php new file mode 100644 index 000000000..68904001d --- /dev/null +++ b/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php @@ -0,0 +1,8 @@ + [ + Person::class, + PhoneNumber::class, + ] + ]; + + protected function setUp() + { + $this->useModelSet('ornemental_orphan_removal'); + + parent::setUp(); + + $person = new Person; + $person->id = 'ca41a293-799f-4d68-bf79-626c3ad223ec'; + + $phone1 = new PhoneNumber; + $phone1->id = 'f4132478-c492-4dfe-aab5-a5b79ae129e7'; + $phone1->phonenumber = '123456'; + + $phone2 = new PhoneNumber; + $phone2->id = '7faa4cd3-a155-4fbf-bc42-aa4269a4454d'; + $phone2->phonenumber = '234567'; + + $phone1->person = $person; + $phone2->person = $person; + + $this->_em->persist($phone1); + $this->_em->persist($phone2); + $this->_em->persist($person); + $this->_em->flush(); + + $this->personId = $person->id; + $this->_em->clear(); + } + + public function testOrphanRemovalIsPurelyOrnemental() + { + $person = $this->_em->getReference(Person::class, $this->personId); + + $this->_em->remove($person); + $this->_em->flush(); + $this->_em->clear(); + + $query = $this->_em->createQuery( + 'SELECT u FROM Doctrine\Tests\Models\OrnementalOrphanRemoval\Person u' + ); + $result = $query->getResult(); + + $this->assertEquals(0, count($result), 'Person should be removed by EntityManager'); + + $query = $this->_em->createQuery( + 'SELECT p FROM Doctrine\Tests\Models\OrnementalOrphanRemoval\PhoneNumber p' + ); + $result = $query->getResult(); + + $this->assertEquals(2, count($result), 'Orphan removal should not kick in'); + } + + protected function _getEntityManager( + Connection $connection = null, + MappingDriver $mappingDriver = null + ) { + return parent::_getEntityManager($connection, new XmlDriver( + __DIR__.DIRECTORY_SEPARATOR.'xml' + )); + } +} diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml new file mode 100644 index 000000000..6d151af12 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml new file mode 100644 index 000000000..2e404254a --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index e9299b1c6..d45ebac63 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -3,6 +3,7 @@ namespace Doctrine\Tests; use Doctrine\Common\Cache\ArrayCache; +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver; use Doctrine\DBAL\Driver\Connection; use Doctrine\DBAL\Driver\PDOSqlite\Driver as SqliteDriver; use Doctrine\DBAL\Logging\DebugStack; @@ -488,6 +489,11 @@ abstract class OrmFunctionalTestCase extends OrmTestCase $conn->executeUpdate('DELETE FROM ddc3346_users'); } + if (isset($this->_usedModelSets['ornemental_orphan_removal'])) { + $conn->executeUpdate('DELETE FROM ornemental_orphan_removal_person'); + $conn->executeUpdate('DELETE FROM ornemental_orphan_removal_phone_number'); + } + if (isset($this->_usedModelSets['quote'])) { $conn->executeUpdate( sprintf( @@ -678,7 +684,10 @@ abstract class OrmFunctionalTestCase extends OrmTestCase * * @throws \Doctrine\ORM\ORMException */ - protected function _getEntityManager(Connection $connection = null) { + protected function _getEntityManager( + Connection $connection = null, + MappingDriver $mappingDriver = null + ) { // NOTE: Functional tests use their own shared metadata cache, because // the actual database platform used during execution has effect on some // metadata mapping behaviors (like the choice of the ID generation). @@ -732,7 +741,7 @@ abstract class OrmFunctionalTestCase extends OrmTestCase } $config->setMetadataDriverImpl( - $config->newDefaultAnnotationDriver( + $mappingDriver ?? $config->newDefaultAnnotationDriver( [ realpath(__DIR__ . '/Models/Cache'), realpath(__DIR__ . '/Models/GeoNames')