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\Traits\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\Traits\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\Traits\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)
);
$actual_data = [];
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 static 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;
}
}
