migmag-1.0.x-dev/tests/src/Kernel/MigMagMigrationTestDatabaseTraitTest.php

tests/src/Kernel/MigMagMigrationTestDatabaseTraitTest.php
<?php

namespace Drupal\Tests\migmag\Kernel;

use Drupal\Core\Database\Connection;
use Drupal\Core\Database\Database;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\migmag\Traits\MigMagMigrationTestDatabaseTrait;

/**
 * Tests MigMagMigrationTestDatabaseTrait.
 *
 * @coversDefaultClass \Drupal\Tests\migmag\Traits\MigMagMigrationTestDatabaseTrait
 *
 * @group migmag
 */
class MigMagMigrationTestDatabaseTraitTest extends KernelTestBase {

  /**
   * Tests source connection creation.
   *
   * @param string|null $migrate_connection_key
   *   The connection key argument to pass to the tested method.
   * @param bool $with_write_settings_method
   *   Whether the test class using MigMagMigrationTestDatabaseTrait should
   *   have a writeSettings method or not. See
   *   \Drupal\Core\Test\FunctionalTestSetupTrait::writeSettings.
   *
   * @covers \Drupal\Tests\migmag\Kernel\MigMagMigrationTestDatabaseTrait::createSourceMigrationConnection
   *
   * @dataProvider providerCreateSourceMigrationConnection
   */
  public function testCreateSourceMigrationConnection($migrate_connection_key, bool $with_write_settings_method): void {
    $test_class = $with_write_settings_method
      ? new TestMigMagMigrationTestDatabaseClassWithWrite()
      : new TestMigMagMigrationTestDatabaseClass();
    $expected_connection_key = $migrate_connection_key ?? 'migrate';

    $this->assertNull(Database::getConnectionInfo($migrate_connection_key));

    if ($migrate_connection_key) {
      $test_class->createSourceMigrationConnection($migrate_connection_key);
    }
    else {
      $test_class->createSourceMigrationConnection();
    }

    $connection_info_after = Database::getConnectionInfo($expected_connection_key);
    $actual_prefix = is_array($connection_info_after['default']['prefix'])
      ? $connection_info_after['default']['prefix']['default']
      : $connection_info_after['default']['prefix'];
    $this->assertSame($this->databasePrefix . '0', $actual_prefix);
    $this->assertInstanceOf(Connection::class, Database::getConnection('default', $expected_connection_key));
    if ($test_class instanceof TestMigMagMigrationTestDatabaseClassWithWrite) {
      $this->assertEquals(
        $expected_connection_key . "']['default",
        array_keys($test_class->getWritten()['databases'])[0]
      );
    }

    if ($expected_connection_key !== 'migrate') {
      $this->assertSame('migmag.test_db', \Drupal::state()->get('migrate.fallback_state_key'));
      $this->assertEquals(
        [
          'key' => $expected_connection_key,
          'target' => 'default',
        ],
        \Drupal::state()->get('migmag.test_db')
      );
    }
  }

  /**
   * Tests source connection cleanup.
   *
   * @param string|null $migrate_connection_key
   *   The connection key argument to pass to the tested method.
   *
   * @covers \Drupal\Tests\migmag\Kernel\MigMagMigrationTestDatabaseTrait::cleanupSourceMigrateConnection
   *
   * @dataProvider providerCleanupSourceMigrateConnection
   */
  public function testCleanupSourceMigrateConnection($migrate_connection_key): void {
    $test_class = new TestMigMagMigrationTestDatabaseClass();
    $expected_connection_key = $migrate_connection_key ?? 'migrate';
    $test_class->createSourceMigrationConnection($expected_connection_key);

    $this->assertIsArray(Database::getConnectionInfo($expected_connection_key)['default']);

    if ($migrate_connection_key) {
      $test_class->cleanupSourceMigrateConnection($migrate_connection_key);
    }
    else {
      $test_class->cleanupSourceMigrateConnection();
    }

    $connection_info_after = Database::getConnectionInfo($expected_connection_key);
    $this->assertNull($connection_info_after);
  }

  /**
   * Data provider for ::testCleanupSourceMigrateConnection.
   *
   * @return array[]
   *   The test cases.
   */
  public static function providerCleanupSourceMigrateConnection(): array {
    return [
      'No arg' => [
        'migrate_connection_key' => NULL,
      ],
      'Key: migrate' => [
        'migrate_connection_key' => 'migrate',
      ],
      'Key: foo_bar_baz' => [
        'migrate_connection_key' => 'foo_bar_baz',
      ],
    ];
  }

