diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 50e9cff7..7c55b1bb 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_doctrine.xml.dist b/phpunit_doctrine.xml.dist index 65bdb26e..6cd3fa98 100644 --- a/phpunit_doctrine.xml.dist +++ b/phpunit_doctrine.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_doctrine_mongodb.xml.dist b/phpunit_doctrine_mongodb.xml.dist index 6dc605cd..85f63796 100644 --- a/phpunit_doctrine_mongodb.xml.dist +++ b/phpunit_doctrine_mongodb.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_doctrine_phpcr.xml.dist b/phpunit_doctrine_phpcr.xml.dist index 9f530be0..a3edd629 100644 --- a/phpunit_doctrine_phpcr.xml.dist +++ b/phpunit_doctrine_phpcr.xml.dist @@ -21,7 +21,7 @@ verbose="true"> - + diff --git a/phpunit_eloquent.xml.dist b/phpunit_eloquent.xml.dist index 3ff3eca6..c3080884 100644 --- a/phpunit_eloquent.xml.dist +++ b/phpunit_eloquent.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_propel2.xml.dist b/phpunit_propel2.xml.dist index 153ec495..772bbf7c 100644 --- a/phpunit_propel2.xml.dist +++ b/phpunit_propel2.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_symfony.xml.dist b/phpunit_symfony.xml.dist index 1c0ef465..c9a9b629 100644 --- a/phpunit_symfony.xml.dist +++ b/phpunit_symfony.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_symfony_doctrine.xml.dist b/phpunit_symfony_doctrine.xml.dist index 6dcaa4be..1802b503 100644 --- a/phpunit_symfony_doctrine.xml.dist +++ b/phpunit_symfony_doctrine.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_symfony_eloquent.xml.dist b/phpunit_symfony_eloquent.xml.dist index ba7c29f2..8eeac6e9 100644 --- a/phpunit_symfony_eloquent.xml.dist +++ b/phpunit_symfony_eloquent.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_symfony_proxy_manager_with_doctrine.xml.dist b/phpunit_symfony_proxy_manager_with_doctrine.xml.dist index 0209d389..0c1da2d4 100644 --- a/phpunit_symfony_proxy_manager_with_doctrine.xml.dist +++ b/phpunit_symfony_proxy_manager_with_doctrine.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/phpunit_symfony_proxy_manager_with_eloquent.xml.dist b/phpunit_symfony_proxy_manager_with_eloquent.xml.dist index f8447a5b..e8e8ed88 100644 --- a/phpunit_symfony_proxy_manager_with_eloquent.xml.dist +++ b/phpunit_symfony_proxy_manager_with_eloquent.xml.dist @@ -20,7 +20,7 @@ verbose="true"> - + diff --git a/src/Bridge/Doctrine/Purger/Purger.php b/src/Bridge/Doctrine/Purger/Purger.php index da53aed7..c7fde27d 100644 --- a/src/Bridge/Doctrine/Purger/Purger.php +++ b/src/Bridge/Doctrine/Purger/Purger.php @@ -91,17 +91,17 @@ public function create(PurgeMode $mode, PurgerInterface $purger = null): PurgerI */ public function purge() { - // Because MySQL rocks, you got to disable foreign key checks when doing a TRUNCATE unlike in for example + // Because MySQL rocks, you got to disable foreign key checks when doing a TRUNCATE/DELETE unlike in for example // PostgreSQL. This ideally should be done in the Purger of doctrine/data-fixtures but meanwhile we are doing // it here. // See the progress in https://github.com/doctrine/data-fixtures/pull/272 - $truncateOrm = ( + $disableFkChecks = ( $this->purger instanceof DoctrineOrmPurger - && PurgeMode::createTruncateMode()->getValue() === $this->purgeMode->getValue() + && in_array($this->purgeMode->getValue(), [PurgeMode::createDeleteMode()->getValue(), PurgeMode::createTruncateMode()->getValue()]) && $this->purger->getObjectManager()->getConnection()->getDriver() instanceof AbstractMySQLDriver ); - if ($truncateOrm) { + if ($disableFkChecks) { $connection = $this->purger->getObjectManager()->getConnection(); $connection->exec('SET FOREIGN_KEY_CHECKS = 0;'); @@ -109,7 +109,7 @@ public function purge() $this->purger->purge(); - if ($truncateOrm && isset($connection)) { + if ($disableFkChecks && isset($connection)) { $connection->exec('SET FOREIGN_KEY_CHECKS = 1;'); } } diff --git a/tests/Bridge/Doctrine/Purger/PurgerTest.php b/tests/Bridge/Doctrine/Purger/PurgerTest.php index 77e49b81..ff8e0fcb 100644 --- a/tests/Bridge/Doctrine/Purger/PurgerTest.php +++ b/tests/Bridge/Doctrine/Purger/PurgerTest.php @@ -14,6 +14,8 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; use Doctrine\Common\DataFixtures\Purger\ORMPurger as DoctrineOrmPurger; +use Doctrine\DBAL\Driver\AbstractMySQLDriver; +use Doctrine\DBAL\Connection; use Doctrine\ORM\EntityManager; use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\Dummy; use Fidry\AliceDataFixtures\Bridge\Doctrine\ORM\FakeEntityManager; @@ -59,6 +61,30 @@ public function testCreatesADoctrineOrmPurgerWithTheAppropriateManagerAndPurgeMo $this->assertEquals(DoctrineOrmPurger::PURGE_MODE_TRUNCATE, $decoratedPurger->getPurgeMode()); } + public function testDisableFKChecksOnDeleteIsPerformed() + { + $connection = $this->prophesize(Connection::class); + $connection->getDriver()->willReturn($this->prophesize(AbstractMySQLDriver::class)->reveal()); + $connection->exec('SET FOREIGN_KEY_CHECKS = 0;')->shouldBeCalled(); + $connection->exec('SET FOREIGN_KEY_CHECKS = 1;')->shouldBeCalled(); + + $manager = $this->prophesize(EntityManager::class); + $manager->getConnection()->willReturn($connection->reveal()); + + $purgerORM = $this->prophesize(DoctrineOrmPurger::class); + $purgerORM->getObjectManager()->willReturn($manager->reveal()); + $purgerORM->purge()->shouldBeCalled(); + + $purgeMode = PurgeMode::createDeleteMode(); + $purger = new Purger($manager->reveal(), $purgeMode); + + $decoratedPurgerReflection = (new \ReflectionObject($purger))->getProperty('purger'); + $decoratedPurgerReflection->setAccessible(true); + $decoratedPurgerReflection->setValue($purger, $purgerORM->reveal()); + + $purger->purge(); + } + public function testEmptyDatabase() { /** @var EntityManager $manager */ diff --git a/vendor-bin/proxy-manager/composer.json b/vendor-bin/proxy-manager/composer.json index 5227720c..aa141d0c 100644 --- a/vendor-bin/proxy-manager/composer.json +++ b/vendor-bin/proxy-manager/composer.json @@ -14,7 +14,7 @@ "doctrine/phpcr-bundle": "^1.0", "doctrine/phpcr-odm": "^1.4", "jackalope/jackalope-doctrine-dbal": "^1.2", - "ocramius/proxy-manager": "^2.0.2", + "ocramius/proxy-manager": "^2.0.2, < 2.2.0", "psy/psysh": "^0.6", "symfony/symfony": "^3.4 || ^4.0", "theofidry/composer-inheritance-plugin": "^1.0",