You are here

public function ViewsTest::testSearchPlugin in Search API Autocomplete 8

Tests that valid search plugin definitions are created for search views.

File

tests/src/Kernel/ViewsTest.php, line 60

Class

ViewsTest
Tests Views integration of the Autocomplete module.

Namespace

Drupal\Tests\search_api_autocomplete\Kernel

Code

public function testSearchPlugin() {
  $index_id = 'autocomplete_search_index';
  $plugin_helper = $this->container
    ->get('search_api_autocomplete.plugin_helper');
  $plugins = $plugin_helper
    ->createSearchPluginsForIndex($index_id);
  $view_id = 'views:search_api_autocomplete_test_view';
  $this
    ->assertArrayNotHasKey($view_id, $plugins);
  $this
    ->installConfig('search_api_autocomplete_test');

  // To avoid getting the cached derivatives from the Views search plugin
  // deriver, we unfortunately need to rebuild the search plugin manager. This
  // is probably the simplest way to do it, without too many side effects.
  $search_plugin_manager = new SearchPluginManager($this->container
    ->get('container.namespaces'), $this->container
    ->get('cache.discovery'), $this->container
    ->get('module_handler'));
  $plugin_helper = new PluginHelper($this->container
    ->get('plugin.manager.search_api_autocomplete.suggester'), $search_plugin_manager);
  $plugins = $plugin_helper
    ->createSearchPluginsForIndex($index_id);
  $this
    ->assertArrayHasKey($view_id, $plugins);

  /** @var \Drupal\search_api_autocomplete\Search\SearchPluginInterface $plugin */
  $plugin = $plugins[$view_id];
  $this
    ->assertEquals('Search API Autocomplete Test view', $plugin
    ->label());
  $this
    ->assertEquals('Search views', $plugin
    ->getGroupLabel());
  $this
    ->assertEquals('Searches provided by Views', $plugin
    ->getGroupDescription());
  $data = [
    'display' => 'page',
    'filter' => 'keys',
  ];
  $query = $plugin
    ->createQuery('foobar', $data);
  $this
    ->assertEquals('foobar', $query
    ->getOriginalKeys());
  $index = $query
    ->getIndex();
  $this
    ->assertEquals($index_id, $index
    ->id());
  $fields = $query
    ->getFulltextFields();
  $all_fulltext_fields = $index
    ->getFulltextFields();
  $fields = isset($fields) ? $fields : $all_fulltext_fields;
  $this
    ->assertEquals($all_fulltext_fields, $fields);
  $query = $plugin
    ->createQuery('', $data);
  $this
    ->assertNull($query
    ->getOriginalKeys());
  $data = [
    'display' => 'page',
    'filter' => 'name',
    'field' => 'name',
  ];
  $query = $plugin
    ->createQuery('foobar', $data);
  $this
    ->assertNull($query
    ->getOriginalKeys());

  // @todo Remove check once we depend on Drupal 9.0+.
  if (method_exists($this, 'assertStringContainsString')) {
    $this
      ->assertStringContainsString('foobar', (string) $query);
  }
  else {
    $this
      ->assertContains('foobar', (string) $query);
  }
  $conditions = $query
    ->getConditionGroup()
    ->getConditions();
  $conditions = $this
    ->collectConditions($conditions);
  $this
    ->assertCount(1, $conditions);
  $condition = $conditions[0];
  $this
    ->assertEquals('name', $condition
    ->getField());
  $this
    ->assertEquals('foobar', $condition
    ->getValue());
  $this
    ->assertEquals($index_id, $query
    ->getIndex()
    ->id());
  $this
    ->assertEquals([
    'name',
  ], $query
    ->getFulltextFields());
}