Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\link\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\UrlHelper;
|
Chris@0
|
6 use Drupal\Core\Field\FieldItemListInterface;
|
Chris@0
|
7 use Drupal\Core\Field\FieldItemInterface;
|
Chris@0
|
8 use Drupal\Core\Url;
|
Chris@0
|
9 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
10 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
11 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
12 use Drupal\Tests\field\Kernel\FieldKernelTestBase;
|
Chris@0
|
13 use Drupal\link\LinkItemInterface;
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * Tests the new entity API for the link field type.
|
Chris@0
|
17 *
|
Chris@0
|
18 * @group link
|
Chris@0
|
19 */
|
Chris@0
|
20 class LinkItemTest extends FieldKernelTestBase {
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * Modules to enable.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var array
|
Chris@0
|
26 */
|
Chris@0
|
27 public static $modules = ['link'];
|
Chris@0
|
28
|
Chris@0
|
29 protected function setUp() {
|
Chris@0
|
30 parent::setUp();
|
Chris@0
|
31
|
Chris@0
|
32 // Create a generic, external, and internal link fields for validation.
|
Chris@0
|
33 FieldStorageConfig::create([
|
Chris@0
|
34 'field_name' => 'field_test',
|
Chris@0
|
35 'entity_type' => 'entity_test',
|
Chris@0
|
36 'type' => 'link',
|
Chris@0
|
37 ])->save();
|
Chris@0
|
38 FieldConfig::create([
|
Chris@0
|
39 'entity_type' => 'entity_test',
|
Chris@0
|
40 'field_name' => 'field_test',
|
Chris@0
|
41 'bundle' => 'entity_test',
|
Chris@0
|
42 'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC],
|
Chris@0
|
43 ])->save();
|
Chris@0
|
44 FieldStorageConfig::create([
|
Chris@0
|
45 'field_name' => 'field_test_external',
|
Chris@0
|
46 'entity_type' => 'entity_test',
|
Chris@0
|
47 'type' => 'link',
|
Chris@0
|
48 ])->save();
|
Chris@0
|
49 FieldConfig::create([
|
Chris@0
|
50 'entity_type' => 'entity_test',
|
Chris@0
|
51 'field_name' => 'field_test_external',
|
Chris@0
|
52 'bundle' => 'entity_test',
|
Chris@0
|
53 'settings' => ['link_type' => LinkItemInterface::LINK_EXTERNAL],
|
Chris@0
|
54 ])->save();
|
Chris@0
|
55 FieldStorageConfig::create([
|
Chris@0
|
56 'field_name' => 'field_test_internal',
|
Chris@0
|
57 'entity_type' => 'entity_test',
|
Chris@0
|
58 'type' => 'link',
|
Chris@0
|
59 ])->save();
|
Chris@0
|
60 FieldConfig::create([
|
Chris@0
|
61 'entity_type' => 'entity_test',
|
Chris@0
|
62 'field_name' => 'field_test_internal',
|
Chris@0
|
63 'bundle' => 'entity_test',
|
Chris@0
|
64 'settings' => ['link_type' => LinkItemInterface::LINK_INTERNAL],
|
Chris@0
|
65 ])->save();
|
Chris@0
|
66 }
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * Tests using entity fields of the link field type.
|
Chris@0
|
70 */
|
Chris@0
|
71 public function testLinkItem() {
|
Chris@0
|
72 // Create entity.
|
Chris@0
|
73 $entity = EntityTest::create();
|
Chris@0
|
74 $url = 'https://www.drupal.org?test_param=test_value';
|
Chris@0
|
75 $parsed_url = UrlHelper::parse($url);
|
Chris@0
|
76 $title = $this->randomMachineName();
|
Chris@0
|
77 $class = $this->randomMachineName();
|
Chris@0
|
78 $entity->field_test->uri = $parsed_url['path'];
|
Chris@0
|
79 $entity->field_test->title = $title;
|
Chris@0
|
80 $entity->field_test->first()->get('options')->set('query', $parsed_url['query']);
|
Chris@0
|
81 $entity->field_test->first()->get('options')->set('attributes', ['class' => $class]);
|
Chris@0
|
82 $this->assertEquals([
|
Chris@0
|
83 'query' => $parsed_url['query'],
|
Chris@0
|
84 'attributes' => [
|
Chris@0
|
85 'class' => $class,
|
Chris@0
|
86 ],
|
Chris@0
|
87 'external' => TRUE,
|
Chris@0
|
88 ], $entity->field_test->first()->getUrl()->getOptions());
|
Chris@0
|
89 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
90 $entity->save();
|
Chris@0
|
91
|
Chris@0
|
92 // Verify that the field value is changed.
|
Chris@0
|
93 $id = $entity->id();
|
Chris@0
|
94 $entity = EntityTest::load($id);
|
Chris@0
|
95 $this->assertTrue($entity->field_test instanceof FieldItemListInterface, 'Field implements interface.');
|
Chris@0
|
96 $this->assertTrue($entity->field_test[0] instanceof FieldItemInterface, 'Field item implements interface.');
|
Chris@0
|
97 $this->assertEqual($entity->field_test->uri, $parsed_url['path']);
|
Chris@0
|
98 $this->assertEqual($entity->field_test[0]->uri, $parsed_url['path']);
|
Chris@0
|
99 $this->assertEqual($entity->field_test->title, $title);
|
Chris@0
|
100 $this->assertEqual($entity->field_test[0]->title, $title);
|
Chris@0
|
101 $this->assertEqual($entity->field_test->options['attributes']['class'], $class);
|
Chris@0
|
102 $this->assertEqual($entity->field_test->options['query'], $parsed_url['query']);
|
Chris@0
|
103
|
Chris@0
|
104 // Update only the entity name property to check if the link field data will
|
Chris@0
|
105 // remain intact.
|
Chris@0
|
106 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
107 $entity->save();
|
Chris@0
|
108 $id = $entity->id();
|
Chris@0
|
109 $entity = EntityTest::load($id);
|
Chris@0
|
110 $this->assertEqual($entity->field_test->uri, $parsed_url['path']);
|
Chris@0
|
111 $this->assertEqual($entity->field_test->options['attributes']['class'], $class);
|
Chris@0
|
112 $this->assertEqual($entity->field_test->options['query'], $parsed_url['query']);
|
Chris@0
|
113
|
Chris@0
|
114 // Verify changing the field value.
|
Chris@0
|
115 $new_url = 'https://www.drupal.org';
|
Chris@0
|
116 $new_title = $this->randomMachineName();
|
Chris@0
|
117 $new_class = $this->randomMachineName();
|
Chris@0
|
118 $entity->field_test->uri = $new_url;
|
Chris@0
|
119 $entity->field_test->title = $new_title;
|
Chris@0
|
120 $entity->field_test->first()->get('options')->set('query', NULL);
|
Chris@0
|
121 $entity->field_test->first()->get('options')->set('attributes', ['class' => $new_class]);
|
Chris@0
|
122 $this->assertEqual($entity->field_test->uri, $new_url);
|
Chris@0
|
123 $this->assertEqual($entity->field_test->title, $new_title);
|
Chris@0
|
124 $this->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
|
Chris@0
|
125 $this->assertNull($entity->field_test->options['query']);
|
Chris@0
|
126
|
Chris@0
|
127 // Read changed entity and assert changed values.
|
Chris@0
|
128 $entity->save();
|
Chris@0
|
129 $entity = EntityTest::load($id);
|
Chris@0
|
130 $this->assertEqual($entity->field_test->uri, $new_url);
|
Chris@0
|
131 $this->assertEqual($entity->field_test->title, $new_title);
|
Chris@0
|
132 $this->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
|
Chris@0
|
133
|
Chris@0
|
134 // Check that if we only set uri the default values for title and options
|
Chris@0
|
135 // are also initialized.
|
Chris@0
|
136 $entity->field_test = ['uri' => 'internal:/node/add'];
|
Chris@0
|
137 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
|
Chris@0
|
138 $this->assertNull($entity->field_test->title);
|
Chris@0
|
139 $this->assertIdentical($entity->field_test->options, []);
|
Chris@0
|
140
|
Chris@18
|
141 // Check that if we set uri and options then the default values are properly
|
Chris@18
|
142 // initialized.
|
Chris@0
|
143 $entity->field_test = [
|
Chris@0
|
144 'uri' => 'internal:/node/add',
|
Chris@18
|
145 'options' => ['query' => NULL],
|
Chris@0
|
146 ];
|
Chris@0
|
147 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
|
Chris@0
|
148 $this->assertNull($entity->field_test->title);
|
Chris@0
|
149 $this->assertNull($entity->field_test->options['query']);
|
Chris@0
|
150
|
Chris@0
|
151 // Check that if we set the direct value of link field it correctly set the
|
Chris@0
|
152 // uri and the default values of the field.
|
Chris@0
|
153 $entity->field_test = 'internal:/node/add';
|
Chris@0
|
154 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
|
Chris@0
|
155 $this->assertNull($entity->field_test->title);
|
Chris@0
|
156 $this->assertIdentical($entity->field_test->options, []);
|
Chris@0
|
157
|
Chris@0
|
158 // Check that setting options to NULL does not trigger an error when
|
Chris@0
|
159 // calling getUrl();
|
Chris@0
|
160 $entity->field_test->options = NULL;
|
Chris@0
|
161 $this->assertInstanceOf(Url::class, $entity->field_test[0]->getUrl());
|
Chris@0
|
162
|
Chris@0
|
163 // Check that setting LinkItem value NULL doesn't generate any error or
|
Chris@0
|
164 // warning.
|
Chris@0
|
165 $entity->field_test[0] = NULL;
|
Chris@0
|
166 $this->assertNull($entity->field_test[0]->getValue());
|
Chris@0
|
167
|
Chris@0
|
168 // Test the generateSampleValue() method for generic, external, and internal
|
Chris@0
|
169 // link types.
|
Chris@0
|
170 $entity = EntityTest::create();
|
Chris@0
|
171 $entity->field_test->generateSampleItems();
|
Chris@0
|
172 $entity->field_test_external->generateSampleItems();
|
Chris@0
|
173 $entity->field_test_internal->generateSampleItems();
|
Chris@0
|
174 $this->entityValidateAndSave($entity);
|
Chris@0
|
175 }
|
Chris@0
|
176
|
Chris@18
|
177 /**
|
Chris@18
|
178 * Tests the deprecated behavior of LinkItem::setValue().
|
Chris@18
|
179 *
|
Chris@18
|
180 * @group legacy
|
Chris@18
|
181 * @expectedDeprecation Support for passing options as a serialized string is deprecated in 8.7.0 and will be removed before Drupal 9.0.0. Pass them as an array instead. See https://www.drupal.org/node/2961643.
|
Chris@18
|
182 */
|
Chris@18
|
183 public function testSerializedOptions() {
|
Chris@18
|
184 // Check that if we set uri and options then the default values are
|
Chris@18
|
185 // properly initialized.
|
Chris@18
|
186 $entity = EntityTest::create();
|
Chris@18
|
187 $entity->set('field_test', [
|
Chris@18
|
188 'uri' => 'internal:/node/add',
|
Chris@18
|
189 'options' => serialize(['query' => NULL]),
|
Chris@18
|
190 ]);
|
Chris@18
|
191 $this->assertEquals('internal:/node/add', $entity->get('field_test')->uri);
|
Chris@18
|
192 $this->assertNull($entity->get('field_test')->title);
|
Chris@18
|
193 $this->assertNull($entity->get('field_test')->options['query']);
|
Chris@18
|
194 }
|
Chris@18
|
195
|
Chris@0
|
196 }
|