3 namespace Drupal\Tests\field\Functional\EntityReference;
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;
13 * Tests entity reference field default values storage in CMI.
15 * @group entity_reference
17 class EntityReferenceFieldDefaultValueTest extends BrowserTestBase {
19 use SchemaCheckTestTrait;
26 public static $modules = ['field_ui', 'node'];
29 * A user with permission to administer content types, node fields, etc.
31 * @var \Drupal\user\UserInterface
35 protected function setUp() {
38 // Create default content type.
39 $this->drupalCreateContentType(['type' => 'reference_content']);
40 $this->drupalCreateContentType(['type' => 'referenced_content']);
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);
48 * Tests that default values are correctly translated to UUIDs in config.
50 public function testEntityReferenceDefaultValue() {
51 // Create a node to be referenced.
52 $referenced_node = $this->drupalCreateNode(['type' => 'referenced_content']);
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'],
61 $field_storage->save();
62 $field = FieldConfig::create([
63 'field_storage' => $field_storage,
64 'bundle' => 'reference_content',
66 'handler' => 'default',
67 'handler_settings' => [
68 'target_bundles' => ['referenced_content'],
69 'sort' => ['field' => '_none'],
75 // Set created node as default_value.
77 'default_value_input[' . $field_name . '][0][target_id]' => $referenced_node->getTitle() . ' (' . $referenced_node->id() . ')',
79 $this->drupalPostForm('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name, $field_edit, t('Save settings'));
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');
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']);
93 // Clear field definitions cache in order to avoid stale cache values.
94 \Drupal::entityManager()->clearCachedFieldDefinitions();
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());
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());
108 * Tests that dependencies due to default values can be removed.
110 * @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::onDependencyRemoval()
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']);
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,
125 $field_storage->save();
126 $field = FieldConfig::create([
127 'field_storage' => $field_storage,
128 'bundle' => 'reference_content',
130 'handler' => 'default',
131 'handler_settings' => [
132 'sort' => ['field' => '_none'],
138 // Set created node as default_value.
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() . ')',
143 $this->drupalPostForm('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name, $field_edit, t('Save settings'));
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.');
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.');