View source
<?php
namespace Drupal\Tests\multiple_selects\Functional;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Entity\FieldConfig;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait;
class MultipleSelectsWidgetUiTest extends BrowserTestBase {
use EntityReferenceTestTrait;
use TaxonomyTestTrait;
protected static $modules = [
'multiple_selects',
'node',
'field_ui',
'taxonomy',
];
protected $defaultTheme = 'stark';
protected $tags = [];
protected $moduleInstaller;
protected function setUp() : void {
parent::setUp();
$this
->drupalLogin($this->rootUser);
$this
->drupalCreateContentType([
'type' => 'page',
]);
$vocabulary = Vocabulary::create([
'vid' => 'tags',
'name' => 'tags',
]);
$vocabulary
->save();
for ($i = 0; $i < 10; $i++) {
$this->tags[] = $this
->createTerm($vocabulary);
}
$handler_settings = [
'target_bundles' => [
$vocabulary
->id() => $vocabulary
->id(),
],
'auto_create' => TRUE,
'auto_create_bundle' => $vocabulary
->id(),
];
$this
->createEntityReferenceField('node', 'page', 'field_tags', 'Tags', 'taxonomy_term', 'default', $handler_settings, FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
$this->container
->get('entity_display.repository')
->getFormDisplay('node', 'page')
->setComponent('field_tags', [
'type' => 'multiple_options_select',
])
->save();
$this->moduleInstaller = $this->container
->get('module_installer');
}
public function testWidget() {
$this
->drupalGet('node/add/page');
$this
->assertSession()
->selectExists('field_tags[0][target_id]');
$this
->assertSession()
->fieldNotExists('field_tags[1][target_id]');
$this
->assertSession()
->buttonExists('Add another item');
$this
->click('.field--name-field-tags .field-add-more-submit');
$this
->assertSession()
->selectExists('field_tags[0][target_id]');
$this
->assertSession()
->selectExists('field_tags[1][target_id]');
$title = $this
->randomMachineName();
$tag_1_key = array_rand($this->tags);
$tag_1 = $this->tags[$tag_1_key];
$tag_2_key = array_rand($this->tags);
$tag_2 = $this->tags[$tag_2_key];
$this
->submitForm([
'title[0][value]' => $title,
'field_tags[0][target_id]' => $tag_1
->id(),
'field_tags[1][target_id]' => $tag_2
->id(),
], 'Save');
$this
->assertSession()
->pageTextContains("Page {$title} has been created.");
$node = $this
->drupalGetNodeByTitle($title);
$this
->assertEquals($tag_1
->id(), $node
->get('field_tags')
->get(0)->target_id);
$this
->assertEquals($tag_2
->id(), $node
->get('field_tags')
->get(1)->target_id);
$this
->assertEmpty($node
->get('field_tags')
->get(2));
$this
->drupalGet('node/' . $node
->id() . '/edit');
$tag_value_1 = $this
->assertSession()
->selectExists('field_tags[0][target_id]')
->getValue();
$this
->assertEquals($tag_1
->id(), $tag_value_1);
$tag_value_2 = $this
->assertSession()
->selectExists('field_tags[1][target_id]')
->getValue();
$this
->assertEquals($tag_2
->id(), $tag_value_2);
$tag_value_3 = $this
->assertSession()
->selectExists('field_tags[2][target_id]')
->getValue();
$this
->assertEquals('_none', $tag_value_3);
}
public function testWidgetRequired() {
$field_config = FieldConfig::loadByName('node', 'page', 'field_tags');
$field_config
->setRequired(TRUE);
$field_config
->save();
$title = $this
->randomMachineName();
$this
->drupalGet('node/add/page');
$this
->submitForm([
'title[0][value]' => $title,
], 'Save');
$this
->assertSession()
->pageTextContains('Tags field is required.');
$tag_1_key = array_rand($this->tags);
$tag_1 = $this->tags[$tag_1_key];
$this
->submitForm([
'title[0][value]' => $title,
'field_tags[0][target_id]' => $tag_1
->id(),
], 'Save');
$node = $this
->drupalGetNodeByTitle($title);
$this
->drupalGet('node/' . $node
->id() . '/edit');
$this
->submitForm([
'title[0][value]' => $title,
'field_tags[0][target_id]' => $tag_1
->id(),
], 'Save');
$this
->assertSession()
->pageTextContains("Page {$title} has been updated.");
}
public function testCardinality() {
$field_storage_config = FieldStorageConfig::loadByName('node', 'field_tags');
$field_storage_config
->setCardinality(3);
$field_storage_config
->save();
$this
->drupalGet('node/add/page');
$this
->assertSession()
->selectExists('field_tags[0][target_id]');
$this
->assertSession()
->selectExists('field_tags[1][target_id]');
$this
->assertSession()
->selectExists('field_tags[2][target_id]');
$this
->assertSession()
->fieldNotExists('field_tags[4][target_id]');
$this
->assertSession()
->buttonNotExists('Add another item');
}
public function testSingleWidget() {
$field_storage_config = FieldStorageConfig::loadByName('node', 'field_tags');
$field_storage_config
->setCardinality(1);
$field_storage_config
->save();
$this
->drupalGet('node/add/page');
$this
->assertSession()
->selectExists('field_tags[0][target_id]');
$this
->assertSession()
->fieldNotExists('field_tags[1][target_id]');
$this
->assertSession()
->buttonNotExists('Add another item');
$title = $this
->randomMachineName();
$tag_1_key = array_rand($this->tags);
$tag_1 = $this->tags[$tag_1_key];
$this
->submitForm([
'title[0][value]' => $title,
'field_tags[0][target_id]' => $tag_1
->id(),
], 'Save');
$this
->assertSession()
->pageTextContains("Page {$title} has been created.");
$node = $this
->drupalGetNodeByTitle($title);
$this
->assertEquals($tag_1
->id(), $node
->get('field_tags')
->get(0)->target_id);
$this
->assertEmpty($node
->get('field_tags')
->get(1));
$this
->drupalGet('node/' . $node
->id() . '/edit');
$tag_value_1 = $this
->assertSession()
->selectExists('field_tags[0][target_id]')
->getValue();
$this
->assertEquals($tag_1
->id(), $tag_value_1);
$this
->assertSession()
->fieldNotExists('field_tags[1][target_id]');
}
public function testSingleWidgetRequired() {
$field_storage_config = FieldStorageConfig::loadByName('node', 'field_tags');
$field_storage_config
->setCardinality(1);
$field_storage_config
->save();
$field_config = FieldConfig::loadByName('node', 'page', 'field_tags');
$field_config
->setRequired(TRUE);
$field_config
->save();
$title = $this
->randomMachineName();
$this
->drupalGet('node/add/page');
$this
->submitForm([
'title[0][value]' => $title,
], 'Save');
$this
->assertSession()
->pageTextContains('Tags field is required.');
$tag_1_key = array_rand($this->tags);
$tag_1 = $this->tags[$tag_1_key];
$this
->submitForm([
'title[0][value]' => $title,
'field_tags[0][target_id]' => $tag_1
->id(),
], 'Save');
$this
->assertSession()
->pageTextContains("Page {$title} has been created.");
}
public function testWidgetSettings() {
$this
->drupalGet('admin/structure/types/manage/page/form-display');
$this
->getSession()
->getPage()
->pressButton('field_tags_settings_edit');
$this
->assertSession()
->optionExists('fields[field_tags][settings_edit_form][settings][element_type]', 'select');
$this
->assertSession()
->optionNotExists('fields[field_tags][settings_edit_form][settings][element_type]', 'select2');
$this->moduleInstaller
->install([
'select2',
]);
$this
->drupalGet('admin/structure/types/manage/page/form-display');
$this
->getSession()
->getPage()
->pressButton('field_tags_settings_edit');
$this
->assertSession()
->optionExists('fields[field_tags][settings_edit_form][settings][element_type]', 'select');
$this
->assertSession()
->optionExists('fields[field_tags][settings_edit_form][settings][element_type]', 'select2');
$this
->getSession()
->getPage()
->selectFieldOption('fields[field_tags][settings_edit_form][settings][element_type]', 'select2');
$this
->getSession()
->getPage()
->pressButton('field_tags_plugin_settings_update');
$this
->getSession()
->getPage()
->pressButton('Save');
$entity_form_display = EntityFormDisplay::load('node.page.default');
$this
->assertEquals('select2', $entity_form_display
->getComponent('field_tags')['settings']['element_type']);
}
public function testSelect2Widget() {
$this->moduleInstaller
->install([
'select2',
]);
$entity_form_display = EntityFormDisplay::load('node.page.default');
$component = $entity_form_display
->getComponent('field_tags');
$component['settings']['element_type'] = 'select2';
$entity_form_display
->setComponent('field_tags', $component)
->save();
$this
->drupalGet('node/add/page');
$this
->assertSession()
->elementExists('css', '.select2-widget');
}
}