class DatabaseEventTest

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/KernelTests/Core/Database/DatabaseEventTest.php \Drupal\KernelTests\Core\Database\DatabaseEventTest

Tests the database API events.

@group Database

Hierarchy

Expanded class hierarchy of DatabaseEventTest

File

core/tests/Drupal/KernelTests/Core/Database/DatabaseEventTest.php, line 18

Namespace

Drupal\KernelTests\Core\Database
View source
class DatabaseEventTest extends DatabaseTestBase {
  
  /**
   * Tests statement execution events.
   */
  public function testStatementExecutionEvents() : void {
    $subscriber = $this->container
      ->get(DatabaseEventSubscriber::class);
    // At first, no events have occurred, and events are not enabled.
    $this->assertSame(0, $subscriber->countStatementStarts);
    $this->assertSame(0, $subscriber->countStatementEnds);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    // Execute a query, still no events captured.
    $this->connection
      ->query('SELECT * FROM {test}');
    $this->assertSame(0, $subscriber->countStatementStarts);
    $this->assertSame(0, $subscriber->countStatementEnds);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    // Enable the statement execution start event and execute a query, start
    // event captured but no end one.
    $this->connection
      ->enableEvents([
      StatementExecutionStartEvent::class,
    ]);
    $this->connection
      ->query('SELECT * FROM {test}');
    $this->assertSame(1, $subscriber->countStatementStarts);
    $this->assertSame(0, $subscriber->countStatementEnds);
    $this->assertCount(1, $subscriber->statementIdsInExecution);
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    // Reset the statements in execution map to cleanup for following tests.
    $subscriber->statementIdsInExecution = [];
    // Enable the statement execution end event and execute a query, both
    // events captured.
    $this->connection
      ->enableEvents([
      StatementExecutionEndEvent::class,
    ]);
    $this->connection
      ->query('SELECT * FROM {test}');
    $this->assertSame(2, $subscriber->countStatementStarts);
    $this->assertSame(1, $subscriber->countStatementEnds);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    // Enable the statement execution failure event and execute a failing
    // query.
    $this->connection
      ->enableEvents([
      StatementExecutionFailureEvent::class,
    ]);
    try {
      $this->connection
        ->query('bananas on the palm tree');
      $this->fail('An exception was expected, but was not thrown');
    } catch (\Exception $e) {
      // Expected, keep going.
    }
    $this->assertSame(3, $subscriber->countStatementStarts);
    $this->assertSame(1, $subscriber->countStatementEnds);
    $this->assertSame(1, $subscriber->countStatementFailures);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionFailureEvent::class));
    // Disable all events, no more events captured.
    $this->connection
      ->disableEvents(StatementEvent::all());
    $this->connection
      ->query('SELECT * FROM {test}');
    $this->assertSame(3, $subscriber->countStatementStarts);
    $this->assertSame(1, $subscriber->countStatementEnds);
    $this->assertSame(1, $subscriber->countStatementFailures);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionFailureEvent::class));
    // Enable the statement execution end only, no events captured since the
    // start event is required before the end one can be fired.
    $this->connection
      ->enableEvents([
      StatementExecutionEndEvent::class,
    ]);
    $this->connection
      ->query('SELECT * FROM {test}');
    $this->assertSame(3, $subscriber->countStatementStarts);
    $this->assertSame(1, $subscriber->countStatementEnds);
    $this->assertEmpty($subscriber->statementIdsInExecution);
    $this->assertFalse($this->connection
      ->isEventEnabled(StatementExecutionStartEvent::class));
    $this->assertTrue($this->connection
      ->isEventEnabled(StatementExecutionEndEvent::class));
  }

}

Members

Title Sort descending Modifiers Object type Summary
DatabaseEventTest::testStatementExecutionEvents public function Tests statement execution events.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.