class MigrationProvidersExistTest

Same name and namespace in other branches
  1. 11.x core/modules/migrate_drupal/tests/src/Kernel/Plugin/MigrationProvidersExistTest.php \Drupal\Tests\migrate_drupal\Kernel\Plugin\MigrationProvidersExistTest
  2. 10 core/modules/migrate/tests/src/Kernel/Plugin/MigrationProvidersExistTest.php \Drupal\Tests\migrate\Kernel\Plugin\MigrationProvidersExistTest
  3. 8.9.x core/modules/migrate/tests/src/Kernel/Plugin/MigrationProvidersExistTest.php \Drupal\Tests\migrate\Kernel\Plugin\MigrationProvidersExistTest

Tests that modules exist for all source and destination plugins.

@group migrate_drupal_ui

Hierarchy

Expanded class hierarchy of MigrationProvidersExistTest

File

core/modules/migrate/tests/src/Kernel/Plugin/MigrationProvidersExistTest.php, line 17

Namespace

Drupal\Tests\migrate\Kernel\Plugin
View source
class MigrationProvidersExistTest extends MigrateDrupalTestBase {
  use FileSystemModuleDiscoveryDataProviderTrait;
  
  /**
   * Tests that a missing source_module property raises an exception.
   */
  public function testSourceProvider() {
    $this->enableModules([
      'migration_provider_test',
    ]);
    $this->expectException(BadPluginDefinitionException::class);
    $this->expectExceptionMessage('The no_source_module plugin must define the source_module property.');
    $this->container
      ->get('plugin.manager.migration')
      ->getDefinition('migration_provider_no_annotation');
  }
  
  /**
   * Tests that modules exist for all source plugins.
   */
  public function testProvidersExist() {
    $this->enableAllModules();
    /** @var \Drupal\migrate\Plugin\MigrateSourcePluginManager $plugin_manager */
    $plugin_manager = $this->container
      ->get('plugin.manager.migrate.source');
    foreach ($plugin_manager->getDefinitions() as $definition) {
      $id = $definition['id'];
      $this->assertArrayHasKey('source_module', $definition, "No source_module property in '{$id}'");
    }
  }
  
  /**
   * Enable all available modules.
   */
  protected function enableAllModules() {
    // Install all available modules.
    $module_handler = $this->container
      ->get('module_handler');
    $modules = $this->coreModuleListDataProvider();
    $modules_enabled = $module_handler->getModuleList();
    $modules_to_enable = array_keys(array_diff_key($modules, $modules_enabled));
    $this->enableModules($modules_to_enable);
  }
  
  /**
   * Tests that modules exist for all field plugins.
   */
  public function testFieldProvidersExist() {
    $expected_mappings = [
      'userreference' => [
        'source_module' => 'userreference',
        'destination_module' => 'core',
      ],
      'nodereference' => [
        'source_module' => 'nodereference',
        'destination_module' => 'core',
      ],
      'optionwidgets' => [
        'source_module' => 'optionwidgets',
        'destination_module' => 'options',
      ],
      'list' => [
        'source_module' => 'list',
        'destination_module' => 'options',
      ],
      'options' => [
        'source_module' => 'options',
        'destination_module' => 'options',
      ],
      'filefield' => [
        'source_module' => 'filefield',
        'destination_module' => 'file',
      ],
      'imagefield' => [
        'source_module' => 'imagefield',
        'destination_module' => 'image',
      ],
      'file' => [
        'source_module' => 'file',
        'destination_module' => 'file',
      ],
      'image' => [
        'source_module' => 'image',
        'destination_module' => 'image',
      ],
      'phone' => [
        'source_module' => 'phone',
        'destination_module' => 'telephone',
      ],
      'telephone' => [
        'source_module' => 'telephone',
        'destination_module' => 'telephone',
      ],
      'link' => [
        'source_module' => 'link',
        'destination_module' => 'link',
      ],
      'link_field' => [
        'source_module' => 'link',
        'destination_module' => 'link',
      ],
      'd6_text' => [
        'source_module' => 'text',
        'destination_module' => 'text',
      ],
      'd7_text' => [
        'source_module' => 'text',
        'destination_module' => 'text',
      ],
      'taxonomy_term_reference' => [
        'source_module' => 'taxonomy',
        'destination_module' => 'core',
      ],
      'date' => [
        'source_module' => 'date',
        'destination_module' => 'datetime',
      ],
      'datetime' => [
        'source_module' => 'date',
        'destination_module' => 'datetime',
      ],
      'email' => [
        'source_module' => 'email',
        'destination_module' => 'core',
      ],
      'number_default' => [
        'source_module' => 'number',
        'destination_module' => 'core',
      ],
      'entityreference' => [
        'source_module' => 'entityreference',
        'destination_module' => 'core',
      ],
      'node_reference' => [
        'source_module' => 'node_reference',
        'destination_module' => 'core',
      ],
      'user_reference' => [
        'source_module' => 'user_reference',
        'destination_module' => 'core',
      ],
    ];
    $this->enableAllModules();
    $definitions = $this->container
      ->get('plugin.manager.migrate.field')
      ->getDefinitions();
    foreach ($definitions as $key => $definition) {
      $this->assertArrayHasKey($key, $expected_mappings);
      $this->assertEquals($expected_mappings[$key]['source_module'], $definition['source_module']);
      $this->assertEquals($expected_mappings[$key]['destination_module'], $definition['destination_module']);
    }
  }
  
  /**
   * Tests a missing required definition.
   *
   * @param array $definitions
   *   A field plugin definition.
   * @param string $missing_property
   *   The name of the property missing from the definition.
   *
   * @dataProvider fieldPluginDefinitionsProvider
   */
  public function testFieldProviderMissingRequiredProperty(array $definitions, $missing_property) {
    $discovery = $this->getMockBuilder(MigrateFieldPluginManager::class)
      ->disableOriginalConstructor()
      ->onlyMethods([
      'getDefinitions',
    ])
      ->getMock();
    $discovery->method('getDefinitions')
      ->willReturn($definitions);
    $plugin_manager = $this->getMockBuilder(MigrateFieldPluginManager::class)
      ->disableOriginalConstructor()
      ->onlyMethods([
      'getDiscovery',
    ])
      ->getMock();
    $plugin_manager->method('getDiscovery')
      ->willReturn($discovery);
    $this->expectException(BadPluginDefinitionException::class);
    $this->expectExceptionMessage("The missing_{$missing_property} plugin must define the {$missing_property} property.");
    $plugin_manager->getDefinitions();
  }
  
  /**
   * Data provider for field plugin definitions.
   *
   * @return array
   *   Array of plugin definitions.
   */
  public function fieldPluginDefinitionsProvider() {
    return [
      'missing_core_scenario' => [
        'definitions' => [
          'missing_core' => [
            'source_module' => 'migrate',
            'destination_module' => 'migrate',
            'id' => 'missing_core',
            'class' => 'foo',
            'provider' => 'foo',
          ],
        ],
        'missing_property' => 'core',
      ],
      'missing_source_scenario' => [
        'definitions' => [
          'missing_source_module' => [
            'core' => [
              6,
              7,
            ],
            'destination_module' => 'migrate',
            'id' => 'missing_source_module',
            'class' => 'foo',
            'provider' => 'foo',
          ],
        ],
        'missing_property' => 'source_module',
      ],
      'missing_destination_scenario' => [
        'definitions' => [
          'missing_destination_module' => [
            'core' => [
              6,
              7,
            ],
            'source_module' => 'migrate',
            'id' => 'missing_destination_module',
            'class' => 'foo',
            'provider' => 'foo',
          ],
        ],
        'missing_property' => 'destination_module',
      ],
    ];
  }

}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.