Commit fba5e54e authored by catch's avatar catch
Browse files

Issue #3312733 by benjifisher, quietone, longwave, mikelutz, smustgrave: SQL...

Issue #3312733 by benjifisher, quietone, longwave, mikelutz, smustgrave: SQL migrations cannot be instantiated if database is not available and Node, Migrate Drupal modules are enabled

(cherry picked from commit c326b923)
parent d238872a
Loading
Loading
Loading
Loading
+11 −15
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

use Drupal\Core\Database\ConnectionNotDefinedException;
use Drupal\Core\Database\Database;
use Drupal\Core\Database\DatabaseException;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\State\StateInterface;
use Drupal\migrate\Exception\RequirementsException;
@@ -182,20 +183,10 @@ public function getDatabase() {
   *   Thrown if no source database connection is configured.
   */
  protected function setUpDatabase(array $database_info) {
    if (isset($database_info['key'])) {
      $key = $database_info['key'];
    }
    else {
    // If there is no explicit database configuration at all, fall back to a
    // connection named 'migrate'.
      $key = 'migrate';
    }
    if (isset($database_info['target'])) {
      $target = $database_info['target'];
    }
    else {
      $target = 'default';
    }
    $key = $database_info['key'] ?? 'migrate';
    $target = $database_info['target'] ?? 'default';
    if (isset($database_info['database'])) {
      Database::addConnectionInfo($key, $target, $database_info['database']);
    }
@@ -220,8 +211,13 @@ protected function setUpDatabase(array $database_info) {
   */
  public function checkRequirements() {
    if ($this->pluginDefinition['requirements_met'] === TRUE) {
      try {
        $this->getDatabase();
      }
      catch (\PDOException | DatabaseException $e) {
        throw new RequirementsException("No database connection available for source plugin " . $this->pluginId, [], 0, $e);
      }
    }
  }

  /**
+6 −0
Original line number Diff line number Diff line
name: 'Migration missing database test'
type: module
package: Testing
version: VERSION
dependencies:
  - drupal:migrate
+8 −0
Original line number Diff line number Diff line
id: missing_database
label: Migration using a SQL source
source:
  plugin: migrate_missing_database_test
process: {}
destination:
  plugin: 'null'
migration_dependencies: {}
+52 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\migrate_missing_database_test\Plugin\migrate\source;

use Drupal\Core\Database\Query\SelectInterface;
use Drupal\migrate\Plugin\migrate\source\SqlBase;

/**
 * A simple migrate source for the missing database tests.
 *
 * @MigrateSource(
 *   id = "migrate_missing_database_test",
 *   source_module = "migrate_missing_database_test",
 *   requirements_met = true
 * )
 */
class MigrateMissingDatabaseSource extends SqlBase {

  /**
   * {@inheritdoc}
   */
  public function query(): SelectInterface {
    $field_names = ['id'];
    $query = $this
      ->select('missing_database', 'm')
      ->fields('m', $field_names);
    return $query;
  }

  /**
   * {@inheritdoc}
   */
  public function fields(): array {
    $fields = [
      'id' => $this->t('ID'),
    ];

    return $fields;
  }

  /**
   * {@inheritdoc}
   */
  public function getIds(): array {
    return [
      'id' => [
        'type' => 'integer',
      ],
    ];
  }

}
+58 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\migrate\Kernel;

use Drupal\Core\Database\Database;
use Drupal\KernelTests\KernelTestBase;
use Drupal\migrate\Exception\RequirementsException;
use Drupal\migrate\Plugin\MigrateIdMapInterface;
use Drupal\migrate\Plugin\MigrationInterface;

/**
 * Tests that a SQL migration can be instantiated without a database connection.
 *
 * @group migrate
 */
class MigrateMissingDatabaseTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['migrate', 'migrate_missing_database_test'];

  /**
   * The migration plugin manager.
   *
   * @var \Drupal\migrate\Plugin\MigrationPluginManager
   */
  protected $migrationPluginManager;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->migrationPluginManager = \Drupal::service('plugin.manager.migration');

    // Set the 'migrate' database connection to use a missing database.
    $info = Database::getConnectionInfo('default')['default'];
    $info['database'] = 'godot';
    Database::addConnectionInfo('migrate', 'default', $info);
  }

  /**
   * Tests a SQL migration without the database connection.
   *
   * - The migration can be instantiated.
   * - The checkRequirements() method throws a RequirementsException.
   */
  public function testMissingDatabase(): void {
    $migration = $this->migrationPluginManager->createInstance('missing_database');
    $this->assertInstanceOf(MigrationInterface::class, $migration);
    $this->assertInstanceOf(MigrateIdMapInterface::class, $migration->getIdMap());
    $this->expectException(RequirementsException::class);
    $this->expectExceptionMessage('No database connection available for source plugin migrate_missing_database_test');
    $migration->checkRequirements();
  }

}
Loading