class SearchApiSolrTest in Search API Solr 8.2
Same name and namespace in other branches
- 8.3 tests/src/Kernel/SearchApiSolrTest.php \Drupal\Tests\search_api_solr\Kernel\SearchApiSolrTest
- 8 tests/src/Kernel/SearchApiSolrTest.php \Drupal\Tests\search_api_solr\Kernel\SearchApiSolrTest
- 4.x tests/src/Kernel/SearchApiSolrTest.php \Drupal\Tests\search_api_solr\Kernel\SearchApiSolrTest
Tests index and search capabilities using the Solr search backend.
@group search_api_solr
Hierarchy
- class \Drupal\KernelTests\KernelTestBase extends \PHPUnit\Framework\TestCase implements ServiceProviderInterface uses AssertContentTrait, AssertLegacyTrait, AssertHelperTrait, ConfigTestTrait, PhpunitCompatibilityTrait, RandomGeneratorTrait, TestRequirementsTrait
- class \Drupal\Tests\search_api\Kernel\BackendTestBase uses StringTranslationTrait, ExampleContentTrait
- class \Drupal\Tests\search_api_solr\Kernel\SolrBackendTestBase uses SolrCommitTrait
- class \Drupal\Tests\search_api_solr\Kernel\SearchApiSolrTest uses SolrCommitTrait, InvokeMethodTrait
- class \Drupal\Tests\search_api_solr\Kernel\SolrBackendTestBase uses SolrCommitTrait
- class \Drupal\Tests\search_api\Kernel\BackendTestBase uses StringTranslationTrait, ExampleContentTrait
Expanded class hierarchy of SearchApiSolrTest
File
- tests/
src/ Kernel/ SearchApiSolrTest.php, line 22
Namespace
Drupal\Tests\search_api_solr\KernelView source
class SearchApiSolrTest extends SolrBackendTestBase {
use SolrCommitTrait;
use InvokeMethodTrait;
/**
* Modules to enable for this test.
*
* @var string[]
*/
public static $modules = [
'search_api_autocomplete',
'search_api_solr_test',
'user',
];
/**
* @var \Drupal\search_api\Utility\FieldsHelperInterface
*/
protected $fieldsHelper;
/**
* {@inheritdoc}
*/
protected function installConfigs() {
parent::installConfigs();
$this
->installConfig([
'search_api_solr_test',
]);
}
/**
*
*/
protected function commonSolrBackendSetUp() {
parent::commonSolrBackendSetUp();
$this
->installEntitySchema('user');
$this->fieldsHelper = \Drupal::getContainer()
->get('search_api.fields_helper');
}
/**
* {@inheritdoc}
*/
protected function backendSpecificRegressionTests() {
$this
->regressionTest2888629();
$this
->regressionTest2850160();
$this
->indexPrefixTest();
}
protected function indexPrefixTest() {
$backend = Server::load($this->serverId)
->getBackend();
$index = $this
->getIndex();
$prefixed_index_id = $this
->invokeMethod($backend, 'getIndexId', [
$index,
]);
$this
->assertEquals('server_prefixindex_prefix' . $index
->id(), $prefixed_index_id);
}
/**
* Regression tests for #2469547.
*/
protected function regressionTest2469547() {
$query = $this
->buildSearch();
$facets = [];
$facets['body'] = [
'field' => 'body',
'limit' => 0,
'min_count' => 1,
'missing' => FALSE,
];
$query
->setOption('search_api_facets', $facets);
$query
->addCondition('id', 5, '<>');
$query
->range(0, 0);
$results = $query
->execute();
$expected = $this
->getExpectedFacetsOfRegressionTest2469547();
// We can't guarantee the order of returned facets, since "bar" and "foobar"
// both occur once, so we have to manually sort the returned facets first.
$facets = $results
->getExtraData('search_api_facets', [])['body'];
usort($facets, [
$this,
'facetCompare',
]);
$this
->assertEquals($expected, $facets, 'Correct facets were returned for a fulltext field.');
}
/**
* Regression tests for #2888629.
*/
protected function regressionTest2888629() {
$query = $this
->buildSearch();
$query
->addCondition('category', NULL);
$results = $query
->execute();
$this
->assertResults([
3,
], $results, 'comparing against NULL');
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR');
$conditions
->addCondition('category', 'article_category', '<>');
$conditions
->addCondition('category', NULL);
$query
->addConditionGroup($conditions);
$results = $query
->execute();
$this
->assertResults([
1,
2,
3,
], $results, 'group comparing against category NOT article_category OR category NULL');
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('AND');
$conditions
->addCondition('body', NULL, '<>');
$conditions
->addCondition('category', 'article_category', '<>');
$conditions
->addCondition('category', NULL, '<>');
$query
->addConditionGroup($conditions);
$results = $query
->execute();
$this
->assertResults([
1,
2,
], $results, 'group comparing against body NOT NULL AND category NOT article_category AND category NOT NULL');
}
/**
* Regression tests for #2850160.
*/
public function regressionTest2850160() {
$backend = Server::load($this->serverId)
->getBackend();
$index = $this
->getIndex();
// Load existing test entity.
$entity = \Drupal::entityTypeManager()
->getStorage('entity_test_mulrev_changed')
->load(1);
// Prepare Search API item.
$id = Utility::createCombinedId('entity:entity_test_mulrev_changed', $entity
->id());
/** @var \Drupal\search_api\Item\ItemInterface $item */
$item = \Drupal::getContainer()
->get('search_api.fields_helper')
->createItemFromObject($index, $entity
->getTypedData(), $id);
$item
->setBoost('3.0');
// Get Solr document.
/** @var \Solarium\QueryType\Update\Query\Document\Document $document */
$document = $this
->invokeMethod($backend, 'getDocument', [
$index,
$item,
]);
// Compare boost values.
$this
->assertEquals($item
->getBoost(), $document
->getBoost());
}
public function searchSuccess() {
parent::searchSuccess();
$parse_mode_manager = \Drupal::service('plugin.manager.search_api.parse_mode');
$parse_mode_direct = $parse_mode_manager
->createInstance('direct');
$results = $this
->buildSearch('+test +case', [], [
'body',
])
->setParseMode($parse_mode_direct)
->execute();
$this
->assertResults([
1,
2,
3,
], $results, 'Parse mode direct with AND');
$results = $this
->buildSearch('test -case', [], [
'body',
])
->setParseMode($parse_mode_direct)
->execute();
$this
->assertResults([
4,
], $results, 'Parse mode direct with NOT');
$results = $this
->buildSearch('"test case"', [], [
'body',
])
->setParseMode($parse_mode_direct)
->execute();
$this
->assertResults([
1,
2,
], $results, 'Parse mode direct with phrase');
}
/**
* Return the expected facets for regression test 2469547.
*
* The facets differ for Solr backends because of case-insensitive filters.
*
* @return array
*/
protected function getExpectedFacetsOfRegressionTest2469547() {
return [
[
'count' => 4,
'filter' => '"test"',
],
[
'count' => 3,
'filter' => '"case"',
],
[
'count' => 1,
'filter' => '"bar"',
],
[
'count' => 1,
'filter' => '"foobar"',
],
];
}
/**
* {@inheritdoc}
*/
protected function checkModuleUninstall() {
// See whether clearing the server works.
// Regression test for #2156151.
/** @var \Drupal\search_api\ServerInterface $server */
$server = Server::load($this->serverId);
/** @var \Drupal\search_api\IndexInterface $index */
$index = Index::load($this->indexId);
$server
->deleteAllIndexItems($index);
$this
->ensureCommit($server);
$query = $this
->buildSearch();
$results = $query
->execute();
$this
->assertEquals(0, $results
->getResultCount(), 'Clearing the server worked correctly.');
}
/**
* {@inheritdoc}
*/
protected function assertIgnored(ResultSetInterface $results, array $ignored = [], $message = 'No keys were ignored.') {
// Nothing to do here since the Solr backend doesn't keep a list of ignored
// fields.
}
/**
* Gets the Drupal Fields and their Solr mapping.
*
* @param \Drupal\search_api_solr\SolrBackendInterface $backend
* The backend the mapping is used for.
*
* @return array
* [$fields, $mapping]
*/
protected function getFieldsAndMapping(SolrBackendInterface $backend) {
/** @var \Drupal\search_api\IndexInterface $index */
$index = Index::load($this->indexId);
$fields = $index
->getFields();
$fields += $this
->invokeMethod($backend, 'getSpecialFields', [
$index,
]);
$field_info = [
'type' => 'string',
'original type' => 'string',
];
$fields['x'] = $this->fieldsHelper
->createField($index, 'x', $field_info);
$fields['y'] = $this->fieldsHelper
->createField($index, 'y', $field_info);
$fields['z'] = $this->fieldsHelper
->createField($index, 'z', $field_info);
$mapping = $backend
->getSolrFieldNames($index) + [
'x' => 'solr_x',
'y' => 'solr_y',
'z' => 'solr_z',
];
return [
$fields,
$mapping,
];
}
/**
* Tests the conversion of Search API queries into Solr queries.
*/
public function testQueryParsers() {
/** @var \Drupal\search_api_solr\SolrBackendInterface $backend */
$backend = Server::load($this->serverId)
->getBackend();
$query = $this
->buildSearch('foo "apple pie" bar');
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[],
'phrase',
]);
$this
->assertEquals('(+"foo" +"apple pie" +"bar")', $flat);
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[],
'terms',
]);
$this
->assertEquals('(+foo +apple\\ pie +bar)', $flat);
$exception = FALSE;
try {
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[],
'direct',
]);
} catch (SearchApiSolrException $e) {
$exception = TRUE;
}
$this
->assertTrue($exception);
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[
'solr_field',
],
'phrase',
]);
$this
->assertEquals('(+solr_field:"foo" +solr_field:"apple pie" +solr_field:"bar")', $flat);
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[
'solr_field',
],
'terms',
]);
$this
->assertEquals('(+solr_field:foo +solr_field:apple\\ pie +solr_field:bar)', $flat);
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[
'solr_field_1',
'solr_field_2',
],
'phrase',
]);
$this
->assertEquals('(+(solr_field_1:"foo" solr_field_2:"foo") +(solr_field_1:"apple pie" solr_field_2:"apple pie") +(solr_field_1:"bar" solr_field_2:"bar"))', $flat);
$flat = $this
->invokeMethod($backend, 'flattenKeys', [
$query
->getKeys(),
[
'solr_field_1',
'solr_field_2',
],
'terms',
]);
$this
->assertEquals('(+(solr_field_1:foo solr_field_2:foo) +(solr_field_1:apple\\ pie solr_field_2:apple\\ pie) +(solr_field_1:bar solr_field_2:bar))', $flat);
}
/**
* Tests the conversion of Search API queries into Solr queries.
*/
public function testQueryConditions() {
/** @var \Drupal\search_api_solr\SolrBackendInterface $backend */
$backend = Server::load($this->serverId)
->getBackend();
list($fields, $mapping) = $this
->getFieldsAndMapping($backend);
$options = [];
$query = $this
->buildSearch();
$query
->addCondition('x', 5, '=');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('solr_x:"5"', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$query
->addCondition('x', 5, '<>');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(*:* -solr_x:"5")', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$query
->addCondition('x', 3, '<>');
$query
->addCondition('x', 5, '<>');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(*:* -solr_x:"3")', $fq[0]['query']);
$this
->assertEquals('(*:* -solr_x:"5")', $fq[1]['query']);
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 3, '<>');
$condition_group
->addCondition('x', 5, '<>');
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"3") +(*:* -solr_x:"5"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5, '<>');
$condition_group
->addCondition('y', 3);
$condition_group
->addCondition('z', 7);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +solr_y:"3" +solr_z:"7")', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group = $query
->createConditionGroup('OR');
$condition_group
->addCondition('x', 5, '<>');
$inner_condition_group
->addCondition('y', 3);
$inner_condition_group
->addCondition('z', 7);
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +(solr_y:"3" solr_z:"7"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
// Condition groups with null value queries are special snowflakes.
// @see https://www.drupal.org/node/2888629
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group = $query
->createConditionGroup('OR');
$condition_group
->addCondition('x', 5, '<>');
$inner_condition_group
->addCondition('y', 3);
$inner_condition_group
->addCondition('z', NULL);
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +(solr_y:"3" (*:* -solr_z:[* TO *])))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group_or = $query
->createConditionGroup('OR');
$inner_condition_group_or
->addCondition('x', 3);
$inner_condition_group_or
->addCondition('y', 7, '<>');
$inner_condition_group_and = $query
->createConditionGroup();
$inner_condition_group_and
->addCondition('x', 1);
$inner_condition_group_and
->addCondition('y', 2, '<>');
$inner_condition_group_and
->addCondition('z', 5, '<');
$condition_group
->addConditionGroup($inner_condition_group_or);
$condition_group
->addConditionGroup($inner_condition_group_and);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(solr_x:"3" (*:* -solr_y:"7")) +(+solr_x:"1" +(*:* -solr_y:"2") +solr_z:{* TO "5"}))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$inner_condition_group = $query
->createConditionGroup();
$inner_condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
// Test tagging of a single filter query of a facet query.
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR', [
'facet:' . 'tagtosearchfor',
]);
$conditions
->addCondition('category', 'article_category');
$query
->addConditionGroup($conditions);
$conditions = $query
->createConditionGroup('AND');
$conditions
->addCondition('category', NULL, '<>');
$query
->addConditionGroup($conditions);
$facets['category'] = [
'field' => 'category',
'limit' => 0,
'min_count' => 1,
'missing' => TRUE,
'operator' => 'or',
];
$query
->setOption('search_api_facets', $facets);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('ss_category:"article_category"', $fq[0]['query'], 'Condition found in tagged first filter query');
$this
->assertEquals([
'facet:tagtosearchfor' => 'facet:tagtosearchfor',
], $fq[0]['tags'], 'Tag found in tagged first filter query');
$this
->assertEquals('ss_category:[* TO *]', $fq[1]['query'], 'Condition found in unrelated second filter query');
$this
->assertEquals([], $fq[1]['tags'], 'No tag found in second filter query');
// @see https://www.drupal.org/node/2753917
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR', [
'facet:x',
]);
$conditions
->addCondition('x', 'A');
$conditions
->addCondition('x', 'B');
$query
->addConditionGroup($conditions);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals(1, count($fq));
$this
->assertEquals([
'facet:x' => 'facet:x',
], $fq[0]['tags']);
$this
->assertEquals('(solr_x:"A" solr_x:"B")', $fq[0]['query']);
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('AND', [
'facet:x',
]);
$conditions
->addCondition('x', 'A');
$conditions
->addCondition('x', 'B');
$query
->addConditionGroup($conditions);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals(1, count($fq));
$this
->assertEquals([
'facet:x' => 'facet:x',
], $fq[0]['tags']);
$this
->assertEquals('(+solr_x:"A" +solr_x:"B")', $fq[0]['query']);
}
/**
* Tests the conversion of language aware queries into Solr queries.
*/
public function testQueryConditionsAndLanguageFilter() {
/** @var \Drupal\search_api_solr\SolrBackendInterface $backend */
$backend = Server::load($this->serverId)
->getBackend();
list($fields, $mapping) = $this
->getFieldsAndMapping($backend);
$options = [];
$query = $this
->buildSearch();
$query
->setLanguages([
'en',
]);
$query
->addCondition('x', 5, '=');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('solr_x:"5"', $fq[0]['query']);
$this
->assertEquals('ss_search_api_language:"en"', $fq[1]['query']);
$query = $this
->buildSearch();
$query
->setLanguages([
'en',
'de',
]);
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$inner_condition_group = $query
->createConditionGroup();
$inner_condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertEquals('(ss_search_api_language:"en" ss_search_api_language:"de")', $fq[1]['query']);
}
/**
* Tests retrieve_data options.
*/
public function testRetrieveData() {
$server = $this
->getIndex()
->getServerInstance();
$config = $server
->getBackendConfig();
$backend = $server
->getBackend();
$this
->insertExampleContent();
$this
->indexItems($this->indexId);
// Retrieve just required fields.
$query = $this
->buildSearch('foobar');
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
/** @var \Solarium\QueryType\Select\Result\Document $solr_document */
$solr_document = $result
->getExtraData('search_api_solr_document', NULL);
$fields = $solr_document
->getFields();
$this
->assertEquals('entity:entity_test_mulrev_changed/3:en', $fields['ss_search_api_id']);
$this
->assertEquals('en', $fields['ss_search_api_language']);
$this
->assertArrayHasKey('score', $fields);
$this
->assertArrayNotHasKey('tm_body', $fields);
$this
->assertArrayNotHasKey('id', $fields);
$this
->assertArrayNotHasKey('its_id', $fields);
$this
->assertArrayNotHasKey('twm_suggest', $fields);
}
// Retrieve all fields.
$config['retrieve_data'] = TRUE;
$server
->setBackendConfig($config);
$server
->save();
$query = $this
->buildSearch('foobar');
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
/** @var \Solarium\QueryType\Select\Result\Document $solr_document */
$solr_document = $result
->getExtraData('search_api_solr_document', NULL);
$fields = $solr_document
->getFields();
$this
->assertEquals('entity:entity_test_mulrev_changed/3:en', $fields['ss_search_api_id']);
$this
->assertEquals('en', $fields['ss_search_api_language']);
$this
->assertArrayHasKey('score', $fields);
$this
->assertArrayHasKey('tm_body', $fields);
$this
->assertContains('search_index-entity:entity_test_mulrev_changed/3:en', $fields['id']);
$this
->assertEquals('3', $fields['its_id']);
$this
->assertArrayHasKey('twm_suggest', $fields);
}
// Retrieve list of fields in addition to required fields.
$query = $this
->buildSearch('foobar');
$query
->setOption('search_api_retrieved_field_values', [
'body' => 'body',
]);
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
/** @var \Solarium\QueryType\Select\Result\Document $solr_document */
$solr_document = $result
->getExtraData('search_api_solr_document', NULL);
$fields = $solr_document
->getFields();
$this
->assertEquals('entity:entity_test_mulrev_changed/3:en', $fields['ss_search_api_id']);
$this
->assertEquals('en', $fields['ss_search_api_language']);
$this
->assertArrayHasKey('score', $fields);
$this
->assertArrayHasKey('tm_body', $fields);
$this
->assertArrayNotHasKey('id', $fields);
$this
->assertArrayNotHasKey('its_id', $fields);
$this
->assertArrayNotHasKey('twm_suggest', $fields);
}
$this
->assertEquals([
0 => 'name',
1 => 'body',
2 => 'body_unstemmed',
// body_suggest should be removed by getQueryFulltextFields().
// 3 => 'body_suggest',
4 => 'category_ngram',
], $this
->invokeMethod($backend, 'getQueryFulltextFields', [
$query,
]));
}
/**
* Tests highlight options.
*/
public function testHighlight() {
$server = $this
->getIndex()
->getServerInstance();
$config = $server
->getBackendConfig();
$this
->insertExampleContent();
$this
->indexItems($this->indexId);
$query = $this
->buildSearch('foobar');
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
$this
->assertEmpty($result
->getExtraData('highlighted_fields', []));
$this
->assertEmpty($result
->getExtraData('highlighted_keys', []));
}
$config['highlight_data'] = TRUE;
$server
->setBackendConfig($config);
$server
->save();
$query = $this
->buildSearch('foobar');
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
$this
->assertContains('<strong>foobar</strong>', (string) $result
->getExtraData('highlighted_fields', [
'body' => [
'',
],
])['body'][0]);
$this
->assertEquals([
'foobar',
], $result
->getExtraData('highlighted_keys', []));
$this
->assertEquals('… bar … test <strong>foobar</strong> Case …', $result
->getExcerpt());
}
// Test highlghting with stemming.
$query = $this
->buildSearch('foobars');
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
/** @var \Drupal\search_api\Item\ItemInterface $result */
foreach ($results as $result) {
$this
->assertContains('<strong>foobar</strong>', (string) $result
->getExtraData('highlighted_fields', [
'body' => [
'',
],
])['body'][0]);
$this
->assertEquals([
'foobar',
], $result
->getExtraData('highlighted_keys', []));
$this
->assertEquals('… bar … test <strong>foobar</strong> Case …', $result
->getExcerpt());
}
}
/**
* Test that basic auth config gets passed to Solarium.
*/
public function testBasicAuth() {
$server = $this
->getServer();
$config = $server
->getBackendConfig();
$config['connector_config']['username'] = 'foo';
$config['connector_config']['password'] = 'bar';
$server
->setBackendConfig($config);
/** @var \Drupal\search_api_solr\SolrBackendInterface $backend */
$backend = $server
->getBackend();
$auth = $backend
->getSolrConnector()
->getEndpoint()
->getAuthentication();
$this
->assertEquals([
'username' => 'foo',
'password' => 'bar',
], $auth);
}
/**
* Tests addition and deletion of a data source.
*/
public function testDatasourceAdditionAndDeletion() {
$this
->insertExampleContent();
$this
->indexItems($this->indexId);
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(5, $results
->getResultCount(), 'Number of indexed entities is correct.');
try {
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->fail('Field uid must not yet exists in this index.');
} catch (\Exception $e) {
$this
->assertEquals('Filter term on unknown or unindexed field uid.', $e
->getMessage());
}
$index = $this
->getIndex();
$index
->set('datasource_settings', $index
->get('datasource_settings') + [
'entity:user' => [],
]);
$info = [
'label' => 'uid',
'type' => 'integer',
'datasource_id' => 'entity:user',
'property_path' => 'uid',
];
$index
->addField($this->fieldsHelper
->createField($index, 'uid', $info));
$index
->save();
User::create([
'uid' => 1,
'name' => 'root',
'langcode' => 'en',
])
->save();
$this
->indexItems($this->indexId);
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(6, $results
->getResultCount(), 'Number of indexed entities in multi datasource index is correct.');
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for users returned correct number of results.');
$index = $this
->getIndex();
$index
->removeDatasource('entity:user')
->save();
$this
->ensureCommit($index
->getServerInstance());
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(5, $results
->getResultCount(), 'Number of indexed entities is correct.');
try {
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->fail('Field uid must not yet exists in this index.');
} catch (\Exception $e) {
$this
->assertEquals('Filter term on unknown or unindexed field uid.', $e
->getMessage());
}
}
/**
* Produces a string of given comprising diverse chars.
*
* @param int $length
* Length of the string.
*
* @return string
*/
protected function getLongText($length) {
$sequence = 'abcdefghijklmnopqrstuwxyz1234567890,./;\'[]\\<>?:"{}|~!@#$%^&*()_+`1234567890-=ööążźćęółńABCDEFGHIJKLMNOPQRSTUWXYZ';
$result = '';
$i = 0;
$sequenceLength = strlen($sequence);
while ($i++ != $length) {
$result .= $sequence[$i % $sequenceLength];
}
return $result;
}
/**
* Tests search result sorts.
*/
public function testSearchResultSorts() {
$this
->insertExampleContent();
// Add node with body length just above the solr limit for search fields.
// It's exceeded by just a single char to simulate an edge case.
$this
->addTestEntity(6, [
'name' => 'Long text',
'body' => $this
->getLongText(32767),
'type' => 'article',
]);
// Add another node with body length equal to the limit.
$this
->addTestEntity(7, [
'name' => 'Z long',
'body' => $this
->getLongText(32766),
'type' => 'article',
]);
$this
->indexItems($this->indexId);
// Type text.
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('name')
->sort('search_api_id')
->execute();
$this
->assertResults([
3,
5,
1,
4,
2,
6,
7,
], $results, 'Sort by name.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('name', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
7,
6,
2,
4,
1,
5,
3,
], $results, 'Sort by name descending.');
// Type string.
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('type')
->sort('search_api_id')
->execute();
$this
->assertResults([
4,
5,
6,
7,
1,
2,
3,
], $results, 'Sort by type.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('type', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
3,
4,
5,
6,
7,
], $results, 'Sort by type descending.');
// Type multi-value string. Uses first value.
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('keywords')
->sort('search_api_id')
->execute();
$this
->assertResults([
3,
6,
7,
4,
1,
2,
5,
], $results, 'Sort by keywords.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('keywords', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
5,
4,
3,
6,
7,
], $results, 'Sort by keywords descending.');
// Type decimal.
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('width')
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
3,
6,
7,
4,
5,
], $results, 'Sort by width.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('width', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
5,
4,
1,
2,
3,
6,
7,
], $results, 'Sort by width descending.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('changed')
->execute();
$this
->assertResults([
1,
2,
3,
4,
5,
6,
7,
], $results, 'Sort by last update date');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('changed', QueryInterface::SORT_DESC)
->execute();
$this
->assertResults([
7,
6,
5,
4,
3,
2,
1,
], $results, 'Sort by last update date descending');
}
/**
* Tests the autocomplete support.
*/
public function testAutocomplete() {
$this
->addTestEntity(1, [
'name' => 'Test Article 1',
'body' => 'The test article number 1 about cats, dogs and trees.',
'type' => 'article',
]);
// Add another node with body length equal to the limit.
$this
->addTestEntity(2, [
'name' => 'Test Article 1',
'body' => 'The test article number 2 about a tree.',
'type' => 'article',
]);
$this
->indexItems($this->indexId);
/** @var \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend $backend */
$backend = Server::load($this->serverId)
->getBackend();
$autocompleteSearch = new Search([], 'search_api_autocomplete_search');
$query = $this
->buildSearch([
'artic',
], [], [
'body_unstemmed',
], FALSE);
$suggestions = $backend
->getAutocompleteSuggestions($query, $autocompleteSearch, 'artic', 'artic');
$this
->assertEquals(1, count($suggestions));
$this
->assertEquals('le', $suggestions[0]
->getSuggestionSuffix());
$this
->assertEquals(2, $suggestions[0]
->getResultsCount());
$query = $this
->buildSearch([
'artic',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getTermsSuggestions($query, $autocompleteSearch, 'artic', 'artic');
$this
->assertEquals(1, count($suggestions));
// This time we test the stemmed token.
$this
->assertEquals('l', $suggestions[0]
->getSuggestionSuffix());
$this
->assertEquals(2, $suggestions[0]
->getResultsCount());
$query = $this
->buildSearch([
'articel',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getSpellcheckSuggestions($query, $autocompleteSearch, 'articel', 'articel');
$this
->assertEquals(1, count($suggestions));
$this
->assertEquals('article', $suggestions[0]
->getSuggestedKeys());
$this
->assertEquals(0, $suggestions[0]
->getResultsCount());
$query = $this
->buildSearch([
'article tre',
], [], [
'body_unstemmed',
], FALSE);
$suggestions = $backend
->getAutocompleteSuggestions($query, $autocompleteSearch, 'tre', 'article tre');
$this
->assertEquals('article tree', $suggestions[0]
->getSuggestedKeys());
$this
->assertEquals(1, $suggestions[0]
->getResultsCount());
// Having set preserveOriginal in WordDelimiter let punction remain.
$this
->assertEquals('article tree.', $suggestions[1]
->getSuggestedKeys());
$this
->assertEquals(1, $suggestions[1]
->getResultsCount());
$this
->assertEquals('article trees', $suggestions[2]
->getSuggestedKeys());
$this
->assertEquals(1, $suggestions[2]
->getResultsCount());
$this
->assertEquals('article trees.', $suggestions[3]
->getSuggestedKeys());
$this
->assertEquals(1, $suggestions[3]
->getResultsCount());
// @todo spellcheck tests
#$query = $this->buildSearch(['articel doks'], [], ['body'], FALSE);
#$suggestions = $backend->getSpellcheckSuggestions($query, $autocompleteSearch, 'doks', 'articel doks');
#$this->assertEquals(1, count($suggestions));
#$this->assertEquals('article dogs', $suggestions[0]->getSuggestedKeys());
#$query = $this->buildSearch(['articel tre'], [], ['body'], FALSE);
#$suggestions = $backend->getAutocompleteSuggestions($query, $autocompleteSearch, 'tre', 'articel tre');
#$this->assertEquals(5, count($suggestions));
#$this->assertEquals('e', $suggestions[0]->getSuggestionSuffix());
#$this->assertEquals(1, $suggestions[0]->getResultsCount());
#$this->assertEquals('es', $suggestions[1]->getSuggestionSuffix());
$query = $this
->buildSearch([
'artic',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getSuggesterSuggestions($query, $autocompleteSearch, 'artic', 'artic');
$this
->assertEquals(2, count($suggestions));
$this
->assertEquals('artic', $suggestions[0]
->getUserInput());
$this
->assertEquals('The test <b>', $suggestions[0]
->getSuggestionPrefix());
$this
->assertEquals('</b>le number 1 about cats, dogs and trees.', $suggestions[0]
->getSuggestionSuffix());
$this
->assertEquals('The test <b>artic</b>le number 1 about cats, dogs and trees.', $suggestions[0]
->getSuggestedKeys());
$this
->assertEquals('artic', $suggestions[1]
->getUserInput());
$this
->assertEquals('The test <b>', $suggestions[1]
->getSuggestionPrefix());
$this
->assertEquals('</b>le number 2 about a tree.', $suggestions[1]
->getSuggestionSuffix());
$this
->assertEquals('The test <b>artic</b>le number 2 about a tree.', $suggestions[1]
->getSuggestedKeys());
// @todo more suggester tests
}
/**
* Tests ngram search result.
*/
public function testNgramResult() {
$this
->addTestEntity(1, [
'name' => 'Test Article 1',
'body' => 'The test article number 1 about cats, dogs and trees.',
'type' => 'article',
'category' => 'dogs and trees',
]);
// Add another node with body length equal to the limit.
$this
->addTestEntity(2, [
'name' => 'Test Article 1',
'body' => 'The test article number 2 about a tree.',
'type' => 'article',
'category' => 'trees',
]);
$this
->indexItems($this->indexId);
$results = $this
->buildSearch([
'tre',
], [], [
'category_ngram',
])
->execute();
$this
->assertResults([
1,
2,
], $results, 'Ngram text "tre".');
$results = $this
->buildSearch([], [], [])
->addCondition('category_ngram_string', 'tre')
->execute();
$this
->assertResults([
2,
], $results, 'Ngram string "tre".');
$results = $this
->buildSearch([
'Dog',
], [], [
'category_ngram',
])
->execute();
$this
->assertResults([
1,
], $results, 'Ngram text "Dog".');
$results = $this
->buildSearch([], [], [])
->addCondition('category_ngram_string', 'Dog')
->execute();
$this
->assertResults([
1,
], $results, 'Ngram string "Dog".');
}
/**
* Test generation of Solr configuration files.
*
* @dataProvider configGenerationDataProvider
*/
public function testConfigGeneration(string $language, array $files) {
$server = $this
->getServer();
$backend_config = $server
->getBackendConfig();
/** @var \Drupal\search_api_solr\Controller\SolrFieldTypeListBuilder $list_builder */
$list_builder = \Drupal::entityTypeManager()
->getListBuilder('solr_field_type');
$list_builder
->setServer($server);
$config_files = $list_builder
->getConfigFiles();
foreach ($files as $file_name => $expected_strings) {
$this
->assertArrayHasKey($file_name, $config_files);
foreach ($expected_strings as $string) {
$this
->assertContains($string, $config_files[$file_name]);
}
}
$this
->assertContains($server
->id(), $config_files['test.txt']);
$this
->assertNotContains('<jmx />', $config_files['solrconfig_extra.xml']);
$backend_config['connector_config']['jmx'] = TRUE;
$server
->setBackendConfig($backend_config);
$server
->save();
$config_files = $list_builder
->getConfigFiles();
$this
->assertContains('<jmx />', $config_files['solrconfig_extra.xml']);
}
/**
* Data provider for testConfigGeneration method.
*
* @return array
*/
public function configGenerationDataProvider() {
return [
'und' => [
'und',
[
'schema_extra_types.xml' => [
# phonetic is currently not available vor Solr 6.x.
#'fieldType name="text_phonetic_und" class="solr.TextField"',
'fieldType name="text_und" class="solr.TextField"',
],
'schema_extra_fields.xml' => [],
'solrconfig_extra.xml' => [
'<str name="name">und</str>',
],
# phonetic is currently not available vor Solr 6.x.
#'stopwords_phonetic_und.txt' => [],
#'protwords_phonetic_und.txt' => [],
'stopwords_und.txt' => [],
'synonyms_und.txt' => [
'drupal, durpal',
],
'protwords_und.txt' => [],
'accents_und.txt' => [
'"\\u00C4" => "A"',
],
'mapping-ISOLatin1Accent.txt' => [
'"\\u00c4" => "A"',
],
'solrcore.properties' => [],
'elevate.xml' => [],
'schema.xml' => [],
'solrconfig.xml' => [],
'test.txt' => [
'hook_search_api_solr_config_files_alter() works',
],
],
],
];
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AssertContentTrait:: |
protected | property | The current raw content. | |
AssertContentTrait:: |
protected | property | The drupalSettings value from the current raw $content. | |
AssertContentTrait:: |
protected | property | The XML structure parsed from the current raw $content. | 1 |
AssertContentTrait:: |
protected | property | The plain-text content of raw $content (text nodes). | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS found escaped on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given name or ID. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given ID and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given name and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists in the current page by the given XPath. | |
AssertContentTrait:: |
protected | function | Asserts that a checkbox field in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists in the current page with a given Xpath result. | |
AssertContentTrait:: |
protected | function | Passes if a link with the specified label is found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href (part) is found. | |
AssertContentTrait:: |
protected | function | Asserts that each HTML ID is used for just a single element. | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS NOT found escaped on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given name or ID. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given ID and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given name and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist or its value does not match, by XPath. | |
AssertContentTrait:: |
protected | function | Asserts that a checkbox field in the current page is not checked. | |
AssertContentTrait:: |
protected | function | Passes if a link with the specified label is not found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href (part) is not found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href is not found in the main region. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page does not exist. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is not checked. | |
AssertContentTrait:: |
protected | function | Triggers a pass if the perl regex pattern is not found in raw content. | |
AssertContentTrait:: |
protected | function | Passes if the raw text is NOT found on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Passes if the page (with HTML stripped) does not contains the text. | |
AssertContentTrait:: |
protected | function | Pass if the page title is not the given string. | |
AssertContentTrait:: |
protected | function | Passes if the text is found MORE THAN ONCE on the text version of the page. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page exists. | |
AssertContentTrait:: |
protected | function | Asserts that a select option with the visible text exists. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page exists. | |
AssertContentTrait:: |
protected | function | Triggers a pass if the Perl regex pattern is found in the raw content. | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS found on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Passes if the page (with HTML stripped) contains the text. | |
AssertContentTrait:: |
protected | function | Helper for assertText and assertNoText. | |
AssertContentTrait:: |
protected | function | Asserts that a Perl regex pattern is found in the plain-text content. | |
AssertContentTrait:: |
protected | function | Asserts themed output. | |
AssertContentTrait:: |
protected | function | Pass if the page title is the given string. | |
AssertContentTrait:: |
protected | function | Passes if the text is found ONLY ONCE on the text version of the page. | |
AssertContentTrait:: |
protected | function | Helper for assertUniqueText and assertNoUniqueText. | |
AssertContentTrait:: |
protected | function | Builds an XPath query. | |
AssertContentTrait:: |
protected | function | Helper: Constructs an XPath for the given set of attributes and value. | |
AssertContentTrait:: |
protected | function | Searches elements using a CSS selector in the raw content. | |
AssertContentTrait:: |
protected | function | Get all option elements, including nested options, in a select. | |
AssertContentTrait:: |
protected | function | Gets the value of drupalSettings for the currently-loaded page. | |
AssertContentTrait:: |
protected | function | Gets the current raw content. | |
AssertContentTrait:: |
protected | function | Get the selected value from a select field. | |
AssertContentTrait:: |
protected | function | Retrieves the plain-text content from the current raw content. | |
AssertContentTrait:: |
protected | function | Get the current URL from the cURL handler. | 1 |
AssertContentTrait:: |
protected | function | Parse content returned from curlExec using DOM and SimpleXML. | |
AssertContentTrait:: |
protected | function | Removes all white-space between HTML tags from the raw content. | |
AssertContentTrait:: |
protected | function | Sets the value of drupalSettings for the currently-loaded page. | |
AssertContentTrait:: |
protected | function | Sets the raw content (e.g. HTML). | |
AssertContentTrait:: |
protected | function | Performs an xpath search on the contents of the internal browser. | |
AssertHelperTrait:: |
protected static | function | Casts MarkupInterface objects into strings. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertTrue() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertEquals() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertSame() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertEquals() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertNotEquals() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertNotSame() instead. | |
AssertLegacyTrait:: |
protected | function | Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertTrue() instead. | |
AssertLegacyTrait:: |
protected | function | ||
BackendTestBase:: |
protected | function | Adds a field to a search index. | |
BackendTestBase:: |
protected | function | Asserts that the given result set complies with expectations. | |
BackendTestBase:: |
protected | function | Builds a search query for testing purposes. | |
BackendTestBase:: |
protected | function | Checks backend specific features. | 1 |
BackendTestBase:: |
protected | function | Tests the index that was installed through default configuration files. | |
BackendTestBase:: |
protected | function | Tests the server that was installed through default configuration files. | |
BackendTestBase:: |
protected | function | Tests whether facets work correctly. | |
BackendTestBase:: |
protected | function | Disables the "HTML Filter" processor for the index. | |
BackendTestBase:: |
protected | function | Enables the "HTML Filter" processor for the index. | |
BackendTestBase:: |
protected | function | Compares two facet filters to determine their order. | |
BackendTestBase:: |
protected | function | Retrieves the search index used by this test. | |
BackendTestBase:: |
protected | function | Retrieves the search server used by this test. | |
BackendTestBase:: |
protected | function | Regression tests for multi word search results sets and wrong facet counts. | |
BackendTestBase:: |
protected | function | Regression tests for facets with counts of 0. | |
BackendTestBase:: |
protected | function | Regression tests for same content multiple times in the search result. | |
BackendTestBase:: |
protected | function | Regression tests for correctly indexing multiple float/decimal fields. | |
BackendTestBase:: |
protected | function | Regression tests for missing results when using OR filters. | |
BackendTestBase:: |
protected | function | Regression tests for (none) facet shown when feature is set to "no". | |
BackendTestBase:: |
protected | function | Regression tests for searching for multiple words using "OR" condition. | |
BackendTestBase:: |
protected | function | Regression tests for non-working operator "contains none of these words". | |
BackendTestBase:: |
protected | function | Regression tests for handling of NULL filters. | |
BackendTestBase:: |
protected | function | Regression tests for problems with taxonomy term parent. | |
BackendTestBase:: |
protected | function | Regression tests for strings longer than 50 chars. | |
BackendTestBase:: |
protected | function | Regression tests for multibyte characters exceeding 50 byte. | |
BackendTestBase:: |
protected | function | Tests (NOT) NULL conditions on fulltext fields. | |
BackendTestBase:: |
protected | function | Regression test for conditions with empty strings as values. | |
BackendTestBase:: |
protected | function | Regression test for facet with "min_count" greater than 1. | |
BackendTestBase:: |
protected | function | Regression test for multiple facets. | |
BackendTestBase:: |
protected | function | Executes regression tests for issues that were already fixed. | |
BackendTestBase:: |
protected | function | Executes regression tests which are unpractical to run in between. | |
BackendTestBase:: |
protected | function | Resets the entity cache for the specified entity. | |
BackendTestBase:: |
protected | function | Tests that a search on the index doesn't have any results. | |
BackendTestBase:: |
public | function | Tests various indexing scenarios for the search backend. | |
ConfigTestTrait:: |
protected | function | Returns a ConfigImporter object to import test configuration. | |
ConfigTestTrait:: |
protected | function | Copies configuration objects from source storage to target storage. | |
ExampleContentTrait:: |
protected | property | The generated test entities, keyed by ID. | |
ExampleContentTrait:: |
protected | property | The Search API item IDs of the generated entities. | |
ExampleContentTrait:: |
protected | function | Creates and saves a test entity with the given values. | |
ExampleContentTrait:: |
protected | function | Returns the item IDs for the given entity IDs. | 1 |
ExampleContentTrait:: |
protected | function | Creates several test entities. | |
ExampleContentTrait:: |
protected | function | Deletes the test entity with the given ID. | |
ExampleContentTrait:: |
protected | function | Sets up the necessary bundles on the test entity type. | |
InvokeMethodTrait:: |
protected | function | Calls protected/private method of a class. | |
KernelTestBase:: |
protected | property | Back up and restore any global variables that may be changed by tests. | |
KernelTestBase:: |
protected | property | Back up and restore static class properties that may be changed by tests. | |
KernelTestBase:: |
protected | property | Contains a few static class properties for performance. | |
KernelTestBase:: |
protected | property | ||
KernelTestBase:: |
protected | property | @todo Move into Config test base class. | 7 |
KernelTestBase:: |
protected static | property | An array of config object names that are excluded from schema checking. | |
KernelTestBase:: |
protected | property | ||
KernelTestBase:: |
protected | property | ||
KernelTestBase:: |
protected | property | Do not forward any global state from the parent process to the processes that run the actual tests. | |
KernelTestBase:: |
protected | property | The app root. | |
KernelTestBase:: |
protected | property | Kernel tests are run in separate processes because they allow autoloading of code from extensions. Running the test in a separate process isolates this behavior from other tests. Subclasses should not override this property. | |
KernelTestBase:: |
protected | property | ||
KernelTestBase:: |
protected | property | Set to TRUE to strict check all configuration saved. | 6 |
KernelTestBase:: |
protected | property | The virtual filesystem root directory. | |
KernelTestBase:: |
protected | function | 1 | |
KernelTestBase:: |
protected | function | Bootstraps a basic test environment. | |
KernelTestBase:: |
private | function | Bootstraps a kernel for a test. | |
KernelTestBase:: |
protected | function | Configuration accessor for tests. Returns non-overridden configuration. | |
KernelTestBase:: |
protected | function | Disables modules for this test. | |
KernelTestBase:: |
protected | function | Enables modules for this test. | |
KernelTestBase:: |
protected | function | Gets the config schema exclusions for this test. | |
KernelTestBase:: |
protected | function | Returns the Database connection info to be used for this test. | 1 |
KernelTestBase:: |
public | function | ||
KernelTestBase:: |
private | function | Returns Extension objects for $modules to enable. | |
KernelTestBase:: |
private static | function | Returns the modules to enable for this test. | |
KernelTestBase:: |
protected | function | Initializes the FileCache component. | |
KernelTestBase:: |
protected | function | Installs default configuration for a given list of modules. | |
KernelTestBase:: |
protected | function | Installs the storage schema for a specific entity type. | |
KernelTestBase:: |
protected | function | Installs database tables from a module schema definition. | |
KernelTestBase:: |
protected | function | Returns whether the current test method is running in a separate process. | |
KernelTestBase:: |
protected | function | ||
KernelTestBase:: |
public | function |
Registers test-specific services. Overrides ServiceProviderInterface:: |
26 |
KernelTestBase:: |
protected | function | Renders a render array. | 1 |
KernelTestBase:: |
protected | function | Sets the install profile and rebuilds the container to update it. | |
KernelTestBase:: |
protected | function | Sets an in-memory Settings variable. | |
KernelTestBase:: |
public static | function | 1 | |
KernelTestBase:: |
protected | function | Sets up the filesystem, so things like the file directory. | 2 |
KernelTestBase:: |
protected | function | Stops test execution. | |
KernelTestBase:: |
public | function | @after | |
KernelTestBase:: |
protected | function | Dumps the current state of the virtual filesystem to STDOUT. | |
KernelTestBase:: |
public | function | BC: Automatically resolve former KernelTestBase class properties. | |
KernelTestBase:: |
public | function | Prevents serializing any properties. | |
PhpunitCompatibilityTrait:: |
public | function | Returns a mock object for the specified class using the available method. | |
PhpunitCompatibilityTrait:: |
public | function | Compatibility layer for PHPUnit 6 to support PHPUnit 4 code. | |
RandomGeneratorTrait:: |
protected | property | The random generator. | |
RandomGeneratorTrait:: |
protected | function | Gets the random generator for the utility methods. | |
RandomGeneratorTrait:: |
protected | function | Generates a unique random string containing letters and numbers. | 1 |
RandomGeneratorTrait:: |
public | function | Generates a random PHP object. | |
RandomGeneratorTrait:: |
public | function | Generates a pseudo-random string of ASCII characters of codes 32 to 126. | |
RandomGeneratorTrait:: |
public | function | Callback for random string validation. | |
SearchApiSolrTest:: |
protected | property | ||
SearchApiSolrTest:: |
public static | property |
Modules to enable for this test. Overrides SolrBackendTestBase:: |
1 |
SearchApiSolrTest:: |
protected | function | ||
SearchApiSolrTest:: |
protected | function |
Runs backend specific regression tests. Overrides BackendTestBase:: |
|
SearchApiSolrTest:: |
protected | function |
Tests whether removing the configuration again works as it should. Overrides SolrBackendTestBase:: |
|
SearchApiSolrTest:: |
protected | function |
Required parts of the setUp() function that are the same for all backends. Overrides SolrBackendTestBase:: |
|
SearchApiSolrTest:: |
public | function | Data provider for testConfigGeneration method. | 1 |
SearchApiSolrTest:: |
protected | function | Return the expected facets for regression test 2469547. | |
SearchApiSolrTest:: |
protected | function | Gets the Drupal Fields and their Solr mapping. | |
SearchApiSolrTest:: |
protected | function | Produces a string of given comprising diverse chars. | |
SearchApiSolrTest:: |
protected | function | ||
SearchApiSolrTest:: |
protected | function |
Called by setUp() to install required configs. Overrides SolrBackendTestBase:: |
1 |
SearchApiSolrTest:: |
protected | function |
Regression tests for #2469547. Overrides BackendTestBase:: |
|
SearchApiSolrTest:: |
public | function | Regression tests for #2850160. | |
SearchApiSolrTest:: |
protected | function | Regression tests for #2888629. | |
SearchApiSolrTest:: |
public | function |
Tests whether some test searches have the correct results. Overrides BackendTestBase:: |
|
SearchApiSolrTest:: |
public | function | Tests the autocomplete support. | 1 |
SearchApiSolrTest:: |
public | function | Test that basic auth config gets passed to Solarium. | |
SearchApiSolrTest:: |
public | function | Test generation of Solr configuration files. | |
SearchApiSolrTest:: |
public | function | Tests addition and deletion of a data source. | |
SearchApiSolrTest:: |
public | function | Tests highlight options. | |
SearchApiSolrTest:: |
public | function | Tests ngram search result. | |
SearchApiSolrTest:: |
public | function | Tests the conversion of Search API queries into Solr queries. | |
SearchApiSolrTest:: |
public | function | Tests the conversion of language aware queries into Solr queries. | 1 |
SearchApiSolrTest:: |
public | function | Tests the conversion of Search API queries into Solr queries. | |
SearchApiSolrTest:: |
public | function | Tests retrieve_data options. | |
SearchApiSolrTest:: |
public | function | Tests search result sorts. | |
SolrBackendTestBase:: |
protected | property |
A Search API index ID. Overrides BackendTestBase:: |
3 |
SolrBackendTestBase:: |
protected | property | ||
SolrBackendTestBase:: |
protected | property |
A Search API server ID. Overrides BackendTestBase:: |
3 |
SolrBackendTestBase:: |
protected | function | ||
SolrBackendTestBase:: |
protected | function |
Checks the correct handling of an index without fields. Overrides BackendTestBase:: |
|
SolrBackendTestBase:: |
protected | function |
Tests that a second server doesn't interfere with the first. Overrides BackendTestBase:: |
|
SolrBackendTestBase:: |
protected | function |
Tests the correct setup of the server backend. Overrides BackendTestBase:: |
|
SolrBackendTestBase:: |
protected | function |
Clears the test index. Overrides BackendTestBase:: |
|
SolrBackendTestBase:: |
protected | function | Executes a query and skips search_api post processing of results. | |
SolrBackendTestBase:: |
protected | function | ||
SolrBackendTestBase:: |
protected | function |
Indexes all (unindexed) items on the specified index. Overrides ExampleContentTrait:: |
|
SolrBackendTestBase:: |
public | function |
Overrides BackendTestBase:: |
2 |
SolrBackendTestBase:: |
public | function |
Clear the index after every test. Overrides KernelTestBase:: |
|
SolrBackendTestBase:: |
protected | function |
Checks whether changes to the index's fields are picked up by the server. Overrides BackendTestBase:: |
|
SolrCommitTrait:: |
protected | function | Explicitly sent a commit command to a Solr server. | |
StorageCopyTrait:: |
protected static | function | Copy the configuration from one storage to another and remove stale items. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TestRequirementsTrait:: |
private | function | Checks missing module requirements. | |
TestRequirementsTrait:: |
protected | function | Check module requirements for the Drupal use case. | 1 |
TestRequirementsTrait:: |
protected static | function | Returns the Drupal root directory. |