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

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

namespace Drupal\Tests\elasticsearch_search_api\Unit;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageManager;
use Drupal\elasticsearch_search_api\Search\ElasticSearchParamsBuilder;
use Drupal\elasticsearch_search_api\Search\Facet\Control\FacetControlInterface;
use Drupal\elasticsearch_search_api\Search\Facet\FacetCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValuesCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FlatFacetValue;
use Drupal\elasticsearch_search_api\Search\FacetedKeywordSearchAction;
use Drupal\elasticsearch_search_api\Search\IndexFactoryAdapter;
use Drupal\search_api\Entity\Index;
use Drupal\Tests\UnitTestCase;

/**
 * Test cases for ElasticSearchParamsBuilder.
 *
 * @coversDefaultClass \Drupal\elasticsearch_search_api\Search\ElasticSearchParamsBuilder
 *
 * @group elasticsearch_search_api
 */
class ElasticSearchParamsBuilderTest extends UnitTestCase {

  /**
   * Instance of the ElasticSearchParamsBuilder.
   *
   * @var \Drupal\elasticsearch_search_api\Search\ElasticSearchParamsBuilder
   */
  private $paramsBuilder;

  /**
   * Tests the build() method.
   */
  protected function setUp(): void {
    parent::setUp();

    $languageMock = $this->createMock(Language::class);
    $languageMock->method('getId')->willReturn('nl');

    $indexMock = $this->createMock(Index::class);

    $languageManagerMock = $this->createMock(LanguageManager::class);
    $languageManagerMock->method('getCurrentLanguage')
      ->willReturn($languageMock);

    $indexFactoryAdapterMock = $this->createMock(IndexFactoryAdapter::class);
    $indexFactoryAdapterMock->method('getIndexName')->willReturn('bar');

    $this->paramsBuilder = new ElasticSearchParamsBuilder($indexMock, $languageManagerMock, $indexFactoryAdapterMock);

    $container = new ContainerBuilder();
    $container->set('elasticsearch_search_api.facet_control.sector', $this->getFacetControlMock('sector'));
    $container->set('elasticsearch_search_api.facet_control.omvang_bedrijf', $this->getFacetControlMock('omvang_bedrijf'));
    $container->set('elasticsearch_search_api.facet_control.type_tegemoetkoming', $this->getFacetControlMock('type_tegemoetkoming'));

    \Drupal::setContainer($container);
  }

  /**
   * Tests the build() method.
   */
  public function testBuild() {
    $searchAction = new FacetedKeywordSearchAction(5,
      'foo',
      (new FacetCollection())
        ->with(
          'sector',
          new FacetValuesCollection(
            new FlatFacetValue(15),
            new FlatFacetValue(17)
          )
        )
        ->with(
          'omvang_bedrijf',
          new FacetValuesCollection(
            new FlatFacetValue(20),
            new FlatFacetValue(24)
          )
        ),
      ['sector', 'type_tegemoetkoming', 'omvang_bedrijf']);

    $expectedParams = [
      'body' => [
        '_source' => FALSE,
        'from' => 0,
        'size' => 5,
        'query' => [
          'bool' => [
            'must' => [
              [
                'term' => [
                  'langcode' => 'nl',
                ],
              ],
              [
                'term' => [
                  'status' => 1,
                ],
              ],
              [
                [
                  'function_score' => [
                    'functions' => [
                      [
                        'filter' => [
                          'multi_match' => [
                            'query' => 'foo',
                            'fields' => [
                              'title^5',
                              'title.ngram',
                              'body^5',
                              'body.ngram',
                            ],
                          ],
                        ],
                        'weight' => 2,
                      ],
                    ],
                    'score_mode' => 'multiply',
                  ],
                ],
                [
                  'bool' => [
                    'should' => [
                      'match' => [
                        'custom_all' => 'foo',
                      ],
                    ],
                  ],
                ],
              ],
            ],
          ],
        ],
        'aggs' => [
          'sector' => [
            'filter' => [
              'bool' => [
                'must' => [
                  [
                    'bool' => [
                      'should' => [
                        [
                          'term' => [
                            'field_omvang_bedrijf' => "20",
                          ],
                        ],
                        [
                          'term' => [
                            'field_omvang_bedrijf' => "24",
                          ],
                        ],
                      ],
                    ],
                  ],
                ],
              ],
            ],
            'aggs' => [
              'filtered' => [
                'terms' => [
                  'field' => 'field_sector',
                  'size' => 999,
                ],
              ],
            ],
          ],
          'type_tegemoetkoming' => [
            'filter' => [
              'bool' => [
                'must' => [
                  [
                    'bool' => [
                      'should' => [
                        [
                          'term' => [
                            'field_sector' => "15",
                          ],
                        ],
                        [
                          'term' => [
                            'field_sector' => "17",
                          ],
                        ],
                      ],
                    ],
                  ],
                  [
                    'bool' => [
                      'should' => [
                        [
                          'term' => [
                            'field_omvang_bedrijf' => "20",
                          ],
                        ],
                        [
                          'term' => [
                            'field_omvang_bedrijf' => "24",
                          ],
                        ],
                      ],
                    ],
                  ],
                ],
              ],
            ],
            'aggs' => [
              'filtered' => [
                'terms' => [
                  'field' => 'field_type_tegemoetkoming',
                  'size' => 999,
                ],
              ],
            ],
          ],
          'omvang_bedrijf' => [
            'filter' => [
              'bool' => [
                'must' => [
                  [
                    'bool' => [
                      'should' => [
                        [
                          'term' => [
                            'field_sector' => "15",
                          ],
                        ],
                        [
                          'term' => [
                            'field_sector' => "17",
                          ],
                        ],
                      ],
                    ],
                  ],
                ],
              ],
            ],
            'aggs' => [
              'filtered' => [
                'terms' => [
                  'field' => 'field_omvang_bedrijf',
                  'size' => 999,
                ],
              ],
            ],
          ],
        ],
        'post_filter' => [
          'bool' => [
            'must' => [
              [
                'bool' => [
                  'should' => [
                    [
                      'term' => [
                        'field_sector' => "15",
                      ],
                    ],
                    [
                      'term' => [
                        'field_sector' => "17",
                      ],
                    ],
                  ],
                ],
              ],
              [
                'bool' => [
                  'should' => [
                    [
                      'term' => [
                        'field_omvang_bedrijf' => "20",
                      ],
                    ],
                    [
                      'term' => [
                        'field_omvang_bedrijf' => "24",
                      ],
                    ],
                  ],
                ],
              ],
            ],
          ],
        ],
      ],
      'index' => 'bar',
    ];

    $this->assertEquals($expectedParams, $this->paramsBuilder->build($searchAction));
  }

  /**
   * Helper function to get a mock for a facet control.
   *
   * @param string $facetId
   *   Facet id to get a mock for.
   *
   * @return \PHPUnit\Framework\MockObject\MockObject
   *   The facet control mock.
   */
  private function getFacetControlMock(string $facetId) {
    $mock = $this->createMock(FacetControlInterface::class);
    $mock->method('addToAggregations')->willReturn(TRUE);
    $mock->method('getFieldName')->willReturn("field_$facetId");

    return $mock;
  }

}

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

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