3 namespace Drupal\KernelTests\Core\Config\Entity;
5 use Drupal\Core\Config\Entity\ConfigEntityUpdater;
6 use Drupal\Core\Site\Settings;
7 use Drupal\KernelTests\KernelTestBase;
10 * Tests \Drupal\Core\Config\Entity\ConfigEntityUpdater.
12 * @coversDefaultClass \Drupal\Core\Config\Entity\ConfigEntityUpdater
15 class ConfigEntityUpdaterTest extends KernelTestBase {
22 public static $modules = ['config_test'];
27 public function testUpdate() {
28 // Create some entities to update.
29 $storage = $this->container->get('entity_type.manager')->getStorage('config_test');
30 for ($i = 0; $i < 15; $i++) {
31 $entity_id = 'config_test_' . $i;
32 $storage->create(['id' => $entity_id, 'label' => $entity_id])->save();
35 // Set up the updater.
37 $settings = Settings::getInstance() ? Settings::getAll() : [];
38 $settings['entity_update_batch_size'] = 10;
39 new Settings($settings);
40 $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class);
42 $callback = function ($config_entity) {
43 /** @var \Drupal\config_test\Entity\ConfigTest $config_entity */
44 $number = (int) str_replace('config_test_', '', $config_entity->id());
45 // Only update even numbered entities.
46 if ($number % 2 == 0) {
47 $config_entity->set('label', $config_entity->label . ' (updated)');
53 // This should run against the first 10 entities. The even numbered labels
54 // will have been updated.
55 $updater->update($sandbox, 'config_test', $callback);
56 $entities = $storage->loadMultiple();
57 $this->assertEquals('config_test_8 (updated)', $entities['config_test_8']->label());
58 $this->assertEquals('config_test_9', $entities['config_test_9']->label());
59 $this->assertEquals('config_test_10', $entities['config_test_10']->label());
60 $this->assertEquals('config_test_14', $entities['config_test_14']->label());
61 $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']);
62 $this->assertCount(5, $sandbox['config_entity_updater:config_test']['entities']);
63 $this->assertEquals(10 / 15, $sandbox['#finished']);
66 $updater->update($sandbox, 'config_test', $callback);
67 $entities = $storage->loadMultiple();
68 $this->assertEquals('config_test_8 (updated)', $entities['config_test_8']->label());
69 $this->assertEquals('config_test_9', $entities['config_test_9']->label());
70 $this->assertEquals('config_test_10 (updated)', $entities['config_test_10']->label());
71 $this->assertEquals('config_test_14 (updated)', $entities['config_test_14']->label());
72 $this->assertEquals(1, $sandbox['#finished']);
73 $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']);
79 public function testUpdateDefaultCallback() {
80 // Create some entities to update.
81 $storage = $this->container->get('entity_type.manager')->getStorage('config_test');
82 for ($i = 0; $i < 15; $i++) {
83 $entity_id = 'config_test_' . $i;
84 $storage->create(['id' => $entity_id, 'label' => $entity_id])->save();
87 // Set up the updater.
89 $settings = Settings::getInstance() ? Settings::getAll() : [];
90 $settings['entity_update_batch_size'] = 9;
91 new Settings($settings);
92 $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class);
93 // Cause a dependency to be added during an update.
94 \Drupal::state()->set('config_test_new_dependency', 'added_dependency');
96 // This should run against the first 10 entities.
97 $updater->update($sandbox, 'config_test');
98 $entities = $storage->loadMultiple();
99 $this->assertEquals(['added_dependency'], $entities['config_test_7']->getDependencies()['module']);
100 $this->assertEquals(['added_dependency'], $entities['config_test_8']->getDependencies()['module']);
101 $this->assertEquals([], $entities['config_test_9']->getDependencies());
102 $this->assertEquals([], $entities['config_test_14']->getDependencies());
103 $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']);
104 $this->assertCount(6, $sandbox['config_entity_updater:config_test']['entities']);
105 $this->assertEquals(9 / 15, $sandbox['#finished']);
108 $updater->update($sandbox, 'config_test');
109 $entities = $storage->loadMultiple();
110 $this->assertEquals(['added_dependency'], $entities['config_test_9']->getDependencies()['module']);
111 $this->assertEquals(['added_dependency'], $entities['config_test_14']->getDependencies()['module']);
112 $this->assertEquals(1, $sandbox['#finished']);
113 $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']);
119 public function testUpdateException() {
120 $this->enableModules(['entity_test']);
121 $this->setExpectedException(\InvalidArgumentException::class, 'The provided entity type ID \'entity_test_mul_changed\' is not a configuration entity type');
122 $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class);
124 $updater->update($sandbox, 'entity_test_mul_changed');