annotate core/modules/migrate/tests/src/Kernel/HighWaterTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
rev   line source
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 }