  /**
   * Data provider for ::testCreateSourceMigrationConnection.
   *
   * @return array[]
   *   The test cases.
   */
  public static function providerCreateSourceMigrationConnection(): array {
    $cleanup_cases = static::providerCleanupSourceMigrateConnection();
    $create_cases = [];
    foreach ($cleanup_cases as $label => $test_case) {
      $create_cases[$label] = $test_case + [
        'with_write_settings_method' => FALSE,
      ];
      $create_cases[$label . " with write"] = $test_case + [
        'with_write_settings_method' => TRUE,
      ];
    }
    return $create_cases;
  }

  /**
   * Tests how data gets imported into the source database.
   *
   * @param array[] $db_to_import
   *   The source data to import, keyed by table name. Each table is an array
   *   containing the rows in that table.
   * @param array|null $expected_data
   *   The expected data if it differs from the original. Defaults to NULL.
   *
   * @covers \Drupal\Tests\migmag\Kernel\MigMagMigrationTestDatabaseTrait::importSourceDatabase
   *
   * @dataProvider providerImportSourceDatabase
   */
  public function testImportSourceDatabase(array $db_to_import, ?array $expected_data = NULL): void {
    $test_class = new TestMigMagMigrationTestDatabaseClass();
    $test_class->createSourceMigrationConnection('migmag_test');
    $test_class->sourceDatabase = Database::getConnection('default', 'migmag_test');

    $test_class->importSourceDatabase($db_to_import);

    $expected_tables = array_keys($expected_data ?? $db_to_import);
    $actual_tables = $test_class->sourceDatabase->schema()->findTables('%');
    sort($expected_tables);
    sort($actual_tables);
    $this->assertEquals(
      array_values($expected_tables),
      array_values($actual_tables)
    );

    foreach ($expected_tables as $table) {
      $actual_data[$table] = $test_class->sourceDatabase
        ->select($table, $table)
        ->fields($table)
        ->execute()
        ->fetchAll(\PDO::FETCH_ASSOC);
    }

    $this->assertEquals($actual_data, $expected_data ?? $db_to_import);
  }

  /**
   * Data provider for ::testImportSourceDatabase.
   *
   * @return array[]
   *   The test cases.
   */
  public function providerImportSourceDatabase(): array {
    return [
      'Two tables with some rows' => [
        'db_to_import' => [
          'foobar' => [
            ['string_col' => 'foo', 'int_col' => 10],
            ['string_col' => 'bar', 'int_col' => 2],
          ],
          'bar' => [
            ['id' => 'baz'],
          ],
        ],
      ],
      'Key order does not matter' => [
        'db_to_import' => [
          'foobar' => [
            ['string_col' => 'foo', 'int_col' => 10],
            ['int_col' => 2, 'string_col' => 'bar'],
          ],
        ],
      ],
      'A row contains more columns than the others' => [
        'db_to_import' => [
          'foobar' => [
            ['foo_col' => 'foo', 'int_col' => 10],
            ['foo_col' => 'bar', 'int_col' => 2, 'o1' => 10, 'o2' => '5'],
            ['foo_col' => 'baz', 'int_col' => 800, 'o2' => 60],
          ],
        ],
        'expected_data' => [
          'foobar' => [
            ['foo_col' => 'foo', 'int_col' => 10, 'o1' => NULL, 'o2' => NULL],
            ['foo_col' => 'bar', 'int_col' => 2, 'o1' => 10, 'o2' => '5'],
            ['foo_col' => 'baz', 'int_col' => 800, 'o1' => NULL, 'o2' => 60],
          ],
        ],
      ],
    ];
  }

}

/**
 * Test class using MigMagMigrationTestDatabaseTrait without ::writeSettings.
 */
class TestMigMagMigrationTestDatabaseClass {

  use MigMagMigrationTestDatabaseTrait {
    createSourceMigrationConnection as public;
    cleanupSourceMigrateConnection as public;
    importSourceDatabase as public;
  }

  /**
   * A source DB connection.
   *
   * @var \Drupal\Core\Database\Connection
   */
  public $sourceDatabase;

}

/**
 * Test class using MigMagMigrationTestDatabaseTrait with ::writeSettings.
 */
class TestMigMagMigrationTestDatabaseClassWithWrite extends TestMigMagMigrationTestDatabaseClass {

  /**
   * Whether writeSettings method was called.
   *
   * @var mixed|null
   */
  protected static $written;

  /**
   * A test writeSettings method.
   *
   * @param mixed $thing
   *   A thing to write.
   */
  protected function writeSettings($thing): void {
    self::$written = $thing;
  }

  /**
   * A test writeSettings method.
   */
  public function getWritten() {
    return self::$written;
  }

}

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

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