search_api-8.x-1.15/modules/search_api_db/search_api_db_defaults/tests/src/Functional/IntegrationTest.php
modules/search_api_db/search_api_db_defaults/tests/src/Functional/IntegrationTest.php
<?php
namespace Drupal\Tests\search_api_db_defaults\Functional;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\comment\Tests\CommentTestTrait;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
use Drupal\search_api\Entity\Index;
use Drupal\search_api\Entity\Server;
use Drupal\Tests\BrowserTestBase;
/**
* Tests the correct installation of the default configs.
*
* @group search_api
*/
class IntegrationTest extends BrowserTestBase {
use StringTranslationTrait, CommentTestTrait, EntityReferenceTestTrait;
/**
* The profile to install as a basis for testing.
*
* @var string
*/
protected $profile = 'standard';
/**
* A non-admin user used for this test.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $authenticatedUser;
/**
* An admin user used for this test.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $adminUser;
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
// Create user with content access permission to see if the view is
// accessible, and an admin to do the setup.
$this->authenticatedUser = $this->drupalCreateUser();
$this->adminUser = $this->drupalCreateUser([], NULL, TRUE);
}
/**
* Tests whether the default search was correctly installed.
*/
public function testInstallAndDefaultSetupWorking() {
$this->drupalLogin($this->adminUser);
// Installation invokes a batch and this breaks it.
\Drupal::state()->set('search_api_use_tracking_batch', FALSE);
// Install the search_api_db_defaults module.
$edit_enable = [
'modules[search_api_db_defaults][enable]' => TRUE,
];
$this->drupalPostForm('admin/modules', $edit_enable, 'Install');
$this->assertSession()->pageTextContains('Some required modules must be enabled');
$this->drupalPostForm(NULL, [], 'Continue');
$this->assertSession()->pageTextContains('3 modules have been enabled: Database Search Defaults, Database Search, Search API');
$this->rebuildContainer();
$this->drupalPostForm('admin/config/search/search-api/server/default_server/edit', [], 'Save');
$this->assertSession()->pageTextContains('The server was successfully saved.');
$server = Server::load('default_server');
$this->assertTrue($server, 'Server can be loaded');
$index = Index::load('default_index');
$this->assertTrue($index, 'Index can be loaded');
$this->drupalLogin($this->authenticatedUser);
$this->drupalGet('search/content');
$this->assertSession()->statusCodeEquals(200);
$this->drupalLogin($this->adminUser);
$title = 'Test node title';
$edit = [
'title[0][value]' => $title,
'body[0][value]' => 'This is test content for the Search API to index.',
];
$this->drupalPostForm('node/add/article', $edit, 'Save');
$this->drupalLogout();
$this->drupalGet('search/content');
$this->assertSession()->pageTextContains('Please enter some keywords to search.');
$this->assertSession()->pageTextNotContains($title);
$this->assertSession()->responseNotContains('Error message');
$this->submitForm([], 'Search');
$this->assertSession()->pageTextNotContains($title);
$this->assertSession()->responseNotContains('Error message');
$this->submitForm(['keys' => 'test'], 'Search');
$this->assertSession()->pageTextContains($title);
$this->assertSession()->responseNotContains('Error message');
// Uninstall the module.
$this->drupalLogin($this->adminUser);
$edit_disable = [
'uninstall[search_api_db_defaults]' => TRUE,
];
$this->drupalPostForm('admin/modules/uninstall', $edit_disable, 'Uninstall');
$this->submitForm([], 'Uninstall');
$this->rebuildContainer();
$this->assertFalse($this->container->get('module_handler')->moduleExists('search_api_db_defaults'), 'Search API DB Defaults module uninstalled.');
// Check if the server is found in the Search API admin UI.
$this->drupalGet('admin/config/search/search-api/server/default_server');
$this->assertSession()->statusCodeEquals(200);
// Check if the index is found in the Search API admin UI.
$this->drupalGet('admin/config/search/search-api/index/default_index');
$this->assertSession()->statusCodeEquals(200);
// Check that saving any of the index's config forms works fine.
foreach (['edit', 'fields', 'processors'] as $tab) {
$submit = $tab == 'fields' ? 'Save changes' : 'Save';
$this->drupalGet("admin/config/search/search-api/index/default_index/$tab");
$this->submitForm([], $submit);
$this->assertSession()->statusCodeEquals(200);
}
$this->drupalLogin($this->authenticatedUser);
$this->drupalGet('search/content');
$this->assertSession()->statusCodeEquals(200);
$this->drupalLogin($this->adminUser);
// Enable the module again. This should fail because the either the index
// or the server or the view was found.
$this->drupalPostForm('admin/modules', $edit_enable, 'Install');
$this->assertSession()->pageTextContains('It looks like the default setup provided by this module already exists on your site. Cannot re-install module.');
// Delete all the entities that we would fail on if they exist.
$entities_to_remove = [
'search_api_index' => 'default_index',
'search_api_server' => 'default_server',
'view' => 'search_content',
];
/** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
$entity_type_manager = \Drupal::service('entity_type.manager');
foreach ($entities_to_remove as $entity_type => $entity_id) {
/** @var \Drupal\Core\Entity\EntityStorageInterface $entity_storage */
$entity_storage = $entity_type_manager->getStorage($entity_type);
$entity_storage->resetCache();
$entities = $entity_storage->loadByProperties(['id' => $entity_id]);
if (!empty($entities[$entity_id])) {
$entities[$entity_id]->delete();
}
}
// Delete the article content type.
$this->drupalGet('node/1/delete');
$this->submitForm([], 'Delete');
$this->drupalGet('admin/structure/types/manage/article');
$this->clickLink('Delete');
$this->assertSession()->statusCodeEquals(200);
$this->submitForm([], 'Delete');
// Try to install search_api_db_defaults module and test if it failed
// because there was no content type "article".
$this->drupalPostForm('admin/modules', $edit_enable, 'Install');
$success_text = new FormattableMarkup('Content type @content_type not found. Database Search Defaults module could not be installed.', ['@content_type' => 'article']);
$this->assertSession()->pageTextContains($success_text);
}
}
