X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Ftests%2FDrupal%2FKernelTests%2FCore%2FConfig%2FEntity%2FConfigEntityUpdaterTest.php;fp=web%2Fcore%2Ftests%2FDrupal%2FKernelTests%2FCore%2FConfig%2FEntity%2FConfigEntityUpdaterTest.php;h=5aae17f7d64cd49f8565a6efdf0c402f1b3705d0;hp=0000000000000000000000000000000000000000;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php b/web/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php new file mode 100644 index 000000000..5aae17f7d --- /dev/null +++ b/web/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php @@ -0,0 +1,127 @@ +container->get('entity_type.manager')->getStorage('config_test'); + for ($i = 0; $i < 15; $i++) { + $entity_id = 'config_test_' . $i; + $storage->create(['id' => $entity_id, 'label' => $entity_id])->save(); + } + + // Set up the updater. + $sandbox = []; + $settings = Settings::getInstance() ? Settings::getAll() : []; + $settings['entity_update_batch_size'] = 10; + new Settings($settings); + $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class); + + $callback = function ($config_entity) { + /** @var \Drupal\config_test\Entity\ConfigTest $config_entity */ + $number = (int) str_replace('config_test_', '', $config_entity->id()); + // Only update even numbered entities. + if ($number % 2 == 0) { + $config_entity->set('label', $config_entity->label . ' (updated)'); + return TRUE; + } + return FALSE; + }; + + // This should run against the first 10 entities. The even numbered labels + // will have been updated. + $updater->update($sandbox, 'config_test', $callback); + $entities = $storage->loadMultiple(); + $this->assertEquals('config_test_8 (updated)', $entities['config_test_8']->label()); + $this->assertEquals('config_test_9', $entities['config_test_9']->label()); + $this->assertEquals('config_test_10', $entities['config_test_10']->label()); + $this->assertEquals('config_test_14', $entities['config_test_14']->label()); + $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']); + $this->assertCount(5, $sandbox['config_entity_updater:config_test']['entities']); + $this->assertEquals(10 / 15, $sandbox['#finished']); + + // Update the rest. + $updater->update($sandbox, 'config_test', $callback); + $entities = $storage->loadMultiple(); + $this->assertEquals('config_test_8 (updated)', $entities['config_test_8']->label()); + $this->assertEquals('config_test_9', $entities['config_test_9']->label()); + $this->assertEquals('config_test_10 (updated)', $entities['config_test_10']->label()); + $this->assertEquals('config_test_14 (updated)', $entities['config_test_14']->label()); + $this->assertEquals(1, $sandbox['#finished']); + $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']); + } + + /** + * @covers ::update + */ + public function testUpdateDefaultCallback() { + // Create some entities to update. + $storage = $this->container->get('entity_type.manager')->getStorage('config_test'); + for ($i = 0; $i < 15; $i++) { + $entity_id = 'config_test_' . $i; + $storage->create(['id' => $entity_id, 'label' => $entity_id])->save(); + } + + // Set up the updater. + $sandbox = []; + $settings = Settings::getInstance() ? Settings::getAll() : []; + $settings['entity_update_batch_size'] = 9; + new Settings($settings); + $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class); + // Cause a dependency to be added during an update. + \Drupal::state()->set('config_test_new_dependency', 'added_dependency'); + + // This should run against the first 10 entities. + $updater->update($sandbox, 'config_test'); + $entities = $storage->loadMultiple(); + $this->assertEquals(['added_dependency'], $entities['config_test_7']->getDependencies()['module']); + $this->assertEquals(['added_dependency'], $entities['config_test_8']->getDependencies()['module']); + $this->assertEquals([], $entities['config_test_9']->getDependencies()); + $this->assertEquals([], $entities['config_test_14']->getDependencies()); + $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']); + $this->assertCount(6, $sandbox['config_entity_updater:config_test']['entities']); + $this->assertEquals(9 / 15, $sandbox['#finished']); + + // Update the rest. + $updater->update($sandbox, 'config_test'); + $entities = $storage->loadMultiple(); + $this->assertEquals(['added_dependency'], $entities['config_test_9']->getDependencies()['module']); + $this->assertEquals(['added_dependency'], $entities['config_test_14']->getDependencies()['module']); + $this->assertEquals(1, $sandbox['#finished']); + $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']); + } + + /** + * @covers ::update + */ + public function testUpdateException() { + $this->enableModules(['entity_test']); + $this->setExpectedException(\InvalidArgumentException::class, 'The provided entity type ID \'entity_test_mul_changed\' is not a configuration entity type'); + $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class); + $sandbox = []; + $updater->update($sandbox, 'entity_test_mul_changed'); + } + +}