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);
}
}
