Same filename and directory in other branches
- 8.9.x core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
- 9 core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
Namespace
Drupal\Tests\migrate_drupal_ui\Functional
File
core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
View source
<?php
declare (strict_types=1);
namespace Drupal\Tests\migrate_drupal_ui\Functional;
use Drupal\Core\Database\Database;
use Drupal\migrate\Plugin\MigrateIdMapInterface;
use Drupal\migrate_drupal\MigrationConfigurationTrait;
use Drupal\user\Entity\User;
use Drupal\Tests\BrowserTestBase;
abstract class MigrateUpgradeTestBase extends BrowserTestBase {
use MigrationConfigurationTrait;
protected $profile = 'standard';
protected $sourceDatabase;
protected $destinationSiteVersion;
protected $edits;
protected function setUp() : void {
parent::setUp();
$this
->createMigrationConnection();
$this->sourceDatabase = Database::getConnection('default', 'migrate_drupal_ui');
[
$this->destinationSiteVersion,
] = explode('.', \Drupal::VERSION, 2);
$this
->drupalLogin($this->rootUser);
}
public function submitCredentialForm() {
$this
->drupalGet('/upgrade');
$this
->submitForm([], 'Continue');
$this->edits = $this
->translatePostValues($this
->getCredentials());
$this
->submitForm($this->edits, 'Review upgrade');
}
protected function loadFixture($path) {
$default_db = Database::getConnection()
->getKey();
Database::setActiveConnection($this->sourceDatabase
->getKey());
if (str_ends_with($path, '.gz')) {
$path = 'compress.zlib://' . $path;
}
require $path;
Database::setActiveConnection($default_db);
}
protected function createMigrationConnection() {
$connection_info = Database::getConnectionInfo('default')['default'];
if ($connection_info['driver'] === 'sqlite') {
$file = $this->publicFilesDirectory . '/' . $this->testId . '-migrate.db.sqlite';
touch($file);
$connection_info['database'] = $file;
$connection_info['prefix'] = '';
}
else {
$prefix = $connection_info['prefix'];
$connection_info['prefix'] = $prefix . '0';
}
Database::addConnectionInfo('migrate_drupal_ui', 'default', $connection_info);
}
protected function tearDown() : void {
Database::removeConnection('migrate_drupal_ui');
parent::tearDown();
}
protected abstract function getSourceBasePath();
protected abstract function getEntityCounts();
protected abstract function getAvailablePaths();
protected abstract function getMissingPaths();
protected abstract function getEntityCountsIncremental();
protected function assertIdConflictForm(array $entity_types) {
$session = $this
->assertSession();
$entity_type_manager = \Drupal::service('entity_type.manager');
$session
->pageTextContains('WARNING: Content may be overwritten on your new site.');
$session
->pageTextContains('There is conflicting content of these types:');
$this
->assertNotEmpty($entity_types);
foreach ($entity_types as $entity_type) {
$label = $entity_type_manager
->getDefinition($entity_type)
->getPluralLabel();
$session
->pageTextContains($label);
}
$session
->pageTextContainsOnce('content items');
$session
->pageTextContains('Check whether there is translated content of these types:');
}
protected function assertReviewForm(array $available_paths = NULL, array $missing_paths = NULL) {
$session = $this
->assertSession();
$session
->pageTextContains('What will be upgraded?');
$available_paths = $available_paths ?? $this
->getAvailablePaths();
$missing_paths = $missing_paths ?? $this
->getMissingPaths();
foreach ($available_paths as $available) {
$session
->elementExists('xpath', "//td[contains(@class, 'checked') and text() = '{$available}']");
$session
->elementNotExists('xpath', "//td[contains(@class, 'error') and text() = '{$available}']");
}
foreach ($missing_paths as $missing) {
$session
->elementExists('xpath', "//td[contains(@class, 'error') and text() = '{$missing}']");
$session
->elementNotExists('xpath', "//td[contains(@class, 'checked') and text() = '{$missing}']");
}
$session
->elementsCount('xpath', "//td[contains(@class, 'upgrade-analysis-report__status-icon--error')]", count($missing_paths));
$session
->elementsCount('xpath', "//td[contains(@class, 'upgrade-analysis-report__status-icon--checked')]", count($available_paths));
}
protected function assertUpgrade(array $entity_counts) {
$session = $this
->assertSession();
$session
->pageTextContains(t('Congratulations, you upgraded Drupal!'));
$this
->resetAll();
$entity_definitions = array_keys(\Drupal::entityTypeManager()
->getDefinitions());
ksort($entity_counts);
$expected_count_keys = array_keys($entity_counts);
sort($entity_definitions);
$this
->assertSame($expected_count_keys, $entity_definitions);
$actual_entity_counts = [];
foreach ($entity_definitions as $entity_type) {
$actual_entity_counts[$entity_type] = (int) \Drupal::entityQuery($entity_type)
->accessCheck(FALSE)
->count()
->execute();
}
$this
->assertSame($entity_counts, $actual_entity_counts);
$plugin_manager = \Drupal::service('plugin.manager.migration');
$version = $this
->getLegacyDrupalVersion($this->sourceDatabase);
$all_migrations = $plugin_manager
->createInstancesByTag('Drupal ' . $version);
foreach ($all_migrations as $migration) {
$id_map = $migration
->getIdMap();
foreach ($id_map as $source_id => $map) {
$source_id_values = array_values(unserialize($source_id));
$row = $id_map
->getRowBySource($source_id_values);
$destination = serialize($id_map
->currentDestination());
$message = "Migration of {$source_id} to {$destination} as part of the {$migration->id()} migration. The source row status is " . $row['source_row_status'];
$this
->assertNotSame(MigrateIdMapInterface::STATUS_FAILED, $row['source_row_status'], $message);
$this
->assertNotSame(MigrateIdMapInterface::STATUS_NEEDS_UPDATE, $row['source_row_status'], $message);
}
}
}
protected function getCredentials() {
$connection_options = $this->sourceDatabase
->getConnectionOptions();
$version = $this
->getLegacyDrupalVersion($this->sourceDatabase);
$driver = $connection_options['driver'];
$drivers = Database::getDriverList()
->getInstallableList();
$form = $drivers[$driver]
->getInstallTasks()
->getFormOptions($connection_options);
$connection_options = array_intersect_key($connection_options, $form + $form['advanced_options']);
unset($connection_options['isolation_level']);
$edit = [
$driver => $connection_options,
'source_private_file_path' => $this
->getSourceBasePath(),
'version' => $version,
];
if ($version == 6) {
$edit['d6_source_base_path'] = $this
->getSourceBasePath();
}
else {
$edit['source_base_path'] = $this
->getSourceBasePath();
$edit['source_private_file_path'] = $this
->getSourcePrivateBasePath();
}
if (count($drivers) !== 1) {
$edit['driver'] = $driver;
}
return $edit;
}
public function assertUserLogIn($uid, $pass) {
$user = User::load($uid);
$user->passRaw = $pass;
$this
->drupalLogin($user);
}
protected function getSourcePrivateBasePath() {
return NULL;
}
protected function assertFileMigrations() {
$fs = \Drupal::service('file_system');
$files = $this
->getManagedFiles();
foreach ($files as $file) {
preg_match('/^(private|public|temporary):/', $file['uri'], $matches);
$scheme = $matches[1];
$filepath = $fs
->realpath($file['uri']);
if ($scheme === 'temporary') {
$this
->assertFileDoesNotExist($filepath);
}
else {
$this
->assertFileExists($filepath);
}
}
}
protected function assertEmailsSent() {
$captured_emails = \Drupal::state()
->get('system.test_mail_collector', []);
$this
->assertCount(1, $captured_emails);
$this
->assertEquals('user_status_activated', $captured_emails[0]['id']);
}
}
Classes