Skip to content

Commit

Permalink
Merge pull request #3800 from BenMorel/finally
Browse files Browse the repository at this point in the history
Refactor FK exception tests
  • Loading branch information
morozov authored Jan 4, 2020
2 parents f37a88e + d19fa86 commit f7f1567
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 179 deletions.
179 changes: 0 additions & 179 deletions tests/Doctrine/Tests/DBAL/Functional/ExceptionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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';
Expand Down
120 changes: 120 additions & 0 deletions tests/Doctrine/Tests/DBAL/Functional/ForeignKeyExceptionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

declare(strict_types=1);

namespace Doctrine\Tests\DBAL\Functional;

use Doctrine\DBAL\Driver\ExceptionConverterDriver;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Schema\Table;
use Doctrine\Tests\DbalFunctionalTestCase;

class ForeignKeyExceptionTest extends DbalFunctionalTestCase
{
protected function setUp() : void
{
parent::setUp();

if (! $this->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'));
}
}

0 comments on commit f7f1567

Please sign in to comment.