Further Drupal 8.6.4 changes. Some core files were not committed before a commit...
[yaffs-website] / web / core / modules / field_ui / tests / src / Functional / FieldUIDeleteTest.php
1 <?php
2
3 namespace Drupal\Tests\field_ui\Functional;
4
5 use Drupal\field\Entity\FieldConfig;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\Tests\BrowserTestBase;
8 use Drupal\Tests\field_ui\Traits\FieldUiTestTrait;
9 use Drupal\views\Entity\View;
10 use Drupal\views\Tests\ViewTestData;
11
12 /**
13  * Tests deletion of a field and their dependencies in the UI.
14  *
15  * @group field_ui
16  */
17 class FieldUIDeleteTest extends BrowserTestBase {
18
19   use FieldUiTestTrait;
20
21   /**
22    * Modules to install.
23    *
24    * @var array
25    */
26   public static $modules = ['node', 'field_ui', 'field_test', 'block', 'field_test_views'];
27
28   /**
29    * Test views to enable
30    *
31    * @var string[]
32    */
33   public static $testViews = ['test_view_field_delete'];
34
35   /**
36    * {@inheritdoc}
37    */
38   protected function setUp() {
39     parent::setUp();
40
41     $this->drupalPlaceBlock('system_breadcrumb_block');
42     $this->drupalPlaceBlock('local_tasks_block');
43     $this->drupalPlaceBlock('page_title_block');
44
45     // Create a test user.
46     $admin_user = $this->drupalCreateUser(['access content', 'administer content types', 'administer node fields', 'administer node form display', 'administer node display', 'administer users', 'administer account settings', 'administer user display', 'bypass node access']);
47     $this->drupalLogin($admin_user);
48   }
49
50   /**
51    * Tests that deletion removes field storages and fields as expected.
52    */
53   public function testDeleteField() {
54     $field_label = $this->randomMachineName();
55     $field_name_input = 'test';
56     $field_name = 'field_test';
57
58     // Create an additional node type.
59     $type_name1 = strtolower($this->randomMachineName(8)) . '_test';
60     $type1 = $this->drupalCreateContentType(['name' => $type_name1, 'type' => $type_name1]);
61     $type_name1 = $type1->id();
62
63     // Create a new field.
64     $bundle_path1 = 'admin/structure/types/manage/' . $type_name1;
65     $this->fieldUIAddNewField($bundle_path1, $field_name_input, $field_label);
66
67     // Create an additional node type.
68     $type_name2 = strtolower($this->randomMachineName(8)) . '_test';
69     $type2 = $this->drupalCreateContentType(['name' => $type_name2, 'type' => $type_name2]);
70     $type_name2 = $type2->id();
71
72     // Add a field to the second node type.
73     $bundle_path2 = 'admin/structure/types/manage/' . $type_name2;
74     $this->fieldUIAddExistingField($bundle_path2, $field_name, $field_label);
75
76     \Drupal::service('module_installer')->install(['views']);
77     ViewTestData::createTestViews(get_class($this), ['field_test_views']);
78
79     $view = View::load('test_view_field_delete');
80     $this->assertNotNull($view);
81     $this->assertTrue($view->status());
82     // Test that the View depends on the field.
83     $dependencies = $view->getDependencies() + ['config' => []];
84     $this->assertTrue(in_array("field.storage.node.$field_name", $dependencies['config']));
85
86     // Check the config dependencies of the first field, the field storage must
87     // not be shown as being deleted yet.
88     $this->drupalGet("$bundle_path1/fields/node.$type_name1.$field_name/delete");
89     $this->assertNoText(t('The listed configuration will be deleted.'));
90     $this->assertNoText(t('View'));
91     $this->assertNoText('test_view_field_delete');
92
93     // Delete the first field.
94     $this->fieldUIDeleteField($bundle_path1, "node.$type_name1.$field_name", $field_label, $type_name1);
95
96     // Check that the field was deleted.
97     $this->assertNull(FieldConfig::loadByName('node', $type_name1, $field_name), 'Field was deleted.');
98     // Check that the field storage was not deleted
99     $this->assertNotNull(FieldStorageConfig::loadByName('node', $field_name), 'Field storage was not deleted.');
100
101     // Check the config dependencies of the first field.
102     $this->drupalGet("$bundle_path2/fields/node.$type_name2.$field_name/delete");
103     $this->assertText(t('The listed configuration will be updated.'));
104     $this->assertText(t('View'));
105     $this->assertText('test_view_field_delete');
106
107     $xml = $this->cssSelect('#edit-entity-deletes');
108     // Test that nothing is scheduled for deletion.
109     $this->assertFalse(isset($xml[0]), 'The field currently being deleted is not shown in the entity deletions.');
110
111     // Delete the second field.
112     $this->fieldUIDeleteField($bundle_path2, "node.$type_name2.$field_name", $field_label, $type_name2);
113
114     // Check that the field was deleted.
115     $this->assertNull(FieldConfig::loadByName('node', $type_name2, $field_name), 'Field was deleted.');
116     // Check that the field storage was deleted too.
117     $this->assertNull(FieldStorageConfig::loadByName('node', $field_name), 'Field storage was deleted.');
118
119     // Test that the View isn't deleted and has been disabled.
120     $view = View::load('test_view_field_delete');
121     $this->assertNotNull($view);
122     $this->assertFalse($view->status());
123     // Test that the View no longer depends on the deleted field.
124     $dependencies = $view->getDependencies() + ['config' => []];
125     $this->assertFalse(in_array("field.storage.node.$field_name", $dependencies['config']));
126   }
127
128 }