function DriverSpecificTransactionTestBase::testTransactionManagerFailureOnPendingStackItems

Same name and namespace in other branches
  1. 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\Database

Code

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.