Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\migrate\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * Tests migration high water property.
|
Chris@0
|
7 *
|
Chris@0
|
8 * @group migrate
|
Chris@0
|
9 */
|
Chris@0
|
10 class HighWaterTest extends MigrateTestBase {
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * {@inheritdoc}
|
Chris@0
|
14 */
|
Chris@0
|
15 public static $modules = [
|
Chris@0
|
16 'system',
|
Chris@0
|
17 'user',
|
Chris@0
|
18 'node',
|
Chris@0
|
19 'migrate',
|
Chris@0
|
20 'migrate_high_water_test',
|
Chris@0
|
21 'field',
|
Chris@0
|
22 ];
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * {@inheritdoc}
|
Chris@0
|
26 */
|
Chris@0
|
27 protected function setUp() {
|
Chris@0
|
28 parent::setUp();
|
Chris@0
|
29 // Create source test table.
|
Chris@0
|
30 $this->sourceDatabase->schema()->createTable('high_water_node', [
|
Chris@0
|
31 'fields' => [
|
Chris@0
|
32 'id' => [
|
Chris@0
|
33 'description' => 'Serial',
|
Chris@0
|
34 'type' => 'serial',
|
Chris@0
|
35 'unsigned' => TRUE,
|
Chris@0
|
36 'not null' => TRUE,
|
Chris@0
|
37 ],
|
Chris@0
|
38 'changed' => [
|
Chris@0
|
39 'description' => 'Highwater',
|
Chris@0
|
40 'type' => 'int',
|
Chris@0
|
41 'unsigned' => TRUE,
|
Chris@0
|
42 ],
|
Chris@0
|
43 'title' => [
|
Chris@0
|
44 'description' => 'Title',
|
Chris@0
|
45 'type' => 'varchar',
|
Chris@0
|
46 'length' => 128,
|
Chris@0
|
47 'not null' => TRUE,
|
Chris@0
|
48 'default' => '',
|
Chris@0
|
49 ],
|
Chris@0
|
50 ],
|
Chris@0
|
51 'primary key' => [
|
Chris@0
|
52 'id',
|
Chris@0
|
53 ],
|
Chris@0
|
54 'description' => 'Contains nodes to import',
|
Chris@0
|
55 ]);
|
Chris@0
|
56
|
Chris@0
|
57 // Add 3 items to source table.
|
Chris@0
|
58 $this->sourceDatabase->insert('high_water_node')
|
Chris@0
|
59 ->fields([
|
Chris@0
|
60 'title',
|
Chris@0
|
61 'changed',
|
Chris@0
|
62 ])
|
Chris@0
|
63 ->values([
|
Chris@0
|
64 'title' => 'Item 1',
|
Chris@0
|
65 'changed' => 1,
|
Chris@0
|
66 ])
|
Chris@0
|
67 ->values([
|
Chris@0
|
68 'title' => 'Item 2',
|
Chris@0
|
69 'changed' => 2,
|
Chris@0
|
70 ])
|
Chris@0
|
71 ->values([
|
Chris@0
|
72 'title' => 'Item 3',
|
Chris@0
|
73 'changed' => 3,
|
Chris@0
|
74 ])
|
Chris@0
|
75 ->execute();
|
Chris@0
|
76
|
Chris@0
|
77 $this->installEntitySchema('node');
|
Chris@0
|
78 $this->installEntitySchema('user');
|
Chris@0
|
79 $this->installSchema('node', 'node_access');
|
Chris@0
|
80
|
Chris@0
|
81 $this->executeMigration('high_water_test');
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * Tests high water property of SqlBase.
|
Chris@0
|
86 */
|
Chris@0
|
87 public function testHighWater() {
|
Chris@0
|
88 // Assert all of the nodes have been imported.
|
Chris@0
|
89 $this->assertNodeExists('Item 1');
|
Chris@0
|
90 $this->assertNodeExists('Item 2');
|
Chris@0
|
91 $this->assertNodeExists('Item 3');
|
Chris@0
|
92
|
Chris@0
|
93 // Update Item 1 setting its high_water_property to value that is below
|
Chris@0
|
94 // current high water mark.
|
Chris@0
|
95 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
96 ->fields([
|
Chris@0
|
97 'title' => 'Item 1 updated',
|
Chris@0
|
98 'changed' => 2,
|
Chris@0
|
99 ])
|
Chris@0
|
100 ->condition('title', 'Item 1')
|
Chris@0
|
101 ->execute();
|
Chris@0
|
102
|
Chris@0
|
103 // Update Item 2 setting its high_water_property to value equal to
|
Chris@0
|
104 // current high water mark.
|
Chris@0
|
105 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
106 ->fields([
|
Chris@0
|
107 'title' => 'Item 2 updated',
|
Chris@0
|
108 'changed' => 3,
|
Chris@0
|
109 ])
|
Chris@0
|
110 ->condition('title', 'Item 2')
|
Chris@0
|
111 ->execute();
|
Chris@0
|
112
|
Chris@0
|
113 // Update Item 3 setting its high_water_property to value that is above
|
Chris@0
|
114 // current high water mark.
|
Chris@0
|
115 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
116 ->fields([
|
Chris@0
|
117 'title' => 'Item 3 updated',
|
Chris@0
|
118 'changed' => 4,
|
Chris@0
|
119 ])
|
Chris@0
|
120 ->condition('title', 'Item 3')
|
Chris@0
|
121 ->execute();
|
Chris@0
|
122
|
Chris@0
|
123 // Execute migration again.
|
Chris@0
|
124 $this->executeMigration('high_water_test');
|
Chris@0
|
125
|
Chris@0
|
126 // Item with lower highwater should not be updated.
|
Chris@0
|
127 $this->assertNodeExists('Item 1');
|
Chris@0
|
128 $this->assertNodeDoesNotExist('Item 1 updated');
|
Chris@0
|
129
|
Chris@0
|
130 // Item with equal highwater should not be updated.
|
Chris@0
|
131 $this->assertNodeExists('Item 2');
|
Chris@0
|
132 $this->assertNodeDoesNotExist('Item 2 updated');
|
Chris@0
|
133
|
Chris@0
|
134 // Item with greater highwater should be updated.
|
Chris@0
|
135 $this->assertNodeExists('Item 3 updated');
|
Chris@0
|
136 $this->assertNodeDoesNotExist('Item 3');
|
Chris@0
|
137 }
|
Chris@0
|
138
|
Chris@0
|
139 /**
|
Chris@0
|
140 * Tests high water property of SqlBase when rows marked for update.
|
Chris@0
|
141 */
|
Chris@0
|
142 public function testHighWaterUpdate() {
|
Chris@0
|
143 // Assert all of the nodes have been imported.
|
Chris@0
|
144 $this->assertNodeExists('Item 1');
|
Chris@0
|
145 $this->assertNodeExists('Item 2');
|
Chris@0
|
146 $this->assertNodeExists('Item 3');
|
Chris@0
|
147
|
Chris@0
|
148 // Update Item 1 setting its high_water_property to value that is below
|
Chris@0
|
149 // current high water mark.
|
Chris@0
|
150 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
151 ->fields([
|
Chris@0
|
152 'title' => 'Item 1 updated',
|
Chris@0
|
153 'changed' => 2,
|
Chris@0
|
154 ])
|
Chris@0
|
155 ->condition('title', 'Item 1')
|
Chris@0
|
156 ->execute();
|
Chris@0
|
157
|
Chris@0
|
158 // Update Item 2 setting its high_water_property to value equal to
|
Chris@0
|
159 // current high water mark.
|
Chris@0
|
160 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
161 ->fields([
|
Chris@0
|
162 'title' => 'Item 2 updated',
|
Chris@0
|
163 'changed' => 3,
|
Chris@0
|
164 ])
|
Chris@0
|
165 ->condition('title', 'Item 2')
|
Chris@0
|
166 ->execute();
|
Chris@0
|
167
|
Chris@0
|
168 // Update Item 3 setting its high_water_property to value that is above
|
Chris@0
|
169 // current high water mark.
|
Chris@0
|
170 $this->sourceDatabase->update('high_water_node')
|
Chris@0
|
171 ->fields([
|
Chris@0
|
172 'title' => 'Item 3 updated',
|
Chris@0
|
173 'changed' => 4,
|
Chris@0
|
174 ])
|
Chris@0
|
175 ->condition('title', 'Item 3')
|
Chris@0
|
176 ->execute();
|
Chris@0
|
177
|
Chris@0
|
178 // Set all rows as needing an update.
|
Chris@0
|
179 $id_map = $this->getMigration('high_water_test')->getIdMap();
|
Chris@0
|
180 $id_map->prepareUpdate();
|
Chris@0
|
181
|
Chris@0
|
182 $this->executeMigration('high_water_test');
|
Chris@0
|
183
|
Chris@0
|
184 // Item with lower highwater should be updated.
|
Chris@0
|
185 $this->assertNodeExists('Item 1 updated');
|
Chris@0
|
186 $this->assertNodeDoesNotExist('Item 1');
|
Chris@0
|
187
|
Chris@0
|
188 // Item with equal highwater should be updated.
|
Chris@0
|
189 $this->assertNodeExists('Item 2 updated');
|
Chris@0
|
190 $this->assertNodeDoesNotExist('Item 2');
|
Chris@0
|
191
|
Chris@0
|
192 // Item with greater highwater should be updated.
|
Chris@0
|
193 $this->assertNodeExists('Item 3 updated');
|
Chris@0
|
194 $this->assertNodeDoesNotExist('Item 3');
|
Chris@0
|
195 }
|
Chris@0
|
196
|
Chris@0
|
197 /**
|
Chris@0
|
198 * Assert that node with given title exists.
|
Chris@0
|
199 *
|
Chris@0
|
200 * @param string $title
|
Chris@0
|
201 * Title of the node.
|
Chris@0
|
202 */
|
Chris@0
|
203 protected function assertNodeExists($title) {
|
Chris@0
|
204 self::assertTrue($this->nodeExists($title));
|
Chris@0
|
205 }
|
Chris@0
|
206
|
Chris@0
|
207 /**
|
Chris@0
|
208 * Assert that node with given title does not exist.
|
Chris@0
|
209 *
|
Chris@0
|
210 * @param string $title
|
Chris@0
|
211 * Title of the node.
|
Chris@0
|
212 */
|
Chris@0
|
213 protected function assertNodeDoesNotExist($title) {
|
Chris@0
|
214 self::assertFalse($this->nodeExists($title));
|
Chris@0
|
215 }
|
Chris@0
|
216
|
Chris@0
|
217 /**
|
Chris@0
|
218 * Checks if node with given title exists.
|
Chris@0
|
219 *
|
Chris@0
|
220 * @param string $title
|
Chris@0
|
221 * Title of the node.
|
Chris@0
|
222 *
|
Chris@0
|
223 * @return bool
|
Chris@0
|
224 */
|
Chris@0
|
225 protected function nodeExists($title) {
|
Chris@0
|
226 $query = \Drupal::entityQuery('node');
|
Chris@0
|
227 $result = $query
|
Chris@0
|
228 ->condition('title', $title)
|
Chris@0
|
229 ->range(0, 1)
|
Chris@0
|
230 ->execute();
|
Chris@0
|
231
|
Chris@0
|
232 return !empty($result);
|
Chris@0
|
233 }
|
Chris@0
|
234
|
Chris@0
|
235 }
|