function DriverSpecificTransactionTestBase::testTransactionManagerFailureOnPendingStackItems
Same name in other branches
- 11.x core/tests/Drupal/KernelTests/Core/Database/DriverSpecificTransactionTestBase.php \Drupal\KernelTests\Core\Database\DriverSpecificTransactionTestBase::testTransactionManagerFailureOnPendingStackItems()
Tests TransactionManager failure.
File
-
core/
tests/ Drupal/ KernelTests/ Core/ Database/ DriverSpecificTransactionTestBase.php, line 847
Class
- DriverSpecificTransactionTestBase
- Tests the transaction abstraction system.
Namespace
Drupal\KernelTests\Core\DatabaseCode
public function testTransactionManagerFailureOnPendingStackItems() : void {
$connectionInfo = Database::getConnectionInfo();
Database::addConnectionInfo('default', 'test_fail', $connectionInfo['default']);
$testConnection = Database::getConnection('test_fail');
// Add a fake item to the stack.
$manager = $testConnection->transactionManager();
$reflectionMethod = new \ReflectionMethod($manager, 'addStackItem');
$reflectionMethod->invoke($manager, 'bar', new StackItem('qux', StackItemType::Root));
// Ensure transaction state can be determined during object destruction.
// This is necessary for the test to pass when xdebug.mode has the 'develop'
// option enabled.
$reflectionProperty = new \ReflectionProperty(TransactionManagerBase::class, 'connectionTransactionState');
$reflectionProperty->setValue($manager, ClientConnectionTransactionState::Active);
// Ensure that __destruct() results in an assertion error. Note that this
// will normally be called by PHP during the object's destruction but Drupal
// will commit all transactions when a database is closed thereby making
// this impossible to test unless it is called directly.
try {
$manager->__destruct();
$this->fail("Expected AssertionError error not thrown");
} catch (\AssertionError $e) {
$this->assertStringStartsWith('Transaction $stack was not empty. Active stack: bar\\qux', $e->getMessage());
}
// Clean up.
$reflectionProperty = new \ReflectionProperty(TransactionManagerBase::class, 'stack');
$reflectionProperty->setValue($manager, []);
unset($testConnection);
Database::closeConnection('test_fail');
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.