You are here

SelectWidgetTest.php in Typed Data API enhancements 8

File

tests/src/Functional/TypedDataFormWidget/SelectWidgetTest.php
View source
<?php

namespace Drupal\Tests\typed_data\Functional\TypedDataFormWidget;

use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\ListDataDefinition;
use Drupal\Core\TypedData\MapDataDefinition;

/**
 * Class SelectWidgetTest.
 *
 * @group typed_data
 *
 * @coversDefaultClass \Drupal\typed_data\Plugin\TypedDataFormWidget\SelectWidget
 */
class SelectWidgetTest extends FormWidgetBrowserTestBase {

  /**
   * The tested form widget.
   *
   * @var \Drupal\typed_data\Widget\FormWidgetInterface
   */
  protected $widget;

  /**
   * Modules to enable, in addition to those specified in the base class.
   *
   * @var array
   */
  protected static $modules = [
    'text',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->widget = $this
      ->getFormWidgetManager()
      ->createInstance('select');
  }

  /**
   * @covers ::isApplicable
   */
  public function testIsApplicable() {
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('any')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('binary')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('boolean')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('datetime_iso8601')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('duration_iso8601')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('email')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('float')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('integer')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('string')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('timespan')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('timestamp')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(DataDefinition::create('uri')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(ListDataDefinition::create('string')));
    $this
      ->assertFalse($this->widget
      ->isApplicable(MapDataDefinition::create()));
    $this
      ->assertTrue($this->widget
      ->isApplicable(DataDefinition::create('filter_format')));
  }

  /**
   * @covers ::form
   * @covers ::extractFormValues
   */
  public function testFormEditing() {
    $context_definition = ContextDefinition::create('filter_format')
      ->setLabel('Filter format')
      ->setDescription('Some example selection.');
    $this->container
      ->get('state')
      ->set('typed_data_widgets.definition', $context_definition);
    $this
      ->drupalLogin($this
      ->createUser([], NULL, TRUE));
    $path = 'admin/config/user-interface/typed-data-widgets/' . $this->widget
      ->getPluginId();
    $this
      ->drupalGet($path);

    /** @var \Drupal\Tests\WebAssert $assert */
    $assert = $this
      ->assertSession();
    $assert
      ->elementTextContains('css', 'label[for=edit-data-value]', $context_definition
      ->getLabel());
    $assert
      ->elementTextContains('css', 'div[id=edit-data-value--description]', $context_definition
      ->getDescription());
    $assert
      ->fieldValueEquals('data[value]', $context_definition
      ->getDefaultValue());
    $this
      ->getSession()
      ->getPage()
      ->selectFieldOption('data[value]', 'plain_text');
    $this
      ->pressButton('Submit');
    $this
      ->drupalGet($path);
    $assert
      ->fieldValueEquals('data[value]', 'plain_text');
  }

  /**
   * @covers ::form
   * @covers ::flagViolations
   */
  public function testValidation() {
    $context_definition = ContextDefinition::create('filter_format')
      ->setLabel('Filter format')
      ->setDescription('Some example selection.')
      ->setRequired(TRUE);
    $this->container
      ->get('state')
      ->set('typed_data_widgets.definition', $context_definition);
    $this
      ->drupalLogin($this
      ->createUser([], NULL, TRUE));
    $path = 'admin/config/user-interface/typed-data-widgets/' . $this->widget
      ->getPluginId();
    $this
      ->drupalGet($path);

    // Set the empty option and make sure it results in a violation.
    $this
      ->fillField('data[value]', '');
    $this
      ->pressButton('Submit');

    /** @var \Drupal\Tests\WebAssert $assert */
    $assert = $this
      ->assertSession();
    $assert
      ->fieldExists('data[value]')
      ->hasClass('error');

    // Make sure the changes have not been saved also.
    $this
      ->drupalGet($path);
    $assert
      ->fieldValueEquals('data[value]', $context_definition
      ->getDefaultValue());
  }

}

Classes

Namesort descending Description
SelectWidgetTest Class SelectWidgetTest.