Issue #2264717 by penyaskito: Convert MigrateDrupal6Test into a reusable abstract class which can be reused for D7 and other migrations .

8.0.x
webchick 2014-05-12 22:04:54 -07:00
parent c040367fd1
commit 49b4f93382
2 changed files with 201 additions and 143 deletions

View File

@ -0,0 +1,100 @@
<?php
/**
* @file
* Contains \Drupal\migrate_drupal\Tests\MigrateFullDrupalTestBase.
*/
namespace Drupal\migrate_drupal\Tests;
use Drupal\migrate\MigrateExecutable;
use Drupal\simpletest\TestBase;
/**
* Test helper for running a complete Drupal migration.
*/
abstract class MigrateFullDrupalTestBase extends MigrateDrupalTestBase {
/**
* Get the dump classes required for this migration test.
*
* @return array
* The list of files containing dumps.
*/
protected abstract function getDumps();
/**
* Get the test classes that needs to be run for this test.
*
* @return array
* The list of test fully-classified class names.
*/
protected abstract function getTestClassesList();
/**
* {@inheritdoc}
*/
public function tearDown() {
// Move the results of every class under ours. This is solely for
// reporting, the filename will guide developers.
self::getDatabaseConnection()
->update('simpletest')
->fields(array('test_class' => get_class($this)))
->condition('test_id', $this->testId)
->execute();
parent::tearDown();
}
/**
* Test the complete Drupal migration.
*/
public function testDrupal() {
$dumps = $this->getDumps();
$this->loadDumps($dumps);
$classes = $this->getTestClassesList();
// Run every migration in the order specified by the storage controller.
foreach (entity_load_multiple('migration', static::$migrations) as $migration) {
(new MigrateExecutable($migration, $this))->import();
}
foreach ($classes as $class) {
$test_object = new $class($this->testId);
$test_object->databasePrefix = $this->databasePrefix;
$test_object->container = $this->container;
// run() does a lot of setup and tear down work which we don't need:
// it would setup a new database connection and wouldn't find the
// Drupal dump. Also by skipping the setUp() methods there are no id
// mappings or entities prepared. The tests run against solely migrated
// data.
foreach (get_class_methods($test_object) as $method) {
if (strtolower(substr($method, 0, 4)) == 'test') {
// Insert a fail record. This will be deleted on completion to ensure
// that testing completed.
$method_info = new \ReflectionMethod($class, $method);
$caller = array(
'file' => $method_info->getFileName(),
'line' => $method_info->getStartLine(),
'function' => $class . '->' . $method . '()',
);
$completion_check_id = TestBase::insertAssert($this->testId, $class, FALSE, 'The test did not complete due to a fatal error.', 'Completion check', $caller);
// Run the test method.
try {
$test_object->$method();
}
catch (\Exception $e) {
$this->exceptionHandler($e);
}
// Remove the completion check record.
TestBase::deleteAssert($completion_check_id);
}
}
// Add the pass/fail/exception/debug results.
foreach ($this->results as $key => &$value) {
$value += $test_object->results[$key];
}
}
}
}

View File

