search_api_autocomplete-8.x-1.x-dev/tests/src/FunctionalJavascript/PagesIntegrationTest.php
tests/src/FunctionalJavascript/PagesIntegrationTest.php
<?php namespace Drupal\Tests\search_api_autocomplete\FunctionalJavascript; use Drupal\search_api_autocomplete\Entity\Search; use Drupal\search_api_autocomplete\SearchInterface; use Drupal\search_api_autocomplete\Tests\TestsHelper; use Drupal\search_api_page\Entity\SearchApiPage; /** * Tests integration with the Search API Pages module. * * @requires module search_api_page * @group search_api_autocomplete */ class PagesIntegrationTest extends IntegrationTestBase { /** * {@inheritdoc} */ protected static $modules = [ 'search_api_autocomplete_test_pages', ]; /** * The ID of the search index used in this test. * * @var string */ protected $indexId = 'autocomplete_search_index'; /** * The ID of the search entity created for this test. * * @var string */ protected $searchId = 'test_search'; /** * An admin user used for the tests. * * @var \Drupal\user\UserInterface */ protected $adminUser; /** * A normal (non-admin) user used for the tests. * * @var \Drupal\user\UserInterface */ protected $normalUser; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $permissions = [ 'administer search_api', 'administer search_api_autocomplete', 'view search api pages', ]; $this->adminUser = $this->drupalCreateUser($permissions); $this->normalUser = $this->drupalCreateUser(); // Make the test backend support autocomplete so that the "Server" suggester // becomes available. $callback = [TestsHelper::class, 'getSupportedFeatures']; $this->setMethodOverride('backend', 'getSupportedFeatures', $callback); $callback = [TestsHelper::class, 'getAutocompleteSuggestions']; $this->setMethodOverride('backend', 'getAutocompleteSuggestions', $callback); } /** * Tests autocomplete for search pages. */ public function testModule() { $this->drupalLogin($this->adminUser); $this->enableSearch(); $this->checkEntityDependencies(); $this->checkAutocompleteFunctionality(); $this->checkSearchPluginCacheClear(); } /** * Enables the search. */ protected function enableSearch() { $assert_session = $this->assertSession(); $this->drupalGet($this->getAdminPath()); // Check whether all expected groups and searches are present. $assert_session->pageTextContains('Search pages'); $assert_session->pageTextContains('Searches provided by the Search pages module'); $assert_session->pageTextContains('Test search page'); // Enable autocomplete for all search pages (just one). $assert_session->checkboxNotChecked("searches[{$this->searchId}]"); $this->click('table[data-drupal-selector="edit-search-pages-searches"] > thead > tr > th.select-all input.form-checkbox'); $assert_session->checkboxChecked("searches[{$this->searchId}]"); // Save the settings. $this->click('[data-drupal-selector="edit-actions-submit"]'); $this->logPageChange(NULL, 'POST'); $assert_session->pageTextContains('The settings have been saved.'); // Our admin user for this test doesn't have the "administer permissions" // permission, so the permission reminder should not be included. $assert_session->pageTextNotContains('Remember to set the permissions for the newly enabled searches.'); // Edit the search. $this->click('.dropbutton-action a[href$="/edit"]'); $this->logPageChange(); $assert_session->addressEquals($this->getAdminPath('edit')); $page = $this->getSession()->getPage(); $page->findButton('Show row weights')->click(); $edit = [ 'suggesters[enabled][server]' => TRUE, 'suggesters[enabled][search_api_autocomplete_test]' => TRUE, 'suggesters[weights][search_api_autocomplete_test][limit]' => '3', 'suggesters[weights][server][limit]' => '3', 'suggesters[weights][search_api_autocomplete_test][weight]' => '0', 'suggesters[weights][server][weight]' => '10', 'options[limit]' => '5', 'options[min_length]' => '2', 'options[show_count]' => TRUE, ]; $this->submitForm($edit, 'Save'); } /** * Verifies that the search entity's dependencies were calculated correctly. */ protected function checkEntityDependencies() { /** @var \Drupal\search_api_autocomplete\SearchInterface $search */ $search = Search::load($this->searchId); $expected = [ 'config' => [ 'search_api.index.autocomplete_search_index', "search_api_page.search_api_page.{$this->searchId}", ], 'module' => [ 'search_api_autocomplete_test', 'search_api_page', ], ]; $dependencies = $search->getDependencies(); ksort($dependencies); sort($dependencies['config']); sort($dependencies['module']); $this->assertEquals($expected, $dependencies); } /** * Checks that autocomplete works correctly. */ protected function checkAutocompleteFunctionality() { $assert_session = $this->assertSession(); $this->drupalGet('test-search'); $assert_session->elementAttributeContains('css', 'input[data-drupal-selector="edit-keys"]', 'data-search-api-autocomplete-search', $this->searchId); $elements = $this->getAutocompleteSuggestions(); $suggestions = []; foreach ($elements as $element) { $label = $this->getElementText($element, '.autocomplete-suggestion-label'); $user_input = $this->getElementText($element, '.autocomplete-suggestion-user-input'); $suffix = $this->getElementText($element, '.autocomplete-suggestion-suggestion-suffix'); $count = $this->getElementText($element, '.autocomplete-suggestion-results-count'); $keys = $label . $user_input . $suffix; $suggestions[] = [ 'keys' => $keys, 'count' => $count, ]; } $expected = [ [ 'keys' => 'Tést-suggester-1', 'count' => 1, ], [ 'keys' => 'Tést-suggester-2', 'count' => 2, ], [ 'keys' => 'Tést-suggester-url', 'count' => NULL, ], [ 'keys' => 'Tést-backend-1', 'count' => 1, ], [ 'keys' => 'Tést-backend-2', 'count' => 2, ], ]; $this->assertEquals($expected, $suggestions); /** @var \Drupal\search_api\Query\QueryInterface $query */ list($query) = $this->getMethodArguments('backend', 'getAutocompleteSuggestions'); $this->assertEquals(['name'], $query->getFulltextFields()); $this->drupalGet($this->getAdminPath('edit')); $page = $this->getSession()->getPage(); $page->find('css', '#edit-suggesters-settings-server > summary')->click(); $edit = [ 'suggesters[settings][server][fields][body]' => TRUE, ]; $this->submitForm($edit, 'Save'); $this->drupalGet('test-search'); $elements = $this->getAutocompleteSuggestions(); $this->assertCount(5, $elements); list($query) = $this->getMethodArguments('backend', 'getAutocompleteSuggestions'); $this->assertEquals(['body'], $query->getFulltextFields()); } /** * Tests whether the search plugin cache is cleared correctly. */ protected function checkSearchPluginCacheClear() { $assert_session = $this->assertSession(); $search = Search::load($this->searchId); $this->assertInstanceOf(SearchInterface::class, $search); $page = SearchApiPage::load($this->searchId); $page2 = $page->createDuplicate(); $page2->set('id', 'foobar'); $page2->set('label', 'Foobar'); $this->drupalGet($this->getAdminPath()); $assert_session->pageTextContains('Test search page'); $assert_session->pageTextNotContains('Foobar'); $page2->save(); $this->drupalGet($this->getAdminPath()); $assert_session->pageTextContains('Test search page'); $assert_session->pageTextContains('Foobar'); $page->delete(); $this->drupalGet($this->getAdminPath()); $assert_session->pageTextNotContains('Test search page'); $assert_session->pageTextContains('Foobar'); $search = Search::load($this->searchId); $this->assertNull($search); } }