Mercurial > hg > isophonics-drupal-site
diff core/modules/migrate/tests/src/Unit/SqlBaseTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/migrate/tests/src/Unit/SqlBaseTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,237 @@ +<?php + +/** + * @file + * Contains \Drupal\Tests\migrate\Unit\SqlBaseTest. + */ + +namespace Drupal\Tests\migrate\Unit; + +use Drupal\migrate\Plugin\MigrationInterface; +use Drupal\migrate\Plugin\migrate\source\SqlBase; +use Drupal\Tests\UnitTestCase; + +/** + * Tests the SqlBase class. + * + * @group migrate + */ +class SqlBaseTest extends UnitTestCase { + + /** + * Tests that the ID map is joinable. + * + * @param bool $expected_result + * The expected result. + * @param bool $id_map_is_sql + * TRUE if we want getIdMap() to return an instance of Sql. + * @param bool $with_id_map + * TRUE if we want the ID map to have a valid map of IDs. + * @param array $source_options + * (optional) An array of connection options for the source connection. + * Defaults to an empty array. + * @param array $idmap_options + * (optional) An array of connection options for the ID map connection. + * Defaults to an empty array. + * + * @dataProvider sqlBaseTestProvider + */ + public function testMapJoinable($expected_result, $id_map_is_sql, $with_id_map, $source_options = [], $idmap_options = []) { + // Setup a connection object. + $source_connection = $this->getMockBuilder('Drupal\Core\Database\Connection') + ->disableOriginalConstructor() + ->getMock(); + $source_connection->expects($id_map_is_sql && $with_id_map ? $this->once() : $this->never()) + ->method('getConnectionOptions') + ->willReturn($source_options); + + // Setup the ID map connection. + $idmap_connection = $this->getMockBuilder('Drupal\Core\Database\Connection') + ->disableOriginalConstructor() + ->getMock(); + $idmap_connection->expects($id_map_is_sql && $with_id_map ? $this->once() : $this->never()) + ->method('getConnectionOptions') + ->willReturn($idmap_options); + + // Setup the Sql object. + $sql = $this->getMockBuilder('Drupal\migrate\Plugin\migrate\id_map\Sql') + ->disableOriginalConstructor() + ->getMock(); + $sql->expects($id_map_is_sql && $with_id_map ? $this->once() : $this->never()) + ->method('getDatabase') + ->willReturn($idmap_connection); + + // Setup a migration entity. + $migration = $this->getMock(MigrationInterface::class); + $migration->expects($with_id_map ? $this->once() : $this->never()) + ->method('getIdMap') + ->willReturn($id_map_is_sql ? $sql : NULL); + + // Create our SqlBase test class. + $sql_base = new TestSqlBase(); + $sql_base->setMigration($migration); + $sql_base->setDatabase($source_connection); + + // Configure the idMap to make the check in mapJoinable() pass. + if ($with_id_map) { + $sql_base->setIds([ + 'uid' => ['type' => 'integer', 'alias' => 'u'], + ]); + } + + $this->assertEquals($expected_result, $sql_base->mapJoinable()); + } + + /** + * The data provider for SqlBase. + * + * @return array + * An array of data per test run. + */ + public function sqlBaseTestProvider() { + return [ + // Source ids are empty so mapJoinable() is false. + [ + FALSE, + FALSE, + FALSE, + ], + // Still false because getIdMap() is not a subclass of Sql. + [ + FALSE, + FALSE, + TRUE, + ], + // Test mapJoinable() returns false when source and id connection options + // differ. + [ + FALSE, + TRUE, + TRUE, + ['driver' => 'mysql', 'username' => 'different_from_map', 'password' => 'different_from_map'], + ['driver' => 'mysql', 'username' => 'different_from_source', 'password' => 'different_from_source'], + ], + // Returns false because driver is pgsql and the databases are not the + // same. + [ + FALSE, + TRUE, + TRUE, + ['driver' => 'pgsql', 'database' => '1.pgsql', 'username' => 'same_value', 'password' => 'same_value'], + ['driver' => 'pgsql', 'database' => '2.pgsql', 'username' => 'same_value', 'password' => 'same_value'], + ], + // Returns false because driver is sqlite and the databases are not the + // same. + [ + FALSE, + TRUE, + TRUE, + ['driver' => 'sqlite', 'database' => '1.sqlite', 'username' => '', 'password' => ''], + ['driver' => 'sqlite', 'database' => '2.sqlite', 'username' => '', 'password' => ''], + ], + // Returns false because driver is not the same. + [ + FALSE, + TRUE, + TRUE, + ['driver' => 'pgsql', 'username' => 'same_value', 'password' => 'same_value'], + ['driver' => 'mysql', 'username' => 'same_value', 'password' => 'same_value'], + ], + ]; + } + +} + +/** + * Creates a base source class for SQL migration testing. + */ +class TestSqlBase extends SqlBase { + + /** + * The database object. + * + * @var object + */ + protected $database; + + /** + * The migration IDs. + * + * @var array + */ + protected $ids; + + /** + * Override the constructor so we can create one easily. + */ + public function __construct() {} + + /** + * Allows us to set the database during tests. + * + * @param mixed $database + * The database mock object. + */ + public function setDatabase($database) { + $this->database = $database; + } + + /** + * {@inheritdoc} + */ + public function getDatabase() { + return $this->database; + } + + /** + * Allows us to set the migration during the test. + * + * @param mixed $migration + * The migration mock. + */ + public function setMigration($migration) { + $this->migration = $migration; + } + + /** + * {@inheritdoc} + */ + public function mapJoinable() { + return parent::mapJoinable(); + } + + /** + * {@inheritdoc} + */ + public function getIds() { + return $this->ids; + } + + /** + * Allows us to set the IDs during a test. + * + * @param array $ids + * An array of identifiers. + */ + public function setIds($ids) { + $this->ids = $ids; + } + + /** + * {@inheritdoc} + */ + public function fields() {} + + /** + * {@inheritdoc} + */ + public function query() {} + + /** + * {@inheritdoc} + */ + public function calculateDependencies() { + return []; + } + +}