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 }
|