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