localgov_directories-3.3.1/tests/src/FunctionalJavascript/EntityReferenceFacetsWidgetTest.php

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

namespace Drupal\Tests\localgov_directories\FunctionalJavascript;

use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\field\Traits\EntityReferenceFieldCreationTrait;
use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;
use Drupal\field\Entity\FieldConfig;
use Drupal\localgov_directories\Entity\LocalgovDirectoriesFacets;
use Drupal\localgov_directories\Entity\LocalgovDirectoriesFacetsType;
use Drupal\node\NodeInterface;

/**
 * Tests the output of facet and channel widgets on directory entries.
 *
 * @group localgov_directories
 */
class EntityReferenceFacetsWidgetTest extends WebDriverTestBase {

  use ContentTypeCreationTrait;
  use NodeCreationTrait;
  use EntityReferenceFieldCreationTrait;

  /**
   * Array of directory nodes.
   *
   * @var \Drupal\node\Entity\Node[]
   */
  protected $directories = [];

  /**
   * Array of facet.
   *
   * @var \Drupal\localgov_directories\Entity\LocalgovDirectoriesFacets[]
   */
  protected $facets = [];

  /**
   * Array of facet types.
   *
   * @var \Drupal\localgov_directories\Entity\LocalgovDirectoriesFacetsType[]
   */
  protected $facetTypes = [];

  /**
   * A user with mininum permissions for test.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $user;

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


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

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

    // Three bundles of five facets.
    for ($i = 0; $i < 3; $i++) {
      $type_id = $this->randomMachineName();
      $type = LocalgovDirectoriesFacetsType::create([
        'id' => $type_id,
        'label' => $type_id,
      ]);
      $type->save();
      $this->facetTypes[$type_id] = $type;
      for ($j = 0; $j < 5; $j++) {
        $facet = LocalgovDirectoriesFacets::create([
          'bundle' => $type_id,
          'title' => $this->randomMachineName(),
        ]);
        $facet->save();
        $this->facets[$type_id][$facet->id()] = $facet;
      }
    }
    // Another bundle with just one facet.
    $type = LocalgovDirectoriesFacetsType::create([
      'id' => 'facetbundleonefacet',
      'label' => 'facetbundleonefacet',
    ]);
    $type->save();
    $this->facetTypes['facetbundleonefacet'] = $type;
    $facet = LocalgovDirectoriesFacets::create([
      'bundle' => 'facetbundleonefacet',
      'title' => $this->randomMachineName(),
    ]);
    $facet->save();
    $this->facets['facetbundleonefacet'][$facet->id()] = $facet;

    // Directory 1
    // Single facet bundle.
    reset($this->facetTypes);
    $directory = $this->createNode([
      'title' => 'Directory 1',
      'type' => 'localgov_directory',
      'status' => NodeInterface::PUBLISHED,
      'localgov_directory_facets_enable' => [
        ['target_id' => key($this->facetTypes)],
      ],
    ]);
    $directory->save();
    $this->directories['single_facet'] = $directory;

    // Directory 2.
    // All facet bundles.
    $all_enabled = [];
    foreach ($this->facetTypes as $type_id => $type) {
      $all_enabled[] = ['target_id' => $type_id];
    }
    $directory = $this->createNode([
      'title' => 'Directory 2',
      'type' => 'localgov_directory',
      'status' => NodeInterface::PUBLISHED,
      'localgov_directory_facets_enable' => $all_enabled,
    ]);
    $directory->save();
    $this->directories['all_facets'] = $directory;

    // Directory 3.
    // Single facet with only one value.
    $directory = $this->createNode([
      'title' => 'Directory 3',
      'type' => 'localgov_directory',
      'status' => NodeInterface::PUBLISHED,
      'localgov_directory_facets_enable' => [
        ['target_id' => 'facetbundleonefacet'],
      ],
    ]);
    $directory->save();
    $this->directories['single_facet_single_value'] = $directory;

    // Directory 4.
    // No facets.
    $directory = $this->createNode([
      'title' => 'Directory 4',
      'type' => 'localgov_directory',
      'status' => NodeInterface::PUBLISHED,
      'localgov_directory_facets_enable' => [],
    ]);
    $directory->save();
    $this->directories['no_facets'] = $directory;

    // Content type configured to reference directories, and have the
    // facet selector.
    $this->createContentType(['type' => 'entry']);
    $display_repository = \Drupal::service('entity_display.repository');
    assert($display_repository instanceof EntityDisplayRepositoryInterface);
    // Add the directory entity reference and facets fields.
    $field_name = 'localgov_directory_facets_select';
    $this->createEntityReferenceField(
      'node',
      'entry',
      $field_name,
      $field_name,
      'localgov_directories_facets',
      'localgov_directories_facets_selection'
    );
    $form_display = $display_repository->getFormDisplay('node', 'entry');
    $form_display->setComponent($field_name, [
      'type' => 'localgov_directories_facet_checkbox',
    ]);
    $form_display->save();
    $field_name = 'localgov_directory_channels';
    $this->createEntityReferenceField(
      'node',
      'entry',
      $field_name,
      $field_name,
      'node',
      'localgov_directories_channels_selection'
    );
    $form_display = $display_repository->getFormDisplay('node', 'entry');
    $form_display->setComponent($field_name, [
      'type' => 'localgov_directories_channel_selector',
    ]);
    $form_display->save();

    // User that can create entries.
    $this->user = $this->drupalCreateUser([
      'access content',
      'bypass node access',
    ]);
    $this->drupalLogin($this->user);
  }

  /**
   * Test selecting channels and facets appearing.
   */
  public function testDirectoryChannelWidget() {
    // No channels selected. Message to select in the facets area.
    $this->drupalGet('node/add/entry');
    $entry = $this->getSession()->getPage();
    $assert_session = $this->assertSession();
    $assert_session->pageTextContains('Select directory channels to add facets');

    // Select a channel.
    $radio = $entry->findField('edit-localgov-directory-channels-primary-' . $this->directories['single_facet']->id());
    $radio->click();
    $assert_session->assertWaitOnAjaxRequest();
    $facet_type_enabled = $this->directories['single_facet']->localgov_directory_facets_enable->first()->target_id;
    // Check facets appear.
    $assert_session->elementExists('css', '[data-drupal-selector="edit-localgov-directory-facets-select-' . strtolower($facet_type_enabled) . '"]');
    foreach ($this->facets[$facet_type_enabled] as $facet) {
      $assert_session->fieldExists($facet->label());
    }
    next($this->facetTypes);
    // But not others.
    $facet_not_enabled = key($this->facetTypes);
    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-localgov-directory-facets-select-' . $facet_not_enabled . '"]');

    // Enable other channel.
    $radio = $entry->findField('edit-localgov-directory-channels-secondary-' . $this->directories['all_facets']->id());
    $radio->click();
    $assert_session->assertWaitOnAjaxRequest();
    // Check all facets appear.
    // Select them, and submit.
    $assert_session->elementExists('css', '[data-drupal-selector="edit-localgov-directory-facets-select-' . strtolower($facet_not_enabled) . '"]');
    foreach ($this->facets as $facet_types) {
      foreach ($facet_types as $facet) {
        $assert_session->fieldExists($facet->label());
        $current_facet = $entry->findField($facet->label());
        $current_facet->click();
      }
    }
    $title = $this->randomString();
    $entry->fillField('title[0][value]', $title);
    $entry->pressButton('edit-submit');
    // Ensure it's posted.
    $assert_session->pageTextContains('entry ' . $title . ' has been created.');
    $this->drupalGet('node/5/edit');
    $entry = $this->getSession()->getPage();
    // Ensure the channel and facets are selected.
    $radio = $entry->findField('edit-localgov-directory-channels-secondary-' . $this->directories['all_facets']->id());
    $this->assertTrue($radio->isChecked());
    $assert_session->elementExists('css', '[data-drupal-selector="edit-localgov-directory-facets-select-' . strtolower($facet_not_enabled) . '"]');
    foreach ($this->facets as $facet_types) {
      foreach ($facet_types as $facet) {
        $current_facet = $entry->findField($facet->label());
        $this->assertTrue($current_facet->isChecked());
      }
    }

    // Enable a channel with no facets.
    // Ensure it saves.
    $this->drupalGet('node/add/entry');
    $entry = $this->getSession()->getPage();
    $radio = $entry->findField('edit-localgov-directory-channels-secondary-' . $this->directories['no_facets']->id());
    $radio->click();
    $assert_session->assertWaitOnAjaxRequest();
    $title = $this->randomString();
    $entry->fillField('title[0][value]', $title);
    $entry->pressButton('edit-submit');
    // Ensure it's posted.
    $assert_session->pageTextContains('entry ' . $title . ' has been created.');
  }

