3 namespace Drupal\Tests\migrate\Unit;
5 use Drupal\migrate\Plugin\Migration;
6 use Drupal\migrate\Plugin\MigrationPluginManager;
7 use Drupal\Tests\UnitTestCase;
10 * @coversDefaultClass \Drupal\migrate\Plugin\MigrationPluginManager
13 class MigrationPluginManagerTest extends UnitTestCase {
18 * @var \Drupal\migrate\Plugin\MigrationPluginManager
20 protected $pluginManager;
25 public function setUp() {
28 // Get a plugin manager for testing.
29 $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
30 $cache_backend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
31 $language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
32 $this->pluginManager = new MigrationPluginManager($module_handler, $cache_backend, $language_manager);
36 * Tests building dependencies for multiple migrations.
38 * @dataProvider dependencyProvider
40 public function testDependencyBuilding($migrations_data, $result_ids) {
42 foreach ($migrations_data as $migration_id => $migration_data) {
43 $migrations[$migration_id] = new TestMigrationMock($migration_id, $migration_data['dependencies']);
46 $ordered_migrations = $this->pluginManager->buildDependencyMigration($migrations, []);
49 $this->assertEquals($result_ids, array_keys($ordered_migrations));
50 foreach ($migrations_data as $migration_id => $migration_data) {
51 $migration = $migrations[$migration_id];
53 $requirements = $migration_data['result_requirements'];
54 if (empty($requirements)) {
55 $this->assertEquals([], $migration->set);
58 $requirements = array_combine($requirements, $requirements);
60 $this->assertEquals(1, count($migration->set));
61 list($set_prop, $set_requirements) = reset($migration->set);
62 $this->assertEquals('requirements', $set_prop);
63 $this->assertEquals($requirements, $set_requirements);
69 * Provide dependency data for testing.
71 public function dependencyProvider() {
73 // Just one migration, with no dependencies.
78 'result_requirements' => [],
84 // Just one migration, with required dependencies.
89 'required' => ['required1', 'required2'],
91 'result_requirements' => ['required1', 'required2'],
97 // Just one migration, with optional dependencies.
102 'optional' => ['optional1'],
104 'result_requirements' => [],
110 // Multiple migrations.
115 'required' => ['required1', 'required2'],
117 'result_requirements' => ['required1', 'required2'],
121 'optional' => ['optional1'],
123 'result_requirements' => [],
129 // Multiple migrations, reordered due to optional requirement.
134 'optional' => ['m2'],
136 'result_requirements' => [],
140 'optional' => ['optional1'],
142 'result_requirements' => [],
148 // Ensure that optional requirements aren't turned into required ones,
149 // if the last migration has no optional deps.
154 'optional' => ['m2'],
156 'result_requirements' => [],
159 'dependencies' => [],
160 'result_requirements' => [],
171 * A mock migration plugin.
173 * Why are we using a custom class here?
175 * 1. The function buildDependencyMigration() calls $migration->set(), which
176 * is not actually in MigrationInterface.
178 * 2. The function buildDependencyMigration() calls array_multisort on an
179 * array with mocks in it. PHPUnit mocks are really complex, and if PHP tries
180 * to compare them it will die with "Nesting level too deep".
182 class TestMigrationMock extends Migration {
184 * The values passed into set().
191 * TestMigrationMock constructor.
193 public function __construct($id, $dependencies) {
194 // Intentionally ignore parent constructor.
196 $this->dependencies = $dependencies;
202 public function id() {
209 public function getMigrationDependencies() {
210 return $this->dependencies;
216 public function set($prop, $value) {
217 $this->set[] = func_get_args();