search_api_autocomplete-8.x-1.x-dev/tests/src/Functional/CacheInvalidationTest.php
tests/src/Functional/CacheInvalidationTest.php
<?php
namespace Drupal\Tests\search_api_autocomplete\Functional;
use Drupal\search_api_autocomplete\Entity\Search;
use Drupal\Tests\BrowserTestBase;
use Drupal\views\Entity\View;
/**
* Tests whether caches are always invalidated correctly.
*
* @group search_api_autocomplete
*/
class CacheInvalidationTest extends BrowserTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'block',
'search_api_autocomplete_test',
'search_api_autocomplete_test_pages',
];
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
// Change the view to use an exposed form block.
$view_id = 'search_api_autocomplete_test_view';
$view = View::load($view_id);
$displays = $view->get('display');
$displays['page']['display_options']['exposed_block'] = TRUE;
$view->set('display', $displays);
$view->save();
// Enable the exposed form block.
$this->placeBlock("views_exposed_filter_block:$view_id-page");
// Enable the search page block.
$this->placeBlock('search_api_page_form_block', [
'search_api_page' => 'test_search',
]);
// Enable the "Custom scripts" suggester.
\Drupal::configFactory()
->getEditable('search_api_autocomplete.settings')
->set('enable_custom_scripts', TRUE)
->save();
// Log in an admin user so we don't run into any access-related
// difficulties.
$this->drupalLogin($this->createUser([
'administer search_api',
'administer search_api_autocomplete',
'administer search_api_page',
]));
}
/**
* {@inheritdoc}
*/
public function testCacheInvalidation() {
$assert_session = $this->assertSession();
// First, verify that no autocomplete is present by default, thus also
// priming the render cache.
$this->drupalGet('');
$input_selector = 'input[data-drupal-selector="edit-keys"]';
$views_selector = ".views-exposed-form $input_selector";
$element = $assert_session->elementExists('css', $views_selector);
$attribute = 'data-search-api-autocomplete-search';
$this->assertFalse($element->hasAttribute($attribute));
$page_selector = ".search-api-page-block-form $input_selector";
$element = $assert_session->elementExists('css', $page_selector);
$this->assertFalse($element->hasAttribute($attribute));
// Then, add autocomplete settings for both searches.
$views_search = Search::create([
'id' => 'search_api_autocomplete_test_view',
'label' => 'Search API Autocomplete Test view',
'status' => TRUE,
'index_id' => 'autocomplete_search_index',
'suggester_settings' => [
'custom_script' => [
'path' => '/foo',
],
],
'search_settings' => [
'views:search_api_autocomplete_test_view' => [],
],
]);
$views_search->save();
$page_search = Search::create([
'id' => 'test_search',
'label' => 'Test search page',
'status' => TRUE,
'index_id' => 'autocomplete_search_index',
'suggester_settings' => [
'custom_script' => [
'path' => '/bar',
],
],
'search_settings' => [
'page:test_search' => [],
],
]);
$page_search->save();
// View the page again and verify that autocomplete was now added for both
// forms.
$this->drupalGet('');
$assert_session->elementAttributeContains('css', $views_selector, 'data-search-api-autocomplete-search', $views_search->id());
$assert_session->elementAttributeContains('css', $views_selector, 'data-autocomplete-path', '/foo');
$assert_session->elementAttributeContains('css', $page_selector, 'data-search-api-autocomplete-search', $page_search->id());
$assert_session->elementAttributeContains('css', $page_selector, 'data-autocomplete-path', '/bar');
// Change the autocomplete search settings.
$views_search->getSuggester('custom_script')->setConfiguration([
'path' => '/foobar',
]);
$views_search->save();
$page_search->getSuggester('custom_script')->setConfiguration([
'path' => '/foo/bar',
]);
$page_search->save();
// Verify the changes are correctly applied when reloading the page.
$this->drupalGet('');
$assert_session->elementAttributeContains('css', $views_selector, 'data-search-api-autocomplete-search', $views_search->id());
$assert_session->elementAttributeContains('css', $views_selector, 'data-autocomplete-path', '/foobar');
$assert_session->elementAttributeContains('css', $page_selector, 'data-search-api-autocomplete-search', $page_search->id());
$assert_session->elementAttributeContains('css', $page_selector, 'data-autocomplete-path', '/foo/bar');
}
}
