elasticsearch_search_api-1.0.x-dev/tests/src/Unit/SearchActiveFiltersBuilderTest.php

tests/src/Unit/SearchActiveFiltersBuilderTest.php
<?php

namespace Drupal\Tests\elasticsearch_search_api\Unit;

use Drupal\Core\Url;
use Drupal\elasticsearch_search_api\Search\Facet\FacetCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaData;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValuesCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FlatFacetValue;
use Drupal\elasticsearch_search_api\Search\FacetedSearchActiveFiltersBuilder;
use Drupal\elasticsearch_search_api\Search\FacetedSearchAction;
use Drupal\elasticsearch_search_api\Search\SearchQueryBuilder;
use Drupal\Tests\UnitTestCase;

/**
 * Test cases for FacetedSearchActiveFiltersBuilder.
 *
 * @group elasticsearch_search_api
 */
class SearchActiveFiltersBuilderTest extends UnitTestCase {

  /**
   * The term storage mock.
   *
   * @var \Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  private $metaDataStorage;

  /**
   * The active filter builder service.
   *
   * @var \Drupal\elasticsearch_search_api\Search\FacetedSearchActiveFiltersBuilder
   */
  private $activeFiltersBuilder;

  /**
   * The route name.
   *
   * @var string
   */
  private $route;

  /**
   * {@inheritdoc}
   */
  public function setUp(): void {
    // We can not properly mock the interface because it uses return type
    // hinting, for which support is only added in PHPUnit 5.x.
    $this->metaDataStorage = new MockMetaDataStorage(
      [
        10 => new FacetValueMetaData('Industrie'),
        12 => new FacetValueMetaData('Diensten'),
        14 => new FacetValueMetaData('Handel'),
        40 => new FacetValueMetaData('< 50 werknemers'),
      ]
    );
    $this->route = 'esa_maatregel.search';
    $this->activeFiltersBuilder = new FacetedSearchActiveFiltersBuilder(
      $this->route,
      $this->metaDataStorage,
      new SearchQueryBuilder()
    );
  }

  /**
   * Tests FacetedSearchActiveFiltersBuilder::build() with facets.
   *
   * @covers \Drupal\elasticsearch_search_api\Search\FacetedSearchActiveFiltersBuilder::build
   */
  public function testBuildWithFacets() {
    $action = new FacetedSearchAction(
      10,
      (new FacetCollection())
        ->with(
          'sector',
          new FacetValuesCollection(
            new FlatFacetValue(10),
            new FlatFacetValue(12),
            new FlatFacetValue(14)
          )
        )
        ->with(
          'omvang_bedrijf',
          new FacetValuesCollection(
            new FlatFacetValue(40)
          )
        ),
      ['sector', 'omvang_bedrijf']
    );

    $expectedBuild = [
      '#type' => 'container',
      'title' => [
        '#type' => 'html_tag',
        '#tag' => 'h2',
        '#value' => 'Gekozen filters:',
        '#attributes' => [
          'class' => 'u-hidden-mobile',
        ],
      ],
      'items' => [
        [
          '#title' => 'Industrie',
          '#type' => 'link',
          '#url' => new Url(
            $this->route,
            [],
            [
              'query' => [
                'sector' => [12, 14],
                'omvang_bedrijf' => [40],
              ],
            ]
          ),
          '#attributes' => [
            'class' => [
              'u-hidden-mobile',
              'active-filters-filter',
            ],
            'title' => 'Filter Industrie verwijderen',
            'aria-label' => 'Industrie',
            'data-drupal-facet-item-value' => 10,
            'data-drupal-facet-item-facet' => 'sector',
          ],
        ],
        [
          '#title' => 'Diensten',
          '#type' => 'link',
          '#url' => new Url(
            $this->route,
            [],
            [
              'query' => [
                'sector' => [10, 14],
                'omvang_bedrijf' => [40],
              ],
            ]
          ),
          '#attributes' => [
            'class' => [
              'u-hidden-mobile',
              'active-filters-filter',
            ],
            'title' => 'Filter Diensten verwijderen',
            'aria-label' => 'Diensten',
            'data-drupal-facet-item-value' => 12,
            'data-drupal-facet-item-facet' => 'sector',
          ],
        ],
        [
          '#title' => 'Handel',
          '#type' => 'link',
          '#url' => new Url(
            $this->route,
            [],
            [
              'query' => [
                'sector' => [10, 12],
                'omvang_bedrijf' => [40],
              ],
            ]
          ),
          '#attributes' => [
            'class' => [
              'u-hidden-mobile',
              'active-filters-filter',
            ],
            'title' => 'Filter Handel verwijderen',
            'aria-label' => 'Handel',
            'data-drupal-facet-item-value' => 14,
            'data-drupal-facet-item-facet' => 'sector',
          ],
        ],
        [
          '#title' => '< 50 werknemers',
          '#type' => 'link',
          '#url' => new Url(
            $this->route,
            [],
            [
              'query' => [
                'sector' => [10, 12, 14],
              ],
            ]
          ),
          '#attributes' => [
            'class' => [
              'u-hidden-mobile',
              'active-filters-filter',
            ],
            'title' => 'Filter < 50 werknemers verwijderen',
            'aria-label' => '< 50 werknemers',
            'data-drupal-facet-item-value' => 40,
            'data-drupal-facet-item-facet' => 'omvang_bedrijf',
          ],
        ],
      ],
      '#attributes' => [
        'class' => [
          'active-filters',
        ],
      ],
      'remove-all' => [
        '#type' => 'link',
        '#url' => new Url($this->route, [], ['query' => []]),
        '#attributes' => [
          'class' => [
            'active-filters-remove-all',
          ],
          'aria-label' => 'Alle filters verwijderen',
        ],
        '#title' => 'Alle filters verwijderen',
      ],
    ];

    $build = $this->activeFiltersBuilder->build($action);

    $this->assertEquals($expectedBuild, $build);
  }

  /**
   * Tests SearchActiveFilters::build() without facets.
   *
   * @covers \Drupal\elasticsearch_search_api\Search\FacetedSearchActiveFiltersBuilder::build
   */
  public function testBuildWithoutFacets() {
    $action = new FacetedSearchAction(
      10,
      NULL,
      ['sector', 'omvang_bedrijf']
    );

    $build = $this->activeFiltersBuilder->build($action);

    $this->assertNull($build);
  }

}

/**
 * Mock class for Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface.
 */
class MockMetaDataStorage implements FacetValueMetaDataStorageInterface {

  /**
   * Array of FacetValueMetaData objects.
   *
   * @var \Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaData[]
   */
  private $values;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $values) {
    $this->values = $values;
  }

  /**
   * {@inheritdoc}
   */
  public function load(string $id): ?FacetValueMetaData {
    if (isset($this->values[$id])) {
      return $this->values[$id];
    }

    return NULL;
  }

}

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

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