pluginreference-2.0.0/tests/src/FunctionalJavascript/PluginReferenceFieldWidgetConfigurationTest.php

tests/src/FunctionalJavascript/PluginReferenceFieldWidgetConfigurationTest.php
<?php

namespace Drupal\Tests\pluginreference\FunctionalJavascript;

use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Url;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\pluginreference\Traits\PluginReferenceTrait;

/**
 * Test the pluginreference widgets with configuration enabled.
 *
 * @group pluginreference
 */
class PluginReferenceFieldWidgetConfigurationTest extends WebDriverTestBase {

  use PluginReferenceTrait;

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * The plugin reference field name.
   *
   * @var string
   */
  protected $fieldName = 'field_pluginreference';

  /**
   * The plugin reference field label.
   *
   * @var string
   */
  protected $fieldLabel = 'Plugin reference field';

  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = ['node', 'field_ui', 'pluginreference_test'];

  /**
   * The node type.
   *
   * @var \Drupal\node\Entity\NodeType
   */
  protected $nodeType;

  /**
   * The plugin type we want to reference.
   *
   * @var string
   */
  protected $targetType = 'block';

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->drupalLogin($this->rootUser);
    $this->nodeType = $this->drupalCreateContentType();
    $this->createPluginReferenceField('node', $this->nodeType->id(), $this->fieldName, $this->fieldLabel, $this->targetType);
  }

  /**
   * Test plugin reference select widget with configuration.
   */
  public function testPluginReferenceSelectWidgetWithConfiguration(): void {
    $assert_session = $this->assertSession();
    $page = $this->getSession()->getPage();
    EntityFormDisplay::load(sprintf('node.%s.default', $this->nodeType->id()))
      ->setComponent($this->fieldName, [
        'type' => 'plugin_reference_select',
        'settings' => [
          'provider_grouping' => FALSE,
          'configuration_form' => 'full',
        ],
      ])->save();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));

    $page->findField('title[0][value]')->setValue('Test pluginreference');

    $plugin_id_field = $assert_session->fieldExists(sprintf('%s[0][plugin_id]', $this->fieldName));
    $plugin_id_field->selectOption('plugin_reference_test_block');

    $test_value_field = $assert_session->waitForField(sprintf('%s[0][configuration][test_value]', $this->fieldName));
    $test_value_field->setValue('fail');
    $page->pressButton('Save');
    $assert_session->responseContains('Value should not be fail.');

    $test_value_field->setValue('test value');
    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference');
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->plugin_id);
    $this->assertEquals('test value', $node->get($this->fieldName)->configuration['test_value']);

    // Test select widget with cardinality unlimited.
    $this->drupalGet(Url::fromRoute('entity.field_config.node_field_edit_form', [
      'node_type' => $this->nodeType->id(),
      'field_config' => sprintf('%s.%s.%s', 'node', $this->nodeType->id(), $this->fieldName),
    ]));
    $cardinality = $assert_session->fieldExists('field_storage[subform][cardinality]');
    $cardinality->setValue(-1);
    $assert_session->assertWaitOnAjaxRequest();
    $page->pressButton('Save settings');
    $this->assertTrue($assert_session->waitForText(sprintf('Saved %s configuration.', $this->fieldLabel)));
    drupal_flush_all_caches();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));
    $page->findField('title[0][value]')->setValue('Test pluginreference 2');

    $plugin_id_field = $assert_session->fieldExists(sprintf('%s[0][plugin_id]', $this->fieldName));
    $plugin_id_field->selectOption('plugin_reference_test_block');

    $test_value_field = $assert_session->waitForField(sprintf('%s[0][configuration][test_value]', $this->fieldName));
    $test_value_field->setValue('test');
    $page->pressButton('Add another item');

    // Check if system_branding_block works, because it depends on the
    // block_theme in the form_state object.
    $plugin_id_field = $assert_session->waitForField(sprintf('%s[1][plugin_id]', $this->fieldName));
    $plugin_id_field->selectOption('system_branding_block');

    $site_logo_field = $assert_session->waitForField(sprintf('%s[1][configuration][block_branding][use_site_logo]', $this->fieldName));
    $site_logo_field->uncheck();
    $site_slogan_field = $assert_session->fieldExists(sprintf('%s[1][configuration][block_branding][use_site_slogan]', $this->fieldName));
    $site_slogan_field->uncheck();
    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference 2');

    // Check that the values are correctly saved.
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->get(0)->get('plugin_id')->getValue());
    $this->assertEquals('test', $node->get($this->fieldName)->get(0)->get('configuration')->getValue()['test_value']);
    $this->assertEquals('system_branding_block', $node->get($this->fieldName)->get(1)->get('plugin_id')->getValue());
    $this->assertFalse((bool) $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['use_site_logo']);
    $this->assertFalse((bool) $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['use_site_slogan']);
    $this->assertTrue((bool) $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['use_site_name']);

    // Check that the configuration is correctly shown on the node edit form.
    $this->drupalGet(Url::fromRoute('entity.node.edit_form', ['node' => $node->id()]));
    $assert_session->fieldValueEquals(sprintf('%s[0][plugin_id]', $this->fieldName), 'plugin_reference_test_block');
    $assert_session->fieldValueEquals(sprintf('%s[0][configuration][test_value]', $this->fieldName), 'test');
    $assert_session->fieldValueEquals(sprintf('%s[1][plugin_id]', $this->fieldName), 'system_branding_block');
    $assert_session->checkboxNotChecked(sprintf('%s[1][configuration][block_branding][use_site_logo]', $this->fieldName));
    $assert_session->checkboxNotChecked(sprintf('%s[1][configuration][block_branding][use_site_slogan]', $this->fieldName));
    $assert_session->checkboxChecked(sprintf('%s[1][configuration][block_branding][use_site_name]', $this->fieldName));
  }

  /**
   * Test plugin reference autocomplete with configuration.
   */
  public function testPluginReferenceAutocompleteWidgetWithConfiguration(): void {
    $assert_session = $this->assertSession();
    $page = $this->getSession()->getPage();
    EntityFormDisplay::load(sprintf('node.%s.default', $this->nodeType->id()))
      ->setComponent($this->fieldName, [
        'type' => 'plugin_reference_autocomplete',
        'settings' => ['configuration_form' => 'full'],
      ])->save();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));

    $page->findField('title[0][value]')->setValue('Test pluginreference');

    $plugin_id_field = $assert_session->fieldExists(sprintf('%s[0][plugin_id]', $this->fieldName));
    $plugin_id_field->setValue('test block');
    $plugin_id_field->keyDown(' ');
    $assert_session->waitOnAutocomplete()->click();

    $test_value_field = $assert_session->waitForField(sprintf('%s[0][configuration][test_value]', $this->fieldName));
    $test_value_field->setValue('fail');
    $page->pressButton('Save');
    $assert_session->responseContains('Value should not be fail.');

    $test_value_field->setValue('test value');
    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference');
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->plugin_id);
    $this->assertEquals('test value', $node->get($this->fieldName)->configuration['test_value']);

    // Test autocomplete widget with cardinality unlimited.
    $this->drupalGet(Url::fromRoute('entity.field_config.node_field_edit_form', [
      'node_type' => $this->nodeType->id(),
      'field_config' => sprintf('%s.%s.%s', 'node', $this->nodeType->id(), $this->fieldName),
    ]));
    $cardinality = $assert_session->fieldExists('field_storage[subform][cardinality]');
    $cardinality->setValue(-1);
    $assert_session->assertWaitOnAjaxRequest();
    $page->pressButton('Save settings');
    $this->assertTrue($assert_session->waitForText(sprintf('Saved %s configuration.', $this->fieldLabel)));
    drupal_flush_all_caches();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));
    $page->findField('title[0][value]')->setValue('Test pluginreference 2');

    $plugin_id_field = $assert_session->fieldExists(sprintf('%s[0][plugin_id]', $this->fieldName));
    $plugin_id_field->setValue('test block');
    $plugin_id_field->keyDown(' ');
    $assert_session->waitOnAutocomplete()->click();

    $test_value_field = $assert_session->waitForField(sprintf('%s[0][configuration][test_value]', $this->fieldName));
    $test_value_field->setValue('test');
    $page->pressButton('Add another item');

    $plugin_id_field = $assert_session->waitForField(sprintf('%s[1][plugin_id]', $this->fieldName));
    $plugin_id_field->setValue('tabs');
    $plugin_id_field->keyDown(' ');
    $assert_session->waitOnAutocomplete()->click();

    $primary_field = $assert_session->waitForField(sprintf('%s[1][configuration][levels][primary]', $this->fieldName));
    $page->pressButton('Shown tabs');
    $primary_field->check();

    $secondary_field = $assert_session->fieldExists(sprintf('%s[1][configuration][levels][secondary]', $this->fieldName));
    $secondary_field->uncheck();

    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference 2');

    // Check that the values are correctly saved.
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->get(0)->get('plugin_id')->getValue());
    $this->assertEquals('test', $node->get($this->fieldName)->get(0)->get('configuration')->getValue()['test_value']);
    $this->assertEquals('local_tasks_block', $node->get($this->fieldName)->get(1)->get('plugin_id')->getValue());
    $this->assertTrue((bool) $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['primary']);
    $this->assertFalse((bool) $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['secondary']);

    // Check that the configuration is correctly shown on the node edit form.
    $this->drupalGet(Url::fromRoute('entity.node.edit_form', ['node' => $node->id()]));
    $assert_session->fieldValueEquals(sprintf('%s[0][plugin_id]', $this->fieldName), 'Test block (plugin_reference_test_block)');
    $assert_session->fieldValueEquals(sprintf('%s[0][configuration][test_value]', $this->fieldName), 'test');
    $assert_session->fieldValueEquals(sprintf('%s[1][plugin_id]', $this->fieldName), 'Tabs (local_tasks_block)');
    $assert_session->checkboxChecked(sprintf('%s[1][configuration][levels][primary]', $this->fieldName));
    $assert_session->checkboxNotChecked(sprintf('%s[1][configuration][levels][secondary]', $this->fieldName));
  }

  /**
   * Test plugin reference options buttons with configuration.
   */
  public function testPluginReferenceOptionsButtonsWithConfiguration(): void {
    $assert_session = $this->assertSession();
    $page = $this->getSession()->getPage();

    EntityFormDisplay::load(sprintf('node.%s.default', $this->nodeType->id()))
      ->setComponent($this->fieldName, [
        'type' => 'plugin_reference_options_buttons',
        'settings' => ['configuration_form' => 'full'],
      ])->save();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));

    $page->findField('title[0][value]')->setValue('Test pluginreference');

    $plugin_id_field = $assert_session->fieldExists(sprintf('%s[plugin_id]', $this->fieldName));
    $plugin_id_field->setValue('plugin_reference_test_block');

    $test_value_field = $assert_session->waitForField(sprintf('%s[configuration][plugin_reference_test_block][test_value]', $this->fieldName));
    $test_value_field->setValue('fail');
    $page->pressButton('Save');
    $assert_session->responseContains('Value should not be fail.');

    $test_value_field->setValue('test value');
    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference');
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->plugin_id);
    $this->assertEquals('test value', $node->get($this->fieldName)->configuration['test_value']);

    // Test options button widget with cardinality unlimited.
    $this->drupalGet(Url::fromRoute('entity.field_config.node_field_edit_form', [
      'node_type' => $this->nodeType->id(),
      'field_config' => sprintf('%s.%s.%s', 'node', $this->nodeType->id(), $this->fieldName),
    ]));
    $cardinality = $assert_session->fieldExists('field_storage[subform][cardinality]');
    $cardinality->setValue(-1);
    $assert_session->assertWaitOnAjaxRequest();
    $page->pressButton('Save settings');
    $this->assertTrue($assert_session->waitForText(sprintf('Saved %s configuration.', $this->fieldLabel)));
    drupal_flush_all_caches();

    $this->drupalGet(Url::fromRoute('node.add', ['node_type' => $this->nodeType->id()]));
    $page->findField('title[0][value]')->setValue('Test pluginreference 2');

    // The plugin_id_field are now checkboxes.
    $page->checkField(sprintf('%s[plugin_id][plugin_reference_test_block]', $this->fieldName));

    $test_value_field = $assert_session->waitForField(sprintf('%s[configuration][plugin_reference_test_block][test_value]', $this->fieldName));
    $test_value_field->setValue('test');

    $page->checkField(sprintf('%s[plugin_id][system_branding_block]', $this->fieldName));

    $site_logo_field = $assert_session->waitForField(sprintf('%s[configuration][system_branding_block][block_branding][use_site_logo]', $this->fieldName));
    $site_logo_field->uncheck();
    $site_slogan_field = $assert_session->fieldExists(sprintf('%s[configuration][system_branding_block][block_branding][use_site_slogan]', $this->fieldName));
    $site_slogan_field->uncheck();
    $page->pressButton('Save');

    $node = $this->drupalGetNodeByTitle('Test pluginreference 2');

    // Check that the values are correctly saved.
    $this->assertEquals('system_branding_block', $node->get($this->fieldName)->get(0)->get('plugin_id')->getValue());
    $this->assertFalse((bool) $node->get($this->fieldName)->get(0)->get('configuration')->getValue()['use_site_logo']);
    $this->assertFalse((bool) $node->get($this->fieldName)->get(0)->get('configuration')->getValue()['use_site_slogan']);
    $this->assertTrue((bool) $node->get($this->fieldName)->get(0)->get('configuration')->getValue()['use_site_name']);
    $this->assertEquals('plugin_reference_test_block', $node->get($this->fieldName)->get(1)->get('plugin_id')->getValue());
    $this->assertEquals('test', $node->get($this->fieldName)->get(1)->get('configuration')->getValue()['test_value']);

    // Check that the configuration is correctly shown on the node edit form.
    $this->drupalGet(Url::fromRoute('entity.node.edit_form', ['node' => $node->id()]));
    $assert_session->checkboxChecked(sprintf('%s[plugin_id][plugin_reference_test_block]', $this->fieldName));
    $assert_session->fieldValueEquals(sprintf('%s[configuration][plugin_reference_test_block][test_value]', $this->fieldName), 'test');
    $assert_session->checkboxChecked(sprintf('%s[plugin_id][system_branding_block]', $this->fieldName));
    $assert_session->checkboxNotChecked(sprintf('%s[configuration][system_branding_block][block_branding][use_site_logo]', $this->fieldName));
    $assert_session->checkboxNotChecked(sprintf('%s[configuration][system_branding_block][block_branding][use_site_slogan]', $this->fieldName));
    $assert_session->checkboxChecked(sprintf('%s[configuration][system_branding_block][block_branding][use_site_name]', $this->fieldName));
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc