annotate core/modules/options/tests/src/Functional/OptionsWidgetsTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
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 &lt; &amp; &gt;',
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 &amp; unescaped <strong>markup</strong>', 'Option text was properly filtered.');
Chris@0 136 $this->assertRaw('Some HTML encoded markup with &lt; &amp; &gt;');
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 &amp; 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 &amp; 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 &amp; unescaped markup', 'Option text was properly filtered.');
Chris@0 332 $this->assertRaw('More &lt;script&gt;dangerous&lt;/script&gt; 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 &amp; 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 &amp; unescaped markup', 'Option text was properly filtered.');
Chris@0 453 $this->assertRaw('More &lt;script&gt;dangerous&lt;/script&gt; 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 }