Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\options\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
6 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
7 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@17
|
8 use Drupal\Tests\field\Functional\FieldTestBase;
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * Tests the Options widgets.
|
Chris@0
|
12 *
|
Chris@0
|
13 * @group options
|
Chris@0
|
14 */
|
Chris@0
|
15 class OptionsWidgetsTest extends FieldTestBase {
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Modules to enable.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @var array
|
Chris@0
|
21 */
|
Chris@0
|
22 public static $modules = ['node', 'options', 'entity_test', 'options_test', 'taxonomy', 'field_ui'];
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * A field storage with cardinality 1 to use in this test class.
|
Chris@0
|
26 *
|
Chris@0
|
27 * @var \Drupal\field\Entity\FieldStorageConfig
|
Chris@0
|
28 */
|
Chris@0
|
29 protected $card1;
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * A field storage with cardinality 2 to use in this test class.
|
Chris@0
|
33 *
|
Chris@0
|
34 * @var \Drupal\field\Entity\FieldStorageConfig
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $card2;
|
Chris@0
|
37
|
Chris@18
|
38 /**
|
Chris@18
|
39 * A field storage with float values to use in this test class.
|
Chris@18
|
40 *
|
Chris@18
|
41 * @var \Drupal\field\Entity\FieldStorageConfig
|
Chris@18
|
42 */
|
Chris@18
|
43 protected $float;
|
Chris@18
|
44
|
Chris@0
|
45 protected function setUp() {
|
Chris@0
|
46 parent::setUp();
|
Chris@0
|
47
|
Chris@0
|
48 // Field storage with cardinality 1.
|
Chris@0
|
49 $this->card1 = FieldStorageConfig::create([
|
Chris@0
|
50 'field_name' => 'card_1',
|
Chris@0
|
51 'entity_type' => 'entity_test',
|
Chris@0
|
52 'type' => 'list_integer',
|
Chris@0
|
53 'cardinality' => 1,
|
Chris@0
|
54 'settings' => [
|
Chris@0
|
55 'allowed_values' => [
|
Chris@0
|
56 // Make sure that 0 works as an option.
|
Chris@0
|
57 0 => 'Zero',
|
Chris@0
|
58 1 => 'One',
|
Chris@0
|
59 // Make sure that option text is properly sanitized.
|
Chris@0
|
60 2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
|
Chris@0
|
61 // Make sure that HTML entities in option text are not double-encoded.
|
Chris@0
|
62 3 => 'Some HTML encoded markup with < & >',
|
Chris@0
|
63 ],
|
Chris@0
|
64 ],
|
Chris@0
|
65 ]);
|
Chris@0
|
66 $this->card1->save();
|
Chris@0
|
67
|
Chris@0
|
68 // Field storage with cardinality 2.
|
Chris@0
|
69 $this->card2 = FieldStorageConfig::create([
|
Chris@0
|
70 'field_name' => 'card_2',
|
Chris@0
|
71 'entity_type' => 'entity_test',
|
Chris@0
|
72 'type' => 'list_integer',
|
Chris@0
|
73 'cardinality' => 2,
|
Chris@0
|
74 'settings' => [
|
Chris@0
|
75 'allowed_values' => [
|
Chris@0
|
76 // Make sure that 0 works as an option.
|
Chris@0
|
77 0 => 'Zero',
|
Chris@0
|
78 1 => 'One',
|
Chris@0
|
79 // Make sure that option text is properly sanitized.
|
Chris@0
|
80 2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
|
Chris@0
|
81 ],
|
Chris@0
|
82 ],
|
Chris@0
|
83 ]);
|
Chris@0
|
84 $this->card2->save();
|
Chris@0
|
85
|
Chris@18
|
86 // Field storage with list of float values.
|
Chris@18
|
87 $this->float = FieldStorageConfig::create([
|
Chris@18
|
88 'field_name' => 'float',
|
Chris@18
|
89 'entity_type' => 'entity_test',
|
Chris@18
|
90 'type' => 'list_float',
|
Chris@18
|
91 'cardinality' => 1,
|
Chris@18
|
92 'settings' => [
|
Chris@18
|
93 'allowed_values' => [
|
Chris@18
|
94 '0.0' => '0.0',
|
Chris@18
|
95 '1.5' => '1.5',
|
Chris@18
|
96 '2.0' => '2.0',
|
Chris@18
|
97 ],
|
Chris@18
|
98 ],
|
Chris@18
|
99 ]);
|
Chris@18
|
100 $this->float->save();
|
Chris@18
|
101
|
Chris@0
|
102 // Create a web user.
|
Chris@0
|
103 $this->drupalLogin($this->drupalCreateUser(['view test entity', 'administer entity_test content']));
|
Chris@0
|
104 }
|
Chris@0
|
105
|
Chris@0
|
106 /**
|
Chris@0
|
107 * Tests the 'options_buttons' widget (single select).
|
Chris@0
|
108 */
|
Chris@0
|
109 public function testRadioButtons() {
|
Chris@0
|
110 // Create an instance of the 'single value' field.
|
Chris@0
|
111 $field = FieldConfig::create([
|
Chris@0
|
112 'field_storage' => $this->card1,
|
Chris@0
|
113 'bundle' => 'entity_test',
|
Chris@0
|
114 ]);
|
Chris@0
|
115 $field->save();
|
Chris@0
|
116 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
117 ->setComponent($this->card1->getName(), [
|
Chris@0
|
118 'type' => 'options_buttons',
|
Chris@0
|
119 ])
|
Chris@0
|
120 ->save();
|
Chris@0
|
121
|
Chris@0
|
122 // Create an entity.
|
Chris@0
|
123 $entity = EntityTest::create([
|
Chris@0
|
124 'user_id' => 1,
|
Chris@0
|
125 'name' => $this->randomMachineName(),
|
Chris@0
|
126 ]);
|
Chris@0
|
127 $entity->save();
|
Chris@0
|
128 $entity_init = clone $entity;
|
Chris@0
|
129
|
Chris@0
|
130 // With no field data, no buttons are checked.
|
Chris@0
|
131 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
132 $this->assertNoFieldChecked('edit-card-1-0');
|
Chris@0
|
133 $this->assertNoFieldChecked('edit-card-1-1');
|
Chris@0
|
134 $this->assertNoFieldChecked('edit-card-1-2');
|
Chris@0
|
135 $this->assertRaw('Some dangerous & unescaped <strong>markup</strong>', 'Option text was properly filtered.');
|
Chris@0
|
136 $this->assertRaw('Some HTML encoded markup with < & >');
|
Chris@0
|
137
|
Chris@0
|
138 // Select first option.
|
Chris@0
|
139 $edit = ['card_1' => 0];
|
Chris@0
|
140 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
141 $this->assertFieldValues($entity_init, 'card_1', [0]);
|
Chris@0
|
142
|
Chris@0
|
143 // Check that the selected button is checked.
|
Chris@0
|
144 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
145 $this->assertFieldChecked('edit-card-1-0');
|
Chris@0
|
146 $this->assertNoFieldChecked('edit-card-1-1');
|
Chris@0
|
147 $this->assertNoFieldChecked('edit-card-1-2');
|
Chris@0
|
148
|
Chris@0
|
149 // Unselect option.
|
Chris@0
|
150 $edit = ['card_1' => '_none'];
|
Chris@0
|
151 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
152 $this->assertFieldValues($entity_init, 'card_1', []);
|
Chris@0
|
153
|
Chris@0
|
154 // Check that required radios with one option is auto-selected.
|
Chris@0
|
155 $this->card1->setSetting('allowed_values', [99 => 'Only allowed value']);
|
Chris@0
|
156 $this->card1->save();
|
Chris@0
|
157 $field->setRequired(TRUE);
|
Chris@0
|
158 $field->save();
|
Chris@0
|
159 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
160 $this->assertFieldChecked('edit-card-1-99');
|
Chris@0
|
161 }
|
Chris@0
|
162
|
Chris@0
|
163 /**
|
Chris@0
|
164 * Tests the 'options_buttons' widget (multiple select).
|
Chris@0
|
165 */
|
Chris@0
|
166 public function testCheckBoxes() {
|
Chris@0
|
167 // Create an instance of the 'multiple values' field.
|
Chris@0
|
168 $field = FieldConfig::create([
|
Chris@0
|
169 'field_storage' => $this->card2,
|
Chris@0
|
170 'bundle' => 'entity_test',
|
Chris@0
|
171 ]);
|
Chris@0
|
172 $field->save();
|
Chris@0
|
173 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
174 ->setComponent($this->card2->getName(), [
|
Chris@0
|
175 'type' => 'options_buttons',
|
Chris@0
|
176 ])
|
Chris@0
|
177 ->save();
|
Chris@0
|
178
|
Chris@0
|
179 // Create an entity.
|
Chris@0
|
180 $entity = EntityTest::create([
|
Chris@0
|
181 'user_id' => 1,
|
Chris@0
|
182 'name' => $this->randomMachineName(),
|
Chris@0
|
183 ]);
|
Chris@0
|
184 $entity->save();
|
Chris@0
|
185 $entity_init = clone $entity;
|
Chris@0
|
186
|
Chris@0
|
187 // Display form: with no field data, nothing is checked.
|
Chris@0
|
188 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
189 $this->assertNoFieldChecked('edit-card-2-0');
|
Chris@0
|
190 $this->assertNoFieldChecked('edit-card-2-1');
|
Chris@0
|
191 $this->assertNoFieldChecked('edit-card-2-2');
|
Chris@0
|
192 $this->assertRaw('Some dangerous & unescaped <strong>markup</strong>', 'Option text was properly filtered.');
|
Chris@0
|
193
|
Chris@0
|
194 // Submit form: select first and third options.
|
Chris@0
|
195 $edit = [
|
Chris@0
|
196 'card_2[0]' => TRUE,
|
Chris@0
|
197 'card_2[1]' => FALSE,
|
Chris@0
|
198 'card_2[2]' => TRUE,
|
Chris@0
|
199 ];
|
Chris@0
|
200 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
201 $this->assertFieldValues($entity_init, 'card_2', [0, 2]);
|
Chris@0
|
202
|
Chris@0
|
203 // Display form: check that the right options are selected.
|
Chris@0
|
204 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
205 $this->assertFieldChecked('edit-card-2-0');
|
Chris@0
|
206 $this->assertNoFieldChecked('edit-card-2-1');
|
Chris@0
|
207 $this->assertFieldChecked('edit-card-2-2');
|
Chris@0
|
208
|
Chris@0
|
209 // Submit form: select only first option.
|
Chris@0
|
210 $edit = [
|
Chris@0
|
211 'card_2[0]' => TRUE,
|
Chris@0
|
212 'card_2[1]' => FALSE,
|
Chris@0
|
213 'card_2[2]' => FALSE,
|
Chris@0
|
214 ];
|
Chris@0
|
215 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
216 $this->assertFieldValues($entity_init, 'card_2', [0]);
|
Chris@0
|
217
|
Chris@0
|
218 // Display form: check that the right options are selected.
|
Chris@0
|
219 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
220 $this->assertFieldChecked('edit-card-2-0');
|
Chris@0
|
221 $this->assertNoFieldChecked('edit-card-2-1');
|
Chris@0
|
222 $this->assertNoFieldChecked('edit-card-2-2');
|
Chris@0
|
223
|
Chris@0
|
224 // Submit form: select the three options while the field accepts only 2.
|
Chris@0
|
225 $edit = [
|
Chris@0
|
226 'card_2[0]' => TRUE,
|
Chris@0
|
227 'card_2[1]' => TRUE,
|
Chris@0
|
228 'card_2[2]' => TRUE,
|
Chris@0
|
229 ];
|
Chris@0
|
230 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
231 $this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
|
Chris@0
|
232
|
Chris@0
|
233 // Submit form: uncheck all options.
|
Chris@0
|
234 $edit = [
|
Chris@0
|
235 'card_2[0]' => FALSE,
|
Chris@0
|
236 'card_2[1]' => FALSE,
|
Chris@0
|
237 'card_2[2]' => FALSE,
|
Chris@0
|
238 ];
|
Chris@0
|
239 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
240 // Check that the value was saved.
|
Chris@0
|
241 $this->assertFieldValues($entity_init, 'card_2', []);
|
Chris@0
|
242
|
Chris@0
|
243 // Required checkbox with one option is auto-selected.
|
Chris@0
|
244 $this->card2->setSetting('allowed_values', [99 => 'Only allowed value']);
|
Chris@0
|
245 $this->card2->save();
|
Chris@0
|
246 $field->setRequired(TRUE);
|
Chris@0
|
247 $field->save();
|
Chris@0
|
248 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
249 $this->assertFieldChecked('edit-card-2-99');
|
Chris@0
|
250 }
|
Chris@0
|
251
|
Chris@0
|
252 /**
|
Chris@0
|
253 * Tests the 'options_select' widget (single select).
|
Chris@0
|
254 */
|
Chris@0
|
255 public function testSelectListSingle() {
|
Chris@0
|
256 // Create an instance of the 'single value' field.
|
Chris@0
|
257 $field = FieldConfig::create([
|
Chris@0
|
258 'field_storage' => $this->card1,
|
Chris@0
|
259 'bundle' => 'entity_test',
|
Chris@0
|
260 'required' => TRUE,
|
Chris@0
|
261 ]);
|
Chris@0
|
262 $field->save();
|
Chris@0
|
263 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
264 ->setComponent($this->card1->getName(), [
|
Chris@0
|
265 'type' => 'options_select',
|
Chris@0
|
266 ])
|
Chris@0
|
267 ->save();
|
Chris@0
|
268
|
Chris@0
|
269 // Create an entity.
|
Chris@0
|
270 $entity = EntityTest::create([
|
Chris@0
|
271 'user_id' => 1,
|
Chris@0
|
272 'name' => $this->randomMachineName(),
|
Chris@0
|
273 ]);
|
Chris@0
|
274 $entity->save();
|
Chris@0
|
275 $entity_init = clone $entity;
|
Chris@0
|
276
|
Chris@0
|
277 // Display form.
|
Chris@0
|
278 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
279 // A required field without any value has a "none" option.
|
Chris@17
|
280 $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- Select a value -']), 'A required select list has a "Select a value" choice.');
|
Chris@0
|
281
|
Chris@0
|
282 // With no field data, nothing is selected.
|
Chris@17
|
283 $this->assertTrue($this->assertSession()->optionExists('card_1', '_none')->isSelected());
|
Chris@17
|
284 $this->assertFalse($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
Chris@17
|
285 $this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
Chris@17
|
286 $this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
Chris@0
|
287 $this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
Chris@0
|
288
|
Chris@0
|
289 // Submit form: select invalid 'none' option.
|
Chris@0
|
290 $edit = ['card_1' => '_none'];
|
Chris@0
|
291 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
292 $this->assertRaw(t('@title field is required.', ['@title' => $field->getName()]), 'Cannot save a required field when selecting "none" from the select list.');
|
Chris@0
|
293
|
Chris@0
|
294 // Submit form: select first option.
|
Chris@0
|
295 $edit = ['card_1' => 0];
|
Chris@0
|
296 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
297 $this->assertFieldValues($entity_init, 'card_1', [0]);
|
Chris@0
|
298
|
Chris@0
|
299 // Display form: check that the right options are selected.
|
Chris@0
|
300 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
301 // A required field with a value has no 'none' option.
|
Chris@0
|
302 $this->assertFalse($this->xpath('//select[@id=:id]//option[@value="_none"]', [':id' => 'edit-card-1']), 'A required select list with an actual value has no "none" choice.');
|
Chris@17
|
303 $this->assertTrue($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
Chris@17
|
304 $this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
Chris@17
|
305 $this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
Chris@0
|
306
|
Chris@0
|
307 // Make the field non required.
|
Chris@0
|
308 $field->setRequired(FALSE);
|
Chris@0
|
309 $field->save();
|
Chris@0
|
310
|
Chris@0
|
311 // Display form.
|
Chris@0
|
312 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
313 // A non-required field has a 'none' option.
|
Chris@17
|
314 $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- None -']), 'A non-required select list has a "None" choice.');
|
Chris@0
|
315 // Submit form: Unselect the option.
|
Chris@0
|
316 $edit = ['card_1' => '_none'];
|
Chris@0
|
317 $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
318 $this->assertFieldValues($entity_init, 'card_1', []);
|
Chris@0
|
319
|
Chris@0
|
320 // Test optgroups.
|
Chris@0
|
321
|
Chris@0
|
322 $this->card1->setSetting('allowed_values', []);
|
Chris@0
|
323 $this->card1->setSetting('allowed_values_function', 'options_test_allowed_values_callback');
|
Chris@0
|
324 $this->card1->save();
|
Chris@0
|
325
|
Chris@0
|
326 // Display form: with no field data, nothing is selected
|
Chris@0
|
327 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
328 $this->assertFalse($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
Chris@17
|
329 $this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
Chris@17
|
330 $this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
Chris@0
|
331 $this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
Chris@0
|
332 $this->assertRaw('More <script>dangerous</script> markup', 'Option group text was properly filtered.');
|
Chris@0
|
333 $this->assertRaw('Group 1', 'Option groups are displayed.');
|
Chris@0
|
334
|
Chris@0
|
335 // Submit form: select first option.
|
Chris@0
|
336 $edit = ['card_1' => 0];
|
Chris@0
|
337 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
338 $this->assertFieldValues($entity_init, 'card_1', [0]);
|
Chris@0
|
339
|
Chris@0
|
340 // Display form: check that the right options are selected.
|
Chris@0
|
341 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
342 $this->assertTrue($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
Chris@17
|
343 $this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
Chris@17
|
344 $this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
Chris@0
|
345
|
Chris@0
|
346 // Submit form: Unselect the option.
|
Chris@0
|
347 $edit = ['card_1' => '_none'];
|
Chris@0
|
348 $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
349 $this->assertFieldValues($entity_init, 'card_1', []);
|
Chris@0
|
350 }
|
Chris@0
|
351
|
Chris@0
|
352 /**
|
Chris@0
|
353 * Tests the 'options_select' widget (multiple select).
|
Chris@0
|
354 */
|
Chris@0
|
355 public function testSelectListMultiple() {
|
Chris@0
|
356 // Create an instance of the 'multiple values' field.
|
Chris@0
|
357 $field = FieldConfig::create([
|
Chris@0
|
358 'field_storage' => $this->card2,
|
Chris@0
|
359 'bundle' => 'entity_test',
|
Chris@0
|
360 ]);
|
Chris@0
|
361 $field->save();
|
Chris@0
|
362 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
363 ->setComponent($this->card2->getName(), [
|
Chris@0
|
364 'type' => 'options_select',
|
Chris@0
|
365 ])
|
Chris@0
|
366 ->save();
|
Chris@0
|
367
|
Chris@0
|
368 // Create an entity.
|
Chris@0
|
369 $entity = EntityTest::create([
|
Chris@0
|
370 'user_id' => 1,
|
Chris@0
|
371 'name' => $this->randomMachineName(),
|
Chris@0
|
372 ]);
|
Chris@0
|
373 $entity->save();
|
Chris@0
|
374 $entity_init = clone $entity;
|
Chris@0
|
375
|
Chris@0
|
376 // Display form: with no field data, nothing is selected.
|
Chris@0
|
377 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
378 $this->assertTrue($this->assertSession()->optionExists('card_2', '_none')->isSelected());
|
Chris@17
|
379 $this->assertFalse($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
Chris@17
|
380 $this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
Chris@17
|
381 $this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
Chris@0
|
382 $this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
Chris@0
|
383
|
Chris@0
|
384 // Submit form: select first and third options.
|
Chris@0
|
385 $edit = ['card_2[]' => [0 => 0, 2 => 2]];
|
Chris@0
|
386 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
387 $this->assertFieldValues($entity_init, 'card_2', [0, 2]);
|
Chris@0
|
388
|
Chris@0
|
389 // Display form: check that the right options are selected.
|
Chris@0
|
390 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
391 $this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
Chris@17
|
392 $this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
Chris@17
|
393 $this->assertTrue($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
Chris@0
|
394
|
Chris@0
|
395 // Submit form: select only first option.
|
Chris@0
|
396 $edit = ['card_2[]' => [0 => 0]];
|
Chris@0
|
397 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
398 $this->assertFieldValues($entity_init, 'card_2', [0]);
|
Chris@0
|
399
|
Chris@0
|
400 // Display form: check that the right options are selected.
|
Chris@0
|
401 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
402 $this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
Chris@17
|
403 $this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
Chris@17
|
404 $this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
Chris@0
|
405
|
Chris@0
|
406 // Submit form: select the three options while the field accepts only 2.
|
Chris@0
|
407 $edit = ['card_2[]' => [0 => 0, 1 => 1, 2 => 2]];
|
Chris@0
|
408 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
409 $this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
|
Chris@0
|
410
|
Chris@0
|
411 // Submit form: uncheck all options.
|
Chris@0
|
412 $edit = ['card_2[]' => []];
|
Chris@0
|
413 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
414 $this->assertFieldValues($entity_init, 'card_2', []);
|
Chris@0
|
415
|
Chris@0
|
416 // Test the 'None' option.
|
Chris@0
|
417
|
Chris@0
|
418 // Check that the 'none' option has no effect if actual options are selected
|
Chris@0
|
419 // as well.
|
Chris@0
|
420 $edit = ['card_2[]' => ['_none' => '_none', 0 => 0]];
|
Chris@0
|
421 $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
422 $this->assertFieldValues($entity_init, 'card_2', [0]);
|
Chris@0
|
423
|
Chris@0
|
424 // Check that selecting the 'none' option empties the field.
|
Chris@0
|
425 $edit = ['card_2[]' => ['_none' => '_none']];
|
Chris@0
|
426 $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
427 $this->assertFieldValues($entity_init, 'card_2', []);
|
Chris@0
|
428
|
Chris@0
|
429 // A required select list does not have an empty key.
|
Chris@0
|
430 $field->setRequired(TRUE);
|
Chris@0
|
431 $field->save();
|
Chris@0
|
432 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
433 $this->assertFalse($this->xpath('//select[@id=:id]//option[@value=""]', [':id' => 'edit-card-2']), 'A required select list does not have an empty key.');
|
Chris@0
|
434
|
Chris@0
|
435 // We do not have to test that a required select list with one option is
|
Chris@0
|
436 // auto-selected because the browser does it for us.
|
Chris@0
|
437
|
Chris@0
|
438 // Test optgroups.
|
Chris@0
|
439
|
Chris@0
|
440 // Use a callback function defining optgroups.
|
Chris@0
|
441 $this->card2->setSetting('allowed_values', []);
|
Chris@0
|
442 $this->card2->setSetting('allowed_values_function', 'options_test_allowed_values_callback');
|
Chris@0
|
443 $this->card2->save();
|
Chris@0
|
444 $field->setRequired(FALSE);
|
Chris@0
|
445 $field->save();
|
Chris@0
|
446
|
Chris@0
|
447 // Display form: with no field data, nothing is selected.
|
Chris@0
|
448 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
449 $this->assertFalse($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
Chris@17
|
450 $this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
Chris@17
|
451 $this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
Chris@0
|
452 $this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
Chris@0
|
453 $this->assertRaw('More <script>dangerous</script> markup', 'Option group text was properly filtered.');
|
Chris@0
|
454 $this->assertRaw('Group 1', 'Option groups are displayed.');
|
Chris@0
|
455
|
Chris@0
|
456 // Submit form: select first option.
|
Chris@0
|
457 $edit = ['card_2[]' => [0 => 0]];
|
Chris@0
|
458 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
459 $this->assertFieldValues($entity_init, 'card_2', [0]);
|
Chris@0
|
460
|
Chris@0
|
461 // Display form: check that the right options are selected.
|
Chris@0
|
462 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@17
|
463 $this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
Chris@17
|
464 $this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
Chris@17
|
465 $this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
Chris@0
|
466
|
Chris@0
|
467 // Submit form: Unselect the option.
|
Chris@0
|
468 $edit = ['card_2[]' => ['_none' => '_none']];
|
Chris@0
|
469 $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
470 $this->assertFieldValues($entity_init, 'card_2', []);
|
Chris@0
|
471 }
|
Chris@0
|
472
|
Chris@0
|
473 /**
|
Chris@18
|
474 * Tests the 'options_select' widget (float values).
|
Chris@18
|
475 */
|
Chris@18
|
476 public function testSelectListFloat() {
|
Chris@18
|
477
|
Chris@18
|
478 // Create an instance of the 'float value' field.
|
Chris@18
|
479 $field = FieldConfig::create([
|
Chris@18
|
480 'field_storage' => $this->float,
|
Chris@18
|
481 'bundle' => 'entity_test',
|
Chris@18
|
482 'required' => TRUE,
|
Chris@18
|
483 ]);
|
Chris@18
|
484 $field->save();
|
Chris@18
|
485
|
Chris@18
|
486 $this->container
|
Chris@18
|
487 ->get('entity_type.manager')
|
Chris@18
|
488 ->getStorage('entity_form_display')
|
Chris@18
|
489 ->load('entity_test.entity_test.default')
|
Chris@18
|
490 ->setComponent($this->float->getName(), ['type' => 'options_select'])
|
Chris@18
|
491 ->save();
|
Chris@18
|
492
|
Chris@18
|
493 // Create an entity.
|
Chris@18
|
494 $entity = EntityTest::create([
|
Chris@18
|
495 'user_id' => 1,
|
Chris@18
|
496 'name' => $this->randomMachineName(),
|
Chris@18
|
497 ]);
|
Chris@18
|
498 $entity->save();
|
Chris@18
|
499
|
Chris@18
|
500 // Display form.
|
Chris@18
|
501 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@18
|
502
|
Chris@18
|
503 // With no field data, nothing is selected.
|
Chris@18
|
504 $this->assertFalse($this->assertSession()->optionExists('float', 0)->isSelected());
|
Chris@18
|
505 $this->assertFalse($this->assertSession()->optionExists('float', 1.5)->isSelected());
|
Chris@18
|
506 $this->assertFalse($this->assertSession()->optionExists('float', 2)->isSelected());
|
Chris@18
|
507
|
Chris@18
|
508 // Submit form.
|
Chris@18
|
509 $edit = ['float' => 1.5];
|
Chris@18
|
510 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@18
|
511 $this->assertFieldValues($entity, 'float', [1.5]);
|
Chris@18
|
512
|
Chris@18
|
513 // Display form: check that the right options are selected.
|
Chris@18
|
514 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@18
|
515 $this->assertFalse($this->assertSession()->optionExists('float', 0)->isSelected());
|
Chris@18
|
516 $this->assertTrue($this->assertSession()->optionExists('float', 1.5)->isSelected());
|
Chris@18
|
517 $this->assertFalse($this->assertSession()->optionExists('float', 2)->isSelected());
|
Chris@18
|
518 }
|
Chris@18
|
519
|
Chris@18
|
520 /**
|
Chris@0
|
521 * Tests the 'options_select' and 'options_button' widget for empty value.
|
Chris@0
|
522 */
|
Chris@0
|
523 public function testEmptyValue() {
|
Chris@0
|
524 // Create an instance of the 'single value' field.
|
Chris@0
|
525 $field = FieldConfig::create([
|
Chris@0
|
526 'field_storage' => $this->card1,
|
Chris@0
|
527 'bundle' => 'entity_test',
|
Chris@0
|
528 ]);
|
Chris@0
|
529 $field->save();
|
Chris@0
|
530
|
Chris@0
|
531 // Change it to the check boxes/radio buttons widget.
|
Chris@0
|
532 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
533 ->setComponent($this->card1->getName(), [
|
Chris@0
|
534 'type' => 'options_buttons',
|
Chris@0
|
535 ])
|
Chris@0
|
536 ->save();
|
Chris@0
|
537
|
Chris@0
|
538 // Create an entity.
|
Chris@0
|
539 $entity = EntityTest::create([
|
Chris@0
|
540 'user_id' => 1,
|
Chris@0
|
541 'name' => $this->randomMachineName(),
|
Chris@0
|
542 ]);
|
Chris@0
|
543 $entity->save();
|
Chris@0
|
544
|
Chris@0
|
545 // Display form: check that _none options are present and has label.
|
Chris@0
|
546 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
547 $this->assertTrue($this->xpath('//div[@id=:id]//input[@value=:value]', [':id' => 'edit-card-1', ':value' => '_none']), 'A test radio button has a "None" choice.');
|
Chris@0
|
548 $this->assertTrue($this->xpath('//div[@id=:id]//label[@for=:for and text()=:label]', [':id' => 'edit-card-1', ':for' => 'edit-card-1-none', ':label' => 'N/A']), 'A test radio button has a "N/A" choice.');
|
Chris@0
|
549
|
Chris@0
|
550 // Change it to the select widget.
|
Chris@0
|
551 entity_get_form_display('entity_test', 'entity_test', 'default')
|
Chris@0
|
552 ->setComponent($this->card1->getName(), [
|
Chris@0
|
553 'type' => 'options_select',
|
Chris@0
|
554 ])
|
Chris@0
|
555 ->save();
|
Chris@0
|
556
|
Chris@0
|
557 // Display form: check that _none options are present and has label.
|
Chris@0
|
558 $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
Chris@0
|
559 // A required field without any value has a "none" option.
|
Chris@17
|
560 $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- None -']), 'A test select has a "None" choice.');
|
Chris@0
|
561 }
|
Chris@0
|
562
|
Chris@0
|
563 }
|