test_helpers-1.0.0-alpha6/tests/src/Unit/Stub/DatabaseConnectionStubTest.php

tests/src/Unit/Stub/DatabaseConnectionStubTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\test_helpers\Unit;

use Drupal\Core\Database\ConnectionNotDefinedException;
use Drupal\Core\Database\Database;
use Drupal\Core\Database\Query\ConditionInterface;
use Drupal\Tests\UnitTestCase;
use Drupal\test_helpers\Stub\DatabaseConnectionStub\Connection;
use Drupal\test_helpers\TestHelpers;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\CoversMethod;
use PHPUnit\Framework\Attributes\Group;

/**
 * Tests DatabaseConnectionStub class.
 */
#[CoversClass(Connection::class)]
#[Group('test_helpers')]
#[CoversMethod(Connection::class, '__construct')]
#[CoversMethod(Connection::class, 'stubSetExecuteHandler')]
#[CoversMethod(Connection::class, 'select')]
#[CoversMethod(Connection::class, 'delete')]
#[CoversMethod(Connection::class, 'insert')]
#[CoversMethod(Connection::class, 'startTransaction')]
#[CoversMethod(Connection::class, 'popTransaction')]
#[CoversMethod(Connection::class, 'mockExecuteForMethod')]
#[CoversMethod(Connection::class, 'stubGetConnection')]
class DatabaseConnectionStubTest extends UnitTestCase {

  /**
   * A condition.
   *
   * @var \Drupal\Core\Database\Query\ConditionInterface
   */
  protected ConditionInterface $condition;

  /**
   * Tests the stubSetFormat method.
   */
  public function testStubSetFormat() {
    $database = TestHelpers::service('database');

    // Ensuring that these empty functions executes without exception.
    $database->startTransaction('tr1');

    // This throws an error on Drupal 9.x
    // ```
    // TypeError: Argument 1 passed to
    // Drupal\sqlite\Driver\Database\sqlite\Select::__construct()
    // must be an instance of Drupal\sqlite\Driver\Database\sqlite\Connection,
    // instance of Drupal\test_helpers\Stub\ConnectionStub given
    // ```
    // Skipping for this case.
    if (version_compare(\Drupal::VERSION, '10.0', '>=')) {
      $this->assertInstanceOf(
        \PDOStatement::class,
        $database->select('table1')->execute()
      );
      $this->assertEquals([], $database->select('table1')->execute()->fetchAll());
    }

    $this->assertEquals(Connection::STUB_RESULT_INSERTS, $database->insert('table1')->execute());
    $this->assertEquals(Connection::STUB_RESULT_DELETE, $database->delete('table1')->execute());

    $database->stubSetExecuteHandler(function () {
      return ['mockedResult'];
    });
    $this->assertEquals(['mockedResult'], $database->insert('table1')->execute());
    $this->assertEquals(['mockedResult'], $database->delete('table2')->execute());
    $this->assertEquals(['mockedResult'], $database->select('table3')->execute());

    $database->stubSetExecuteHandler(function () {
      return ['selectResult'];
    }, 'select');
    $database->stubSetExecuteHandler(function () {
      return ['insertResult'];
    }, 'insert');

    $this->assertEquals(['insertResult'], $database->insert('table1')->execute());
    $this->assertEquals(['selectResult'], $database->select('table3')->execute());
    $this->assertEquals(['mockedResult'], $database->delete('table2')->execute());

    $database->stubSetExecuteHandler(function () {
      return ['deleteResult'];
    }, 'delete');

    $this->assertEquals(['deleteResult'], $database->delete('table2')->execute());
  }

  /**
   * Tests Select function.
   */
  public function testSelect() {
    TestHelpers::service('database');
    $database = Database::getConnection();
    $database->stubSetExecuteHandler(function () {
      return 'resultAll';
    });
    $select = $database->select('my_table', 't');
    $select->condition('name', 'foo');
    $database->stubSetExecuteHandler(function () {
      return 'resultSelect';
    }, 'select');
    $database->stubSetExecuteHandler(function () {
      return $this->condition->conditions()[0]['value'];
    }, 'select');

    $result = $select->execute();

    $this->assertSame('foo', $result);
  }

  /**
   * Tests the static wrapper for Database::getConnection().
   */
  public function testStubGetConnection() {
    $connectionClassName = Connection::class;
    $connectionClassNamespace = substr($connectionClassName, 0, strrpos($connectionClassName, '\\'));
    $connectionInfo = [
      'driver' => 'test_helpers',
      'namespace' => $connectionClassNamespace,
    ];

    $connection1 = Database::getConnection();
    $this->checkConnection($connection1, 'default', 'default');
    $connection2 = Database::getConnection('default');
    $this->checkConnection($connection2, 'default', 'default');

    $target = 'default';
    $key = 'my_key1';
    TestHelpers::assertException(function () use ($target, $key) {
      Database::getConnection($target, $key);
    }, ConnectionNotDefinedException::class);
    Database::addConnectionInfo($key, $target, $connectionInfo);
    $connection = Database::getConnection($target, $key);
    $this->checkConnection($connection, $target, $key);

    $target = 'my_target1';
    $key = 'my_key1';
    // This should not throw an exception, but returns the default target with
    // the specific key.
    $connection1 = Database::getConnection($target, $key);
    $this->checkConnection($connection1, 'default', $key);

    // This case should throw an exception, because the key is not existing.
    TestHelpers::assertException(function () use ($target) {
      Database::getConnection($target, 'my_key2');
    }, ConnectionNotDefinedException::class);

    TestHelpers::service('database')->stubAddConnection($key, $target);
    $connection = Database::getConnection($target, $key);
    $this->checkConnection($connection, $target, $key);
  }

  /**
   * Asserts that the connection matches the expectations.
   *
   * @param mixed $connection
   *   A Connection instance.
   * @param mixed $target
   *   The target value.
   * @param mixed $key
   *   The key value.
   */
  private function checkConnection($connection, $target, $key = NULL) {
    $this->assertInstanceOf(Connection::class, $connection);
    $this->assertEquals($target, $connection->getTarget());
    if ($key) {
      $this->assertEquals($key, $connection->getKey());
    }

  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc