diff core/modules/migrate/tests/src/Unit/MigrateSqlSourceTestCase.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/migrate/tests/src/Unit/MigrateSqlSourceTestCase.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,178 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit;
+
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ContainerNotInitializedException;
+use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
+use Drupal\Core\KeyValueStore\KeyValueStoreInterface;
+
+/**
+ * Base class for Migrate module source unit tests.
+ *
+ * @deprecated in Drupal 8.2.0, will be removed before Drupal 9.0.0. Use
+ * \Drupal\Tests\migrate\Kernel\MigrateSqlSourceTestBase instead.
+ */
+abstract class MigrateSqlSourceTestCase extends MigrateTestCase {
+
+  /**
+   * The tested source plugin.
+   *
+   * @var \Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase.
+   */
+  protected $source;
+
+  /**
+   * The database contents.
+   *
+   * Database contents represents a mocked database. It should contain an
+   * associative array with the table name as key, and as many nested arrays as
+   * the number of mocked rows. Each of those faked rows must be another array
+   * with the column name as the key and the value as the cell.
+   *
+   * @var array
+   */
+  protected $databaseContents = [];
+
+  /**
+   * The plugin class under test.
+   *
+   * The plugin system is not working during unit testing so the source plugin
+   * class needs to be manually specified.
+   *
+   * @var string
+   */
+  const PLUGIN_CLASS = '';
+
+  /**
+   * The high water mark at the beginning of the import operation.
+   *
+   * Once the migration is run, we save a mark of the migrated sources, so the
+   * migration can run again and update only new sources or changed sources.
+   *
+   * @var mixed
+   */
+  const ORIGINAL_HIGH_WATER = NULL;
+
+  /**
+   * Expected results after the source parsing.
+   *
+   * @var array
+   */
+  protected $expectedResults = [];
+
+  /**
+   * Expected count of source rows.
+   *
+   * @var int
+   */
+  protected $expectedCount = 0;
+
+  /**
+   * The source plugin instance under test.
+   *
+   * @var \Drupal\migrate\Plugin\MigrateSourceInterface
+   */
+  protected $plugin;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
+    $state = $this->getMock('Drupal\Core\State\StateInterface');
+    $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
+
+    // Mock a key-value store to return high-water values.
+    $key_value = $this->getMock(KeyValueStoreInterface::class);
+
+    // SourcePluginBase does not yet support full dependency injection so we
+    // need to make sure that \Drupal::keyValue() works as expected by mocking
+    // the keyvalue service.
+    $key_value_factory = $this->getMock(KeyValueFactoryInterface::class);
+    $key_value_factory
+      ->method('get')
+      ->with('migrate:high_water')
+      ->willReturn($key_value);
+
+    try {
+      $container = \Drupal::getContainer();
+    }
+    catch (ContainerNotInitializedException $e) {
+      $container = new ContainerBuilder();
+    }
+    $container->set('keyvalue', $key_value_factory);
+    \Drupal::setContainer($container);
+
+    $migration = $this->getMigration();
+
+    // Set the high water value.
+    \Drupal::keyValue('migrate:high_water')
+      ->expects($this->any())
+      ->method('get')
+      ->willReturn(static::ORIGINAL_HIGH_WATER);
+
+    // Setup the plugin.
+    $plugin_class = static::PLUGIN_CLASS;
+    $plugin = new $plugin_class($this->migrationConfiguration['source'], $this->migrationConfiguration['source']['plugin'], [], $migration, $state, $entity_manager);
+
+    // Do some reflection to set the database and moduleHandler.
+    $plugin_reflection = new \ReflectionClass($plugin);
+    $database_property = $plugin_reflection->getProperty('database');
+    $database_property->setAccessible(TRUE);
+    $module_handler_property = $plugin_reflection->getProperty('moduleHandler');
+    $module_handler_property->setAccessible(TRUE);
+
+    // Set the database and the module handler onto our plugin.
+    $database_property->setValue($plugin, $this->getDatabase($this->databaseContents + ['test_map' => []]));
+    $module_handler_property->setValue($plugin, $module_handler);
+
+    $plugin->setStringTranslation($this->getStringTranslationStub());
+    $migration->expects($this->any())
+      ->method('getSourcePlugin')
+      ->will($this->returnValue($plugin));
+    $this->source = $plugin;
+    $this->expectedCount = count($this->expectedResults);
+  }
+
+  /**
+   * Tests that the source returns the same rows as expected.
+   */
+  public function testRetrieval() {
+    $this->assertInstanceOf(SelectInterface::class, $this->source->query());
+    $this->queryResultTest($this->source, $this->expectedResults);
+  }
+
+  /**
+   * Tests that the source returns the row count expected.
+   */
+  public function testSourceCount() {
+    $count = $this->source->count();
+    $this->assertTrue(is_numeric($count));
+    $this->assertEquals($this->expectedCount, $count);
+  }
+
+  /**
+   * Tests the source defines a valid ID.
+   */
+  public function testSourceId() {
+    $this->assertNotEmpty($this->source->getIds());
+  }
+
+  /**
+   * Gets the value on a row for a given key.
+   *
+   * @param \Drupal\migrate\Row $row
+   *   The row identifier.
+   * @param string $key
+   *   The key identifier.
+   *
+   * @return mixed
+   *   The value on a row for a given key.
+   */
+  protected function getValue($row, $key) {
+    return $row->getSourceProperty($key);
+  }
+
+}