5aae17f7d64cd49f8565a6efdf0c402f1b3705d0
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Config / Entity / ConfigEntityUpdaterTest.php
1 <?php
2
3 namespace Drupal\KernelTests\Core\Config\Entity;
4
5 use Drupal\Core\Config\Entity\ConfigEntityUpdater;
6 use Drupal\Core\Site\Settings;
7 use Drupal\KernelTests\KernelTestBase;
8
9 /**
10  * Tests \Drupal\Core\Config\Entity\ConfigEntityUpdater.
11  *
12  * @coversDefaultClass \Drupal\Core\Config\Entity\ConfigEntityUpdater
13  * @group config
14  */
15 class ConfigEntityUpdaterTest extends KernelTestBase {
16
17   /**
18    * Modules to enable.
19    *
20    * @var array
21    */
22   public static $modules = ['config_test'];
23
24   /**
25    * @covers ::update
26    */
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();
33     }
34
35     // Set up the updater.
36     $sandbox = [];
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);
41
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)');
48         return TRUE;
49       }
50       return FALSE;
51     };
52
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']);
64
65     // Update the rest.
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']);
74   }
75
76   /**
77    * @covers ::update
78    */
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();
85     }
86
87     // Set up the updater.
88     $sandbox = [];
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');
95
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']);
106
107     // Update the rest.
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']);
114   }
115
116   /**
117    * @covers ::update
118    */
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);
123     $sandbox = [];
124     $updater->update($sandbox, 'entity_test_mul_changed');
125   }
126
127 }