annotate core/modules/migrate/tests/src/Unit/MigrationPluginManagerTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 7a779792577d
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\migrate\Unit;
Chris@0 4
Chris@0 5 use Drupal\migrate\Plugin\Migration;
Chris@0 6 use Drupal\migrate\Plugin\MigrationPluginManager;
Chris@0 7 use Drupal\Tests\UnitTestCase;
Chris@0 8
Chris@0 9 /**
Chris@0 10 * @coversDefaultClass \Drupal\migrate\Plugin\MigrationPluginManager
Chris@0 11 * @group migrate
Chris@0 12 */
Chris@0 13 class MigrationPluginManagerTest extends UnitTestCase {
Chris@0 14
Chris@0 15 /**
Chris@0 16 * A plugin manager.
Chris@0 17 *
Chris@12 18 * @var \Drupal\migrate\Plugin\MigrationPluginManager
Chris@0 19 */
Chris@0 20 protected $pluginManager;
Chris@0 21
Chris@0 22 /**
Chris@0 23 * {@inheritdoc}
Chris@0 24 */
Chris@0 25 public function setUp() {
Chris@0 26 parent::setUp();
Chris@0 27
Chris@0 28 // Get a plugin manager for testing.
Chris@0 29 $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
Chris@0 30 $cache_backend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
Chris@0 31 $language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
Chris@0 32 $this->pluginManager = new MigrationPluginManager($module_handler, $cache_backend, $language_manager);
Chris@0 33 }
Chris@0 34
Chris@0 35 /**
Chris@0 36 * Tests building dependencies for multiple migrations.
Chris@0 37 *
Chris@0 38 * @dataProvider dependencyProvider
Chris@0 39 */
Chris@0 40 public function testDependencyBuilding($migrations_data, $result_ids) {
Chris@0 41 $migrations = [];
Chris@0 42 foreach ($migrations_data as $migration_id => $migration_data) {
Chris@0 43 $migrations[$migration_id] = new TestMigrationMock($migration_id, $migration_data['dependencies']);
Chris@0 44 }
Chris@0 45
Chris@0 46 $ordered_migrations = $this->pluginManager->buildDependencyMigration($migrations, []);
Chris@0 47
Chris@0 48 // Verify results.
Chris@0 49 $this->assertEquals($result_ids, array_keys($ordered_migrations));
Chris@0 50 foreach ($migrations_data as $migration_id => $migration_data) {
Chris@0 51 $migration = $migrations[$migration_id];
Chris@0 52
Chris@0 53 $requirements = $migration_data['result_requirements'];
Chris@0 54 if (empty($requirements)) {
Chris@0 55 $this->assertEquals([], $migration->set);
Chris@0 56 }
Chris@0 57 else {
Chris@0 58 $requirements = array_combine($requirements, $requirements);
Chris@0 59
Chris@0 60 $this->assertEquals(1, count($migration->set));
Chris@0 61 list($set_prop, $set_requirements) = reset($migration->set);
Chris@0 62 $this->assertEquals('requirements', $set_prop);
Chris@0 63 $this->assertEquals($requirements, $set_requirements);
Chris@0 64 }
Chris@0 65 }
Chris@0 66 }
Chris@0 67
Chris@0 68 /**
Chris@0 69 * Provide dependency data for testing.
Chris@0 70 */
Chris@0 71 public function dependencyProvider() {
Chris@0 72 return [
Chris@0 73 // Just one migration, with no dependencies.
Chris@0 74 [
Chris@0 75 [
Chris@0 76 'm1' => [
Chris@0 77 'dependencies' => [],
Chris@0 78 'result_requirements' => [],
Chris@0 79 ],
Chris@0 80 ],
Chris@0 81 ['m1'],
Chris@0 82 ],
Chris@0 83
Chris@0 84 // Just one migration, with required dependencies.
Chris@0 85 [
Chris@0 86 [
Chris@0 87 'm1' => [
Chris@0 88 'dependencies' => [
Chris@0 89 'required' => ['required1', 'required2'],
Chris@0 90 ],
Chris@0 91 'result_requirements' => ['required1', 'required2'],
Chris@0 92 ],
Chris@0 93 ],
Chris@0 94 ['m1'],
Chris@0 95 ],
Chris@0 96
Chris@0 97 // Just one migration, with optional dependencies.
Chris@0 98 [
Chris@0 99 [
Chris@0 100 'm1' => [
Chris@0 101 'dependencies' => [
Chris@0 102 'optional' => ['optional1'],
Chris@0 103 ],
Chris@0 104 'result_requirements' => [],
Chris@0 105 ],
Chris@0 106 ],
Chris@0 107 ['m1'],
Chris@0 108 ],
Chris@0 109
Chris@0 110 // Multiple migrations.
Chris@0 111 [
Chris@0 112 [
Chris@0 113 'm1' => [
Chris@0 114 'dependencies' => [
Chris@0 115 'required' => ['required1', 'required2'],
Chris@0 116 ],
Chris@0 117 'result_requirements' => ['required1', 'required2'],
Chris@0 118 ],
Chris@0 119 'm2' => [
Chris@0 120 'dependencies' => [
Chris@0 121 'optional' => ['optional1'],
Chris@0 122 ],
Chris@0 123 'result_requirements' => [],
Chris@0 124 ],
Chris@0 125 ],
Chris@0 126 ['m1', 'm2'],
Chris@0 127 ],
Chris@0 128
Chris@0 129 // Multiple migrations, reordered due to optional requirement.
Chris@0 130 [
Chris@0 131 [
Chris@0 132 'm1' => [
Chris@0 133 'dependencies' => [
Chris@0 134 'optional' => ['m2'],
Chris@0 135 ],
Chris@0 136 'result_requirements' => [],
Chris@0 137 ],
Chris@0 138 'm2' => [
Chris@0 139 'dependencies' => [
Chris@0 140 'optional' => ['optional1'],
Chris@0 141 ],
Chris@0 142 'result_requirements' => [],
Chris@0 143 ],
Chris@0 144 ],
Chris@0 145 ['m2', 'm1'],
Chris@0 146 ],
Chris@0 147
Chris@0 148 // Ensure that optional requirements aren't turned into required ones,
Chris@0 149 // if the last migration has no optional deps.
Chris@0 150 [
Chris@0 151 [
Chris@0 152 'm1' => [
Chris@0 153 'dependencies' => [
Chris@0 154 'optional' => ['m2'],
Chris@0 155 ],
Chris@0 156 'result_requirements' => [],
Chris@0 157 ],
Chris@0 158 'm2' => [
Chris@0 159 'dependencies' => [],
Chris@0 160 'result_requirements' => [],
Chris@0 161 ],
Chris@0 162 ],
Chris@0 163 ['m2', 'm1'],
Chris@0 164 ],
Chris@0 165 ];
Chris@0 166 }
Chris@0 167
Chris@0 168 }
Chris@0 169
Chris@0 170 /**
Chris@0 171 * A mock migration plugin.
Chris@0 172 *
Chris@0 173 * Why are we using a custom class here?
Chris@0 174 *
Chris@0 175 * 1. The function buildDependencyMigration() calls $migration->set(), which
Chris@0 176 * is not actually in MigrationInterface.
Chris@0 177 *
Chris@0 178 * 2. The function buildDependencyMigration() calls array_multisort on an
Chris@0 179 * array with mocks in it. PHPUnit mocks are really complex, and if PHP tries
Chris@0 180 * to compare them it will die with "Nesting level too deep".
Chris@0 181 */
Chris@0 182 class TestMigrationMock extends Migration {
Chris@0 183 /**
Chris@0 184 * The values passed into set().
Chris@0 185 *
Chris@0 186 * @var array
Chris@0 187 */
Chris@0 188 public $set = [];
Chris@0 189
Chris@0 190 /**
Chris@0 191 * TestMigrationMock constructor.
Chris@0 192 */
Chris@0 193 public function __construct($id, $dependencies) {
Chris@0 194 // Intentionally ignore parent constructor.
Chris@0 195 $this->id = $id;
Chris@0 196 $this->dependencies = $dependencies;
Chris@0 197 }
Chris@0 198
Chris@0 199 /**
Chris@0 200 * {@inheritdoc}
Chris@0 201 */
Chris@0 202 public function id() {
Chris@0 203 return $this->id;
Chris@0 204 }
Chris@0 205
Chris@0 206 /**
Chris@0 207 * {@inheritdoc}
Chris@0 208 */
Chris@0 209 public function getMigrationDependencies() {
Chris@0 210 return $this->dependencies;
Chris@0 211 }
Chris@0 212
Chris@0 213 /**
Chris@0 214 * {@inheritdoc}
Chris@0 215 */
Chris@0 216 public function set($prop, $value) {
Chris@0 217 $this->set[] = func_get_args();
Chris@0 218 }
Chris@0 219
Chris@0 220 }