search_api_meilisearch-1.0.x-dev/modules/search_api_meilisearch_autocomplete/tests/src/Kernel/SearchApiMeilisearchAutocompleteTest.php

modules/search_api_meilisearch_autocomplete/tests/src/Kernel/SearchApiMeilisearchAutocompleteTest.php
<?php

namespace Drupal\Tests\search_api_meilisearch_autocomplete\Kernel;

use Drupal\entity_test\Entity\EntityTest;
use Drupal\search_api\Entity\Index;
use Drupal\search_api\Entity\Server;
use Drupal\search_api_autocomplete\Entity\Search;
use Drupal\Tests\search_api_meilisearch\Kernel\Backend\BackendKernelTestBase;
use PHPUnit\Framework\Attributes\Group;

/**
 * Provides test for autocomplete search.
 *
 * @requires module search_api_autocomplete
 * @group search_api_meilisearch
 */
#[Group('search_api_meilisearch')]
class SearchApiMeilisearchAutocompleteTest extends BackendKernelTestBase {

  protected const TEST_INDEX = 'kernel_autocomplete_search_test_index';

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'user',
    'system',
    'entity_test',
    'search_api',
    'search_api_meilisearch',
    'search_api_autocomplete',
    'search_api_meilisearch_autocomplete',
  ];

  /**
   * Tests that autocomplete search returns correct results.
   */
  public function testAutocomplete(): void {
    $this->prepareTestIndex(self::TEST_INDEX);
    $this->populateIndex();
    $query = $this->index->query()->range();
    $autocompleteSearch = new Search(['index_id' => self::TEST_INDEX], 'search_api_autocomplete_search');

    /** @var \Drupal\search_api_meilisearch\Plugin\search_api\backend\SearchApiMeilisearchBackend $backend */
    $backend = $query->getIndex()->getServerInstance()->getBackend();

    // Only get 3 results back or in this test case all.
    $query->setOption('limit', 3);
    $suggestions = $backend->getAutocompleteSuggestions($query, $autocompleteSearch, 'tes', 'tes');
    $this->assertEquals(3, count($suggestions));
    $this->assertEquals('Tes', $suggestions[0]->getUserInput());
    $this->assertEquals('t article 0', $suggestions[0]->getSuggestionSuffix());
    $this->assertEquals('Test article 0', $suggestions[0]->getSuggestedKeys());
    $this->assertNull($suggestions[0]->getResultsCount());

    $this->assertEquals('Tes', $suggestions[0]->getUserInput());
    $this->assertEquals('t article 2', $suggestions[2]->getSuggestionSuffix());
    $this->assertEquals('Test article 2', $suggestions[2]->getSuggestedKeys());

    // Only get 2 results back.
    $query->setOption('limit', 2);
    $newSuggestions = $backend->getAutocompleteSuggestions($query, $autocompleteSearch, 'art', 'art');
    $this->assertEquals(2, count($newSuggestions));
    $this->assertEquals('art', $newSuggestions[0]->getUserInput());
    $this->assertEquals('Test ', $newSuggestions[0]->getSuggestionPrefix());
    $this->assertEquals('icle 0', $newSuggestions[0]->getSuggestionSuffix());
    $this->assertEquals('Test article 0', $newSuggestions[0]->getSuggestedKeys());

    $this->assertEquals('art', $newSuggestions[1]->getUserInput());
    $this->assertEquals('Test ', $newSuggestions[1]->getSuggestionPrefix());
    $this->assertEquals('icle 1', $newSuggestions[1]->getSuggestionSuffix());
    $this->assertEquals('Test article 1', $newSuggestions[1]->getSuggestedKeys());
  }

  /**
   * Prepares search api index with items for tests.
   */
  protected function prepareTestIndex(string $indexName, bool $readOnly = FALSE): void {
    $server = Server::create([
      'id' => 'test_server',
      'name' => 'Test server',
      'backend' => 'search_api_meilisearch',
      'backend_config' => [
        'meilisearch_host_address' => getenv('MEILI_TEST_HOST') ?: 'http://meilisearch',
        'meilisearch_host_port' => getenv('MEILI_TEST_PORT') ?: '7700',
        'meilisearch_master_key' => getenv('MEILI_TEST_MASTER_KEY') ?: 'MASTER_KEY',
      ],
    ]);
    $server->save();

    $this->index = Index::create([
      'id' => $indexName,
      'name' => 'Test index',
      'datasource_settings' => [
        'entity:entity_test' => [],
      ],
      'field_settings' => [
        'name' => [
          'type' => 'text',
          'datasource_id' => 'entity:entity_test',
          'property_path' => 'name',
          'label' => 'Name',
        ],
        'weight' => [
          'type' => 'integer',
          'datasource_id' => 'entity:entity_test',
          'property_path' => 'weight',
          'label' => 'Weight',
        ],
        'body' => [
          'type' => 'string',
          'datasource_id' => 'entity:entity_test',
          'property_path' => 'body',
          'label' => 'Body',
        ],
      ],
      'tracker_settings' => [
        'default' => [],
      ],
      'server' => $server->id(),
      'read_only' => $readOnly,
    ]);
    $this->index->save();
  }

  /**
   * Populates the index with entities.
   */
  protected function populateIndex(): void {
    foreach ([11, 22, 33] as $key => $weight) {
      EntityTest::create([
        'name' => 'Test article ' . $key,
        'body' => 'This is the body of test article entity' . $key,
        'weight' => $weight,
      ])->save();
    }

    $this->index->indexItems();
  }

  /**
   * {@inheritdoc}
   */
  protected function getTestIndexes(): array {
    return [self::TEST_INDEX];
  }

}

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

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