  /**
   * Test if the facet field is required.
   */
  public function testFacetRequired() {
    // Set the field to be required.
    $facet_field = FieldConfig::loadByName('node', 'entry', 'localgov_directory_facets_select');
    $facet_field->set('required', TRUE);
    $facet_field->save();
    $this->resetAll();
    $facet_field = FieldConfig::loadByName('node', 'entry', 'localgov_directory_facets_select');
    $this->assertTrue($facet_field->isRequired());

    $this->drupalGet('node/add/entry');
    $entry = $this->getSession()->getPage();
    $assert_session = $this->assertSession();

    // Select the single value facet channel.
    // And check it is default selected as the only option on a required
    // field.
    $radio = $entry->findField('edit-localgov-directory-channels-primary-' . $this->directories['single_facet_single_value']->id());
    $radio->click();
    $assert_session->assertWaitOnAjaxRequest();
    $facet_type_enabled = $this->directories['single_facet_single_value']->localgov_directory_facets_enable->first()->target_id;
    $assert_session->elementExists('css', '[data-drupal-selector="edit-localgov-directory-facets-select-' . strtolower($facet_type_enabled) . '"]');
    foreach ($this->facets['facetbundleonefacet'] as $facet) {
      $assert_session->fieldExists($facet->label());
      $single_facet = $entry->findField($facet->label());
      $this->assertTrue($single_facet->isChecked());
    }
    $title = $this->randomString();
    $entry->fillField('title[0][value]', $title);
    $entry->pressButton('edit-submit');
    $assert_session->pageTextContains('entry ' . $title . ' has been created.');

    // Select a multiple value facet channel.
    // Check that a field must be filled in.
    $this->drupalGet('node/add/entry');
    $entry = $this->getSession()->getPage();
    $radio = $entry->findField('edit-localgov-directory-channels-primary-' . $this->directories['all_facets']->id());
    $radio->click();
    $assert_session->assertWaitOnAjaxRequest();
    $title = $this->randomString();
    $entry->fillField('title[0][value]', $title);
    $entry->pressButton('edit-submit');
    $assert_session->pageTextContains('localgov_directory_facets_select field is required.');
  }

}

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

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