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