Unverified Commit b23ee08a authored by alexpott's avatar alexpott

Issue #2868273 by mondrake, borisson_: Missing a test for table TRUNCATE while in transaction

parent 567a4c11
......@@ -2,6 +2,8 @@
namespace Drupal\KernelTests\Core\Database;
use Drupal\Core\Database\Database;
/**
* Tests delete and truncate queries.
*
......@@ -17,6 +19,21 @@
*/
class DeleteTruncateTest extends DatabaseTestBase {
/**
* The database connection for testing.
*
* @var \Drupal\Core\Database\Connection
*/
protected $connection;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->connection = Database::getConnection();
}
/**
* Confirms that we can use a subselect in a delete successfully.
*/
......@@ -66,6 +83,84 @@ public function testTruncate() {
$this->assertEqual(0, $num_records_after, 'Truncate really deletes everything.');
}
/**
* Confirms that we can truncate a whole table while in transaction.
*/
public function testTruncateInTransaction() {
// This test won't work right if transactions are not supported.
if (!$this->connection->supportsTransactions()) {
$this->markTestSkipped('The database driver does not support transactions.');
}
$num_records_before = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertGreaterThan(0, $num_records_before, 'The table is not empty.');
$transaction = $this->connection->startTransaction('test_truncate_in_transaction');
$this->connection->insert('test')
->fields([
'name' => 'Freddie',
'age' => 45,
'job' => 'Great singer',
])
->execute();
$num_records_after_insert = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals($num_records_before + 1, $num_records_after_insert);
$this->connection->truncate('test')->execute();
// Checks that there are no records left in the table, and transaction is
// still active.
$this->assertTrue($this->connection->inTransaction());
$num_records_after = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals(0, $num_records_after);
// Close the transaction, and check that there are still no records in the
// table.
$transaction = NULL;
$this->assertFalse($this->connection->inTransaction());
$num_records_after = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals(0, $num_records_after);
}
/**
* Confirms that transaction rollback voids a truncate operation.
*/
public function testTruncateTransactionRollback() {
// This test won't work right if transactions are not supported.
if (!$this->connection->supportsTransactions()) {
$this->markTestSkipped('The database driver does not support transactions.');
}
$num_records_before = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertGreaterThan(0, $num_records_before, 'The table is not empty.');
$transaction = $this->connection->startTransaction('test_truncate_in_transaction');
$this->connection->insert('test')
->fields([
'name' => 'Freddie',
'age' => 45,
'job' => 'Great singer',
])
->execute();
$num_records_after_insert = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals($num_records_before + 1, $num_records_after_insert);
$this->connection->truncate('test')->execute();
// Checks that there are no records left in the table, and transaction is
// still active.
$this->assertTrue($this->connection->inTransaction());
$num_records_after = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals(0, $num_records_after);
// Roll back the transaction, and check that we are back to status before
// insert and truncate.
$this->connection->rollBack();
$this->assertFalse($this->connection->inTransaction());
$num_records_after = $this->connection->select('test')->countQuery()->execute()->fetchField();
$this->assertEquals($num_records_before, $num_records_after);
}
/**
* Confirms that we can delete a single special column name record successfully.
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment