I18nQueryTraitTest.php

Namespace

Drupal\Tests\migrate_drupal\Kernel

File

core/modules/migrate_drupal/tests/src/Kernel/I18nQueryTraitTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\migrate_drupal\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\migrate\Plugin\migrate\source\SourcePluginBase;
use Drupal\migrate\Plugin\MigrationInterface;

/**
 * Tests instantiating migrate source plugins using I18nQueryTrait.
 *
 * @group migrate_drupal
 */
class I18nQueryTraitTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'block_content',
        'menu_link_content',
        'migrate',
        'migrate_drupal',
        'taxonomy',
    ];
    
    /**
     * Tests instantiating migrate source plugins using I18nQueryTrait.
     *
     * I18nQueryTrait was originally in the content_translation module, which
     * could lead to fatal errors instantiating the source plugins that use it
     * when the content_translation module was not installed.
     *
     * @param string $plugin_id
     *   The ID of a Migrate source plugin that uses I18nQueryTrait.
     *
     * @dataProvider providerI18nQueryTraitPlugins
     */
    public function testMigrateSourcePluginUsingI18nQueryTraitDiscovery(string $plugin_id) : void {
        // Namespace for uninstalled module content_translation needs to be removed
        // for this test.
        $this->disablePsr4ForUninstalledModules([
            'content_translation',
        ]);
        $migration = $this->createMock(MigrationInterface::class);
        $this->assertInstanceOf(SourcePluginBase::class, \Drupal::service('plugin.manager.migrate.source')->createInstance($plugin_id, [], $migration));
    }
    
    /**
     * Removes PSR-4 namespaces from class loader for uninstalled modules.
     *
     * TestRunnerKernel registers namespaces for all modules, including
     * uninstalled modules. This method removes the PSR-4 namespace for the list
     * of modules passed in after confirming they are all uninstalled.
     *
     * @param string[] $remove_psr4_modules
     *   List of machine names of modules that are uninstalled and whose PSR-4
     *   namespaces should be removed from the class loader.
     */
    protected function disablePsr4ForUninstalledModules(array $remove_psr4_modules) : void {
        
        /** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
        $module_list = \Drupal::service('extension.list.module');
        $available_modules = $module_list->getAllAvailableInfo();
        $installed_modules = $module_list->getAllInstalledInfo();
        $prefixes = $this->classLoader
            ->getPrefixesPsr4();
        foreach ($remove_psr4_modules as $module) {
            $this->assertArrayHasKey($module, $available_modules);
            $this->assertArrayNotHasKey($module, $installed_modules);
            if (isset($prefixes["Drupal\\{$module}\\"])) {
                // Cannot actually remove the PSR4 prefix from the class loader, so set
                // the path to a wrong location.
                $this->classLoader
                    ->setPsr4("Drupal\\{$module}\\", '');
            }
        }
    }
    
    /**
     * Provides data for testMigrateSourcePluginUsingI18nQueryTraitDiscovery().
     */
    public static function providerI18nQueryTraitPlugins() : array {
        return [
            [
                'd6_box_translation',
            ],
            [
                'd7_block_custom_translation',
            ],
            [
                'd6_menu_link_translation',
            ],
            [
                'd7_menu_link_translation',
            ],
            [
                'd7_term_localized_translation',
            ],
        ];
    }

}

Classes

Title Deprecated Summary
I18nQueryTraitTest Tests instantiating migrate source plugins using I18nQueryTrait.

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