From d19fa868f1e7f4712ea5e16753b0dbcb0a2f68a4 Mon Sep 17 00:00:00 2001 From: Benjamin Morel Date: Mon, 30 Dec 2019 15:06:06 +0100 Subject: [PATCH] Move FK exception tests to their own class --- .../Tests/DBAL/Functional/ExceptionTest.php | 179 ------------------ .../Functional/ForeignKeyExceptionTest.php | 120 ++++++++++++ 2 files changed, 120 insertions(+), 179 deletions(-) create mode 100644 tests/Doctrine/Tests/DBAL/Functional/ForeignKeyExceptionTest.php diff --git a/tests/Doctrine/Tests/DBAL/Functional/ExceptionTest.php b/tests/Doctrine/Tests/DBAL/Functional/ExceptionTest.php index 7d41fd1e2e2..fa33203e039 100644 --- a/tests/Doctrine/Tests/DBAL/Functional/ExceptionTest.php +++ b/tests/Doctrine/Tests/DBAL/Functional/ExceptionTest.php @@ -14,7 +14,6 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Table; use Doctrine\Tests\DbalFunctionalTestCase; -use Throwable; use const PHP_OS; use function array_merge; use function assert; @@ -76,158 +75,6 @@ public function testTableExistsException() : void $schemaManager->createTable($table); } - public function testForeignKeyConstraintViolationExceptionOnInsert() : void - { - $platform = $this->connection->getDatabasePlatform(); - - if ($platform instanceof SqlitePlatform) { - $this->connection->exec('PRAGMA foreign_keys = ON'); - } elseif (! $platform->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); - } - - $this->setUpForeignKeyConstraintViolationExceptionTest(); - - try { - $this->connection->insert('constraint_error_table', ['id' => 1]); - $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->expectException(Exception\ForeignKeyConstraintViolationException::class); - - try { - $this->connection->insert('owning_table', ['id' => 2, 'constraint_id' => 2]); - } catch (Exception\ForeignKeyConstraintViolationException $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - } - - public function testForeignKeyConstraintViolationExceptionOnUpdate() : void - { - $platform = $this->connection->getDatabasePlatform(); - - if ($platform instanceof SqlitePlatform) { - $this->connection->exec('PRAGMA foreign_keys = ON'); - } elseif (! $platform->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); - } - - $this->setUpForeignKeyConstraintViolationExceptionTest(); - - try { - $this->connection->insert('constraint_error_table', ['id' => 1]); - $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->expectException(Exception\ForeignKeyConstraintViolationException::class); - - try { - $this->connection->update('constraint_error_table', ['id' => 2], ['id' => 1]); - } catch (Exception\ForeignKeyConstraintViolationException $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - } - - public function testForeignKeyConstraintViolationExceptionOnDelete() : void - { - $platform = $this->connection->getDatabasePlatform(); - - if ($platform instanceof SqlitePlatform) { - $this->connection->exec('PRAGMA foreign_keys = ON'); - } elseif (! $platform->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); - } - - $this->setUpForeignKeyConstraintViolationExceptionTest(); - - try { - $this->connection->insert('constraint_error_table', ['id' => 1]); - $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->expectException(Exception\ForeignKeyConstraintViolationException::class); - - try { - $this->connection->delete('constraint_error_table', ['id' => 1]); - } catch (Exception\ForeignKeyConstraintViolationException $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - } - - public function testForeignKeyConstraintViolationExceptionOnTruncate() : void - { - $platform = $this->connection->getDatabasePlatform(); - - if ($platform instanceof SqlitePlatform) { - $this->connection->exec('PRAGMA foreign_keys = ON'); - } elseif (! $platform->supportsForeignKeyConstraints()) { - $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); - } - - $this->setUpForeignKeyConstraintViolationExceptionTest(); - - try { - $this->connection->insert('constraint_error_table', ['id' => 1]); - $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->expectException(Exception\ForeignKeyConstraintViolationException::class); - - try { - $this->connection->executeUpdate($platform->getTruncateTableSQL('constraint_error_table')); - } catch (Exception\ForeignKeyConstraintViolationException $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } catch (Throwable $exception) { - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - - throw $exception; - } - - $this->tearDownForeignKeyConstraintViolationExceptionTest(); - } - public function testNotNullConstraintViolationException() : void { $schema = new Schema(); @@ -413,32 +260,6 @@ public static function getConnectionParams() : iterable ]; } - private function setUpForeignKeyConstraintViolationExceptionTest() : void - { - $schemaManager = $this->connection->getSchemaManager(); - - $table = new Table('constraint_error_table'); - $table->addColumn('id', 'integer', []); - $table->setPrimaryKey(['id']); - - $owningTable = new Table('owning_table'); - $owningTable->addColumn('id', 'integer', []); - $owningTable->addColumn('constraint_id', 'integer', []); - $owningTable->setPrimaryKey(['id']); - $owningTable->addForeignKeyConstraint($table, ['constraint_id'], ['id']); - - $schemaManager->createTable($table); - $schemaManager->createTable($owningTable); - } - - private function tearDownForeignKeyConstraintViolationExceptionTest() : void - { - $schemaManager = $this->connection->getSchemaManager(); - - $schemaManager->dropTable('owning_table'); - $schemaManager->dropTable('constraint_error_table'); - } - private function isLinuxRoot() : bool { return PHP_OS === 'Linux' && posix_getpwuid(posix_geteuid())['name'] === 'root'; diff --git a/tests/Doctrine/Tests/DBAL/Functional/ForeignKeyExceptionTest.php b/tests/Doctrine/Tests/DBAL/Functional/ForeignKeyExceptionTest.php new file mode 100644 index 00000000000..d537b1eac26 --- /dev/null +++ b/tests/Doctrine/Tests/DBAL/Functional/ForeignKeyExceptionTest.php @@ -0,0 +1,120 @@ +connection->getDriver() instanceof ExceptionConverterDriver) { + $this->markTestSkipped('Driver does not support special exception handling.'); + } + + $schemaManager = $this->connection->getSchemaManager(); + + $table = new Table('constraint_error_table'); + $table->addColumn('id', 'integer', []); + $table->setPrimaryKey(['id']); + + $owningTable = new Table('owning_table'); + $owningTable->addColumn('id', 'integer', []); + $owningTable->addColumn('constraint_id', 'integer', []); + $owningTable->setPrimaryKey(['id']); + $owningTable->addForeignKeyConstraint($table, ['constraint_id'], ['id']); + + $schemaManager->createTable($table); + $schemaManager->createTable($owningTable); + } + + protected function tearDown() : void + { + parent::tearDown(); + + $schemaManager = $this->connection->getSchemaManager(); + + $schemaManager->dropTable('owning_table'); + $schemaManager->dropTable('constraint_error_table'); + } + + public function testForeignKeyConstraintViolationExceptionOnInsert() : void + { + $platform = $this->connection->getDatabasePlatform(); + + if ($platform instanceof SqlitePlatform) { + $this->connection->exec('PRAGMA foreign_keys = ON'); + } elseif (! $platform->supportsForeignKeyConstraints()) { + $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); + } + + $this->connection->insert('constraint_error_table', ['id' => 1]); + $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); + + $this->expectException(Exception\ForeignKeyConstraintViolationException::class); + + $this->connection->insert('owning_table', ['id' => 2, 'constraint_id' => 2]); + } + + public function testForeignKeyConstraintViolationExceptionOnUpdate() : void + { + $platform = $this->connection->getDatabasePlatform(); + + if ($platform instanceof SqlitePlatform) { + $this->connection->exec('PRAGMA foreign_keys = ON'); + } elseif (! $platform->supportsForeignKeyConstraints()) { + $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); + } + + $this->connection->insert('constraint_error_table', ['id' => 1]); + $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); + + $this->expectException(Exception\ForeignKeyConstraintViolationException::class); + + $this->connection->update('constraint_error_table', ['id' => 2], ['id' => 1]); + } + + public function testForeignKeyConstraintViolationExceptionOnDelete() : void + { + $platform = $this->connection->getDatabasePlatform(); + + if ($platform instanceof SqlitePlatform) { + $this->connection->exec('PRAGMA foreign_keys = ON'); + } elseif (! $platform->supportsForeignKeyConstraints()) { + $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); + } + + $this->connection->insert('constraint_error_table', ['id' => 1]); + $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); + + $this->expectException(Exception\ForeignKeyConstraintViolationException::class); + + $this->connection->delete('constraint_error_table', ['id' => 1]); + } + + public function testForeignKeyConstraintViolationExceptionOnTruncate() : void + { + $platform = $this->connection->getDatabasePlatform(); + + if ($platform instanceof SqlitePlatform) { + $this->connection->exec('PRAGMA foreign_keys = ON'); + } elseif (! $platform->supportsForeignKeyConstraints()) { + $this->markTestSkipped('Only fails on platforms with foreign key constraints.'); + } + + $this->connection->insert('constraint_error_table', ['id' => 1]); + $this->connection->insert('owning_table', ['id' => 1, 'constraint_id' => 1]); + + $this->expectException(Exception\ForeignKeyConstraintViolationException::class); + + $this->connection->executeUpdate($platform->getTruncateTableSQL('constraint_error_table')); + } +}