search_api-8.x-1.15/modules/search_api_db/tests/src/Kernel/AutocompleteTest.php
modules/search_api_db/tests/src/Kernel/AutocompleteTest.php
<?php namespace Drupal\Tests\search_api_db\Kernel; use Drupal\KernelTests\KernelTestBase; use Drupal\search_api\Utility\Utility; use Drupal\search_api_autocomplete\Entity\Search; use Drupal\search_api_db\Plugin\search_api\backend\Database; use Drupal\Tests\search_api\Functional\ExampleContentTrait; /** * Tests autocomplete functionality of the Database backend. * * @requires module search_api_autocomplete * @coversDefaultClass \Drupal\search_api_db\Plugin\search_api\backend\Database * @group search_api */ class AutocompleteTest extends KernelTestBase { use ExampleContentTrait; /** * {@inheritdoc} */ public static $modules = [ 'entity_test', 'field', 'system', 'text', 'user', 'search_api', 'search_api_autocomplete', 'search_api_db', 'search_api_db_test_autocomplete', 'search_api_test_db', 'search_api_test_example_content', ]; /** * A search server ID. * * @var string */ protected $serverId = 'database_search_server'; /** * A search index ID. * * @var string */ protected $indexId = 'database_search_index'; /** * {@inheritdoc} */ public function setUp() { parent::setUp(); $this->installSchema('search_api', ['search_api_item']); $this->installSchema('user', ['users_data']); $this->installEntitySchema('entity_test_mulrev_changed'); $this->installEntitySchema('search_api_task'); $this->installConfig('search_api'); // Do not use a batch for tracking the initial items after creating an // index when running the tests via the GUI. Otherwise, it seems Drupal's // Batch API gets confused and the test fails. if (!Utility::isRunningInCli()) { \Drupal::state()->set('search_api_use_tracking_batch', FALSE); } $this->installConfig([ 'search_api_db', 'search_api_test_example_content', 'search_api_test_db', 'search_api_db_test_autocomplete', ]); $this->setUpExampleStructure(); $this->insertExampleContent(); $this->indexItems($this->indexId); } /** * Tests whether autocomplete suggestions are correctly created. * * @covers ::getAutocompleteSuggestions */ public function testAutocompletion() { /** @var \Drupal\search_api_autocomplete\SearchInterface $autocomplete */ $autocomplete = Search::load('search_api_db_test_autocomplete'); $index = $autocomplete->getIndex(); /** @var \Drupal\search_api_db\Plugin\search_api\backend\Database $backend */ $backend = $index->getServerInstance()->getBackend(); $this->assertInstanceOf(Database::class, $backend); $query = $index->query() ->range(0, 10); $suggestions = $backend->getAutocompleteSuggestions($query, $autocomplete, 'fo', 'fo'); $expected = [ 'foo' => 4, 'foobar' => 1, 'foobaz' => 1, 'foobuz' => 1, ]; $this->assertSuggestionsEqual($expected, $suggestions); $query = $index->query() ->keys('foo') ->range(0, 10); $suggestions = $backend->getAutocompleteSuggestions($query, $autocomplete, 'fo', 'foo fo'); $expected = [ 'foo foobaz' => 1, 'foo foobuz' => 1, ]; $this->assertSuggestionsEqual($expected, $suggestions); } /** * Asserts that the returned suggestions are as expected. * * @param int[] $expected * Associative array mapping suggestion strings to their counts. * @param \Drupal\search_api_autocomplete\Suggestion\SuggestionInterface[] $suggestions * The suggestions returned by the backend. */ protected function assertSuggestionsEqual(array $expected, array $suggestions) { $terms = []; foreach ($suggestions as $suggestion) { $keys = $suggestion->getSuggestedKeys(); if ($keys === NULL) { $keys = $suggestion->getSuggestionPrefix(); $keys .= $suggestion->getUserInput(); $keys .= $suggestion->getSuggestionSuffix(); } $terms[$keys] = $suggestion->getResultsCount(); } $this->assertEquals($expected, $terms); } }