@ -7,14 +7,12 @@
namespace Drupal\migrate_drupal\Tests\d6;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase;
use Drupal\simpletest\TestBase;
use Drupal\migrate_drupal\Tests\MigrateFullDrupalTestBase;
/**
* Test the complete Drupal 6 migration.
*/
class MigrateDrupal6Test extends MigrateDrupalTestBase {
class MigrateDrupal6Test extends MigrateFullDrupalTestBase {
/**
* Modules to enable.
@ -49,6 +47,94 @@ class MigrateDrupal6Test extends MigrateDrupalTestBase {
'views',
);
/**
* Migrations to run in the test.
*
* @var array
*/
static $migrations = array(
'd6_action_settings',
'd6_aggregator_settings',
'd6_aggregator_feed',
'd6_aggregator_item',
'd6_block',
'd6_book_settings',
'd6_cck_field_values:*',
'd6_cck_field_revision:*',
'd6_comment',
'd6_comment_entity_display',
'd6_comment_entity_form_display',
'd6_comment_field',
'd6_comment_field_instance',
'd6_contact_category',
'd6_contact_settings',
'd6_custom_block',
'd6_date_formats',
'd6_dblog_settings',
'd6_field',
'd6_field_instance',
'd6_field_instance_widget_settings',
'd6_field_settings',
'd6_field_formatter_settings',
'd6_file_settings',
'd6_file',
'd6_filter_format',
'd6_forum_settings',
'd6_locale_settings',
'd6_menu_settings',
'd6_menu',
'd6_node_revision',
'd6_node',
'd6_node_settings',
'd6_node_type',
'd6_profile_values:user',
'd6_search_page',
'd6_search_settings',
'd6_simpletest_settings',
'd6_statistics_settings',
'd6_syslog_settings',
'd6_system_cron',
'd6_system_file',
'd6_system_filter',
'd6_system_image',
'd6_system_image_gd',
'd6_system_maintenance',
'd6_system_performance',
'd6_system_rss',
'd6_system_site',
'd6_system_theme',
'd6_taxonomy_settings',
'd6_taxonomy_term',
'd6_taxonomy_vocabulary',
'd6_term_node_revision:*',
'd6_term_node:*',
'd6_text_settings',
'd6_update_settings',
'd6_upload_entity_display',
'd6_upload_entity_form_display',
'd6_upload_field',
'd6_upload_field_instance',
'd6_upload',
'd6_url_alias',
'd6_user_mail',
'd6_user_profile_field_instance',
'd6_user_profile_entity_display',
'd6_user_profile_entity_form_display',
'd6_user_profile_field',
'd6_user_picture_entity_display',
'd6_user_picture_entity_form_display',
'd6_user_picture_field_instance',
'd6_user_picture_field',
'd6_user_picture_file',
'd6_user_role',
'd6_user',
'd6_view_modes',
'd6_vocabulary_entity_display',
'd6_vocabulary_entity_form_display',
'd6_vocabulary_field_instance',
'd6_vocabulary_field',
);
/**
* {@inheritdoc}
*/
@ -63,22 +149,7 @@ class MigrateDrupal6Test extends MigrateDrupalTestBase {
/**
* {@inheritdoc}
*/
public function tearDown() {
// Move the results of every class under ours. This is solely for
// reporting, the filename will guide developers.
self::getDatabaseConnection()
->update('simpletest')
->fields(array('test_class' => get_class($this)))
->condition('test_id', $this->testId)
->execute();
parent::tearDown();
}
/**
* Test the complete Drupal 6 migration.
*/
public function testDrupal6() {
protected function getDumps() {
$tests_path = $this->getDumpDirectory();
$dumps = array(
$tests_path . '/Drupal6ActionSettings.php',
@ -140,89 +211,14 @@ class MigrateDrupal6Test extends MigrateDrupalTestBase {
$tests_path . '/Drupal6UserRole.php',
$tests_path . '/Drupal6VocabularyField.php',
);
$this->loadDumps($dumps);
$migrations = array(
'd6_action_settings',
'd6_aggregator_settings',
'd6_aggregator_feed',
'd6_aggregator_item',
'd6_block',
'd6_book_settings',
'd6_cck_field_values:*',
'd6_cck_field_revision:*',
'd6_comment',
'd6_comment_entity_display',
'd6_comment_entity_form_display',
'd6_comment_field',
'd6_comment_field_instance',
'd6_contact_category',
'd6_contact_settings',
'd6_custom_block',
'd6_date_formats',
'd6_dblog_settings',
'd6_field',
'd6_field_instance',
'd6_field_instance_widget_settings',
'd6_field_settings',
'd6_field_formatter_settings',
'd6_file_settings',
'd6_file',
'd6_filter_format',
'd6_forum_settings',
'd6_locale_settings',
'd6_menu_settings',
'd6_menu',
'd6_node_revision',
'd6_node',
'd6_node_settings',
'd6_node_type',
'd6_profile_values:user',
'd6_search_page',
'd6_search_settings',
'd6_simpletest_settings',
'd6_statistics_settings',
'd6_syslog_settings',
'd6_system_cron',
'd6_system_file',
'd6_system_filter',
'd6_system_image',
'd6_system_image_gd',
'd6_system_maintenance',
'd6_system_performance',
'd6_system_rss',
'd6_system_site',
'd6_system_theme',
'd6_taxonomy_settings',
'd6_taxonomy_term',
'd6_taxonomy_vocabulary',
'd6_term_node_revision:*',
'd6_term_node:*',
'd6_text_settings',
'd6_update_settings',
'd6_upload_entity_display',
'd6_upload_entity_form_display',
'd6_upload_field',
'd6_upload_field_instance',
'd6_upload',
'd6_url_alias',
'd6_user_mail',
'd6_user_profile_field_instance',
'd6_user_profile_entity_display',
'd6_user_profile_entity_form_display',
'd6_user_profile_field',
'd6_user_picture_entity_display',
'd6_user_picture_entity_form_display',
'd6_user_picture_field_instance',
'd6_user_picture_field',
'd6_user_picture_file',
'd6_user_role',
'd6_user',
'd6_view_modes',
'd6_vocabulary_entity_display',
'd6_vocabulary_entity_form_display',
'd6_vocabulary_field_instance',
'd6_vocabulary_field',
);
return $dumps;
}
/**
* {@inheritdoc}
*/
protected function getTestClassesList() {
$classes = array(
__NAMESPACE__ . '\MigrateActionConfigsTest',
__NAMESPACE__ . '\MigrateAggregatorConfigsTest',
@ -305,46 +301,8 @@ class MigrateDrupal6Test extends MigrateDrupalTestBase {
__NAMESPACE__ . '\MigrateVocabularyFieldInstanceTest',
__NAMESPACE__ . '\MigrateVocabularyFieldTest',
);
// Run every migration in the order specified by the storage controller.
foreach (entity_load_multiple('migration', $migrations) as $migration) {
(new MigrateExecutable($migration, $this))->import();
}
foreach ($classes as $class) {
$test_object = new $class($this->testId);
$test_object->databasePrefix = $this->databasePrefix;
$test_object->container = $this->container;
// run() does a lot of setup and tear down work which we don't need:
// it would setup a new database connection and wouldn't find the
// Drupal 6 dump. Also by skipping the setUp() methods there are no id
// mappings or entities prepared. The tests run against solely migrated
// data.
foreach (get_class_methods($test_object) as $method) {
if (strtolower(substr($method, 0, 4)) == 'test') {
// Insert a fail record. This will be deleted on completion to ensure
// that testing completed.
$method_info = new \ReflectionMethod($class, $method);
$caller = array(
'file' => $method_info->getFileName(),
'line' => $method_info->getStartLine(),
'function' => $class . '->' . $method . '()',
);
$completion_check_id = TestBase::insertAssert($this->testId, $class, FALSE, 'The test did not complete due to a fatal error.', 'Completion check', $caller);
// Run the test method.
try {
$test_object->$method();
}
catch (\Exception $e) {
$this->exceptionHandler($e);
}
// Remove the completion check record.
TestBase::deleteAssert($completion_check_id);
}
}
// Add the pass/fail/exception/debug results.
foreach ($this->results as $key => &$value) {
$value += $test_object->results[$key];
}
}
return $classes;
}
}