4567bd07e9e72743ef99e7294830c22c5b6c2c8c
[yaffs-website] / EntityReferenceFieldDefaultValueTest.php
1 <?php
2
3 namespace Drupal\Tests\field\Functional\EntityReference;
4
5 use Drupal\Component\Utility\Unicode;
6 use Drupal\Tests\SchemaCheckTestTrait;
7 use Drupal\field\Entity\FieldConfig;
8 use Drupal\field\Entity\FieldStorageConfig;
9 use Drupal\node\Entity\Node;
10 use Drupal\Tests\BrowserTestBase;
11
12 /**
13  * Tests entity reference field default values storage in CMI.
14  *
15  * @group entity_reference
16  */
17 class EntityReferenceFieldDefaultValueTest extends BrowserTestBase {
18
19   use SchemaCheckTestTrait;
20
21   /**
22    * Modules to install.
23    *
24    * @var array
25    */
26   public static $modules = ['field_ui', 'node'];
27
28   /**
29    * A user with permission to administer content types, node fields, etc.
30    *
31    * @var \Drupal\user\UserInterface
32    */
33   protected $adminUser;
34
35   protected function setUp() {
36     parent::setUp();
37
38     // Create default content type.
39     $this->drupalCreateContentType(['type' => 'reference_content']);
40     $this->drupalCreateContentType(['type' => 'referenced_content']);
41
42     // Create admin user.
43     $this->adminUser = $this->drupalCreateUser(['access content', 'administer content types', 'administer node fields', 'administer node form display', 'bypass node access']);
44     $this->drupalLogin($this->adminUser);
45   }
46
47   /**
48    * Tests that default values are correctly translated to UUIDs in config.
49    */
50   public function testEntityReferenceDefaultValue() {
51     // Create a node to be referenced.
52     $referenced_node = $this->drupalCreateNode(['type' => 'referenced_content']);
53
54     $field_name = Unicode::strtolower($this->randomMachineName());
55     $field_storage = FieldStorageConfig::create([
56       'field_name' => $field_name,
57       'entity_type' => 'node',
58       'type' => 'entity_reference',
59       'settings' => ['target_type' => 'node'],
60     ]);
61     $field_storage->save();
62     $field = FieldConfig::create([
63       'field_storage' => $field_storage,
64       'bundle' => 'reference_content',
65       'settings' => [
66         'handler' => 'default',
67         'handler_settings' => [
68           'target_bundles' => ['referenced_content'],
69           'sort' => ['field' => '_none'],
70         ],
71       ],
72     ]);
73     $field->save();
74
75     // Set created node as default_value.
76     $field_edit = [
77       'default_value_input[' . $field_name . '][0][target_id]' => $referenced_node->getTitle() . ' (' . $referenced_node->id() . ')',
78     ];
79     $this->drupalPostForm('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name, $field_edit, t('Save settings'));
80
81     // Check that default value is selected in default value form.
82     $this->drupalGet('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name);
83     $this->assertRaw('name="default_value_input[' . $field_name . '][0][target_id]" value="' . $referenced_node->getTitle() . ' (' . $referenced_node->id() . ')', 'The default value is selected in instance settings page');
84
85     // Check if the ID has been converted to UUID in config entity.
86     $config_entity = $this->config('field.field.node.reference_content.' . $field_name)->get();
87     $this->assertTrue(isset($config_entity['default_value'][0]['target_uuid']), 'Default value contains target_uuid property');
88     $this->assertEqual($config_entity['default_value'][0]['target_uuid'], $referenced_node->uuid(), 'Content uuid and config entity uuid are the same');
89     // Ensure the configuration has the expected dependency on the entity that
90     // is being used a default value.
91     $this->assertEqual([$referenced_node->getConfigDependencyName()], $config_entity['dependencies']['content']);
92
93     // Clear field definitions cache in order to avoid stale cache values.
94     \Drupal::entityManager()->clearCachedFieldDefinitions();
95
96     // Create a new node to check that UUID has been converted to numeric ID.
97     $new_node = Node::create(['type' => 'reference_content']);
98     $this->assertEqual($new_node->get($field_name)->offsetGet(0)->target_id, $referenced_node->id());
99
100     // Ensure that the entity reference config schemas are correct.
101     $field_config = $this->config('field.field.node.reference_content.' . $field_name);
102     $this->assertConfigSchema(\Drupal::service('config.typed'), $field_config->getName(), $field_config->get());
103     $field_storage_config = $this->config('field.storage.node.' . $field_name);
104     $this->assertConfigSchema(\Drupal::service('config.typed'), $field_storage_config->getName(), $field_storage_config->get());
105   }
106
107   /**
108    * Tests that dependencies due to default values can be removed.
109    *
110    * @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::onDependencyRemoval()
111    */
112   public function testEntityReferenceDefaultConfigValue() {
113     // Create a node to be referenced.
114     $referenced_node_type = $this->drupalCreateContentType(['type' => 'referenced_config_to_delete']);
115     $referenced_node_type2 = $this->drupalCreateContentType(['type' => 'referenced_config_to_preserve']);
116
117     $field_name = Unicode::strtolower($this->randomMachineName());
118     $field_storage = FieldStorageConfig::create([
119       'field_name' => $field_name,
120       'entity_type' => 'node',
121       'type' => 'entity_reference',
122       'settings' => ['target_type' => 'node_type'],
123       'cardinality' => FieldStorageConfig::CARDINALITY_UNLIMITED,
124     ]);
125     $field_storage->save();
126     $field = FieldConfig::create([
127       'field_storage' => $field_storage,
128       'bundle' => 'reference_content',
129       'settings' => [
130         'handler' => 'default',
131         'handler_settings' => [
132           'sort' => ['field' => '_none'],
133         ],
134       ],
135     ]);
136     $field->save();
137
138     // Set created node as default_value.
139     $field_edit = [
140       'default_value_input[' . $field_name . '][0][target_id]' => $referenced_node_type->label() . ' (' . $referenced_node_type->id() . ')',
141       'default_value_input[' . $field_name . '][1][target_id]' => $referenced_node_type2->label() . ' (' . $referenced_node_type2->id() . ')',
142     ];
143     $this->drupalPostForm('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name, $field_edit, t('Save settings'));
144
145     // Check that the field has a dependency on the default value.
146     $config_entity = $this->config('field.field.node.reference_content.' . $field_name)->get();
147     $this->assertTrue(in_array($referenced_node_type->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type referenced_config_to_delete is a dependency of the field.');
148     $this->assertTrue(in_array($referenced_node_type2->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type referenced_config_to_preserve is a dependency of the field.');
149
150     // Check that the field does not have a dependency on the default value
151     // after deleting the node type.
152     $referenced_node_type->delete();
153     $config_entity = $this->config('field.field.node.reference_content.' . $field_name)->get();
154     $this->assertFalse(in_array($referenced_node_type->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type referenced_config_to_delete not a dependency of the field.');
155     $this->assertTrue(in_array($referenced_node_type2->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type referenced_config_to_preserve is a dependency of the field.');
156   }
157
158 }