View source
<?php
namespace Drupal\KernelTests\Core\Database;
use Drupal\Core\Database\DatabaseExceptionWrapper;
class DeleteTruncateTest extends DatabaseTestBase {
public function testSubselectDelete() {
$num_records_before = $this->connection
->query('SELECT COUNT(*) FROM {test_task}')
->fetchField();
$pid_to_delete = $this->connection
->query("SELECT * FROM {test_task} WHERE [task] = 'sleep' ORDER BY [tid]")
->fetchField();
$subquery = $this->connection
->select('test', 't')
->fields('t', [
'id',
])
->condition('t.id', [
$pid_to_delete,
], 'IN');
$delete = $this->connection
->delete('test_task')
->condition('task', 'sleep')
->condition('pid', $subquery, 'IN');
$num_deleted = $delete
->execute();
$this
->assertEquals(1, $num_deleted, 'Deleted 1 record.');
$num_records_after = $this->connection
->query('SELECT COUNT(*) FROM {test_task}')
->fetchField();
$this
->assertEquals($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
}
public function testSimpleDelete() {
$num_records_before = $this->connection
->query('SELECT COUNT(*) FROM {test}')
->fetchField();
$num_deleted = $this->connection
->delete('test')
->condition('id', 1)
->execute();
$this
->assertSame(1, $num_deleted, 'Deleted 1 record.');
$num_records_after = $this->connection
->query('SELECT COUNT(*) FROM {test}')
->fetchField();
$this
->assertEquals($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
}
public function testTruncate() {
$num_records_before = $this->connection
->query("SELECT COUNT(*) FROM {test}")
->fetchField();
$this
->assertNotEmpty($num_records_before);
$this->connection
->truncate('test')
->execute();
$num_records_after = $this->connection
->query("SELECT COUNT(*) FROM {test}")
->fetchField();
$this
->assertEquals(0, $num_records_after, 'Truncate really deletes everything.');
}
public function testTruncateInTransaction() {
$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();
$this
->assertTrue($this->connection
->inTransaction());
$num_records_after = $this->connection
->select('test')
->countQuery()
->execute()
->fetchField();
$this
->assertEquals(0, $num_records_after);
$transaction = NULL;
$this
->assertFalse($this->connection
->inTransaction());
$num_records_after = $this->connection
->select('test')
->countQuery()
->execute()
->fetchField();
$this
->assertEquals(0, $num_records_after);
}
public function testTruncateTransactionRollback() {
$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();
$this
->assertTrue($this->connection
->inTransaction());
$num_records_after = $this->connection
->select('test')
->countQuery()
->execute()
->fetchField();
$this
->assertEquals(0, $num_records_after);
$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);
}
public function testSpecialColumnDelete() {
$num_records_before = $this->connection
->query('SELECT COUNT(*) FROM {select}')
->fetchField();
$num_deleted = $this->connection
->delete('select')
->condition('update', 'Update value 1')
->execute();
$this
->assertEquals(1, $num_deleted, 'Deleted 1 special column record.');
$num_records_after = $this->connection
->query('SELECT COUNT(*) FROM {select}')
->fetchField();
$this
->assertEquals($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
}
public function testDeleteFromNonExistingTable() : void {
$this
->expectException(DatabaseExceptionWrapper::class);
$this->connection
->delete('a-table-that-does-not-exist')
->execute();
}
public function testTruncateNonExistingTable() : void {
$this
->expectException(DatabaseExceptionWrapper::class);
$this->connection
->truncate('a-table-that-does-not-exist')
->execute();
}
}