search_api-8.x-1.15/tests/src/Kernel/System/FieldValuesExtractionTest.php
tests/src/Kernel/System/FieldValuesExtractionTest.php
<?php
namespace Drupal\Tests\search_api\Kernel\System;
use Drupal\KernelTests\KernelTestBase;
use Drupal\search_api\Entity\Index;
use Drupal\search_api\Utility\Utility;
use Drupal\user\Entity\User;
/**
* Tests extraction of field values, as used during indexing.
*
* @coversDefaultClass \Drupal\search_api\Utility\FieldsHelper
*
* @group search_api
*/
class FieldValuesExtractionTest extends KernelTestBase {
/**
* The search index used for testing.
*
* @var \Drupal\search_api\IndexInterface
*/
protected $index;
/**
* The test entities used in this test.
*
* @var \Drupal\Core\Entity\EntityInterface[]
*/
protected $entities = [];
/**
* The fields helper service.
*
* @var \Drupal\search_api\Utility\FieldsHelperInterface
*/
protected $fieldsHelper;
/**
* Modules to enable for this test.
*
* @var string[]
*/
public static $modules = [
'entity_test',
'field',
'search_api',
'search_api_test_extraction',
'system',
'user',
];
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$this->installSchema('system', ['sequences']);
$this->installEntitySchema('entity_test_mulrev_changed');
$this->installEntitySchema('user');
$this->installConfig(['search_api_test_extraction', 'user']);
$entity_storage = \Drupal::entityTypeManager()
->getStorage('entity_test_mulrev_changed');
$this->entities[0] = $entity_storage->create([
'type' => 'article',
'name' => 'Article 1',
'links' => [],
]);
$this->entities[0]->save();
$this->entities[1] = $entity_storage->create([
'type' => 'article',
'name' => 'Article 2',
'links' => [],
]);
$this->entities[1]->save();
$this->entities[2] = $entity_storage->create([
'type' => 'article',
'name' => 'Article 3',
'links' => [
['target_id' => $this->entities[0]->id()],
['target_id' => $this->entities[1]->id()],
],
]);
$this->entities[2]->save();
$this->entities[3] = $entity_storage->create([
'type' => 'article',
'name' => 'Article 4',
'links' => [
['target_id' => $this->entities[0]->id()],
['target_id' => $this->entities[2]->id()],
],
]);
$this->entities[2]->save();
user_role_grant_permissions('anonymous', ['view test entity']);
User::create([
'id' => $this->entities[0],
'name' => 'Test user',
])->save();
$this->index = Index::create([
'field_settings' => [
'foo' => [
'type' => 'text',
'datasource_id' => 'entity:entity_test_mulrev_changed',
'property_path' => 'name',
],
'bar' => [
'type' => 'text',
'property_path' => 'rendered_item',
'configuration' => [
'roles' => [
'anonymous' => 'anonymous',
],
'view_mode' => [
'entity:entity_test_mulrev_changed' => [
'article' => 'default',
],
],
],
],
],
'datasource_settings' => [
'entity:entity_test_mulrev_changed' => [],
],
]);
$this->fieldsHelper = $this->container->get('search_api.fields_helper');
}
/**
* Tests extraction of field values, as used during indexing.
*
* @covers ::extractFields
* @covers ::extractField
* @covers ::extractFieldValues
*/
public function testFieldValuesExtraction() {
$object = $this->entities[3]->getTypedData();
/** @var \Drupal\search_api\Item\FieldInterface[][] $fields */
$fields = [
'type' => [$this->fieldsHelper->createField($this->index, 'type')],
'name' => [$this->fieldsHelper->createField($this->index, 'name')],
'links:entity:name' => [
$this->fieldsHelper->createField($this->index, 'links'),
$this->fieldsHelper->createField($this->index, 'links_1'),
],
'links:entity:links:entity:name' => [
$this->fieldsHelper->createField($this->index, 'links_links'),
],
];
$this->fieldsHelper->extractFields($object, $fields);
$values = [];
foreach ($fields as $property_path => $property_fields) {
foreach ($property_fields as $field) {
$field_values = $field->getValues();
sort($field_values);
if (!isset($values[$property_path])) {
$values[$property_path] = $field_values;
}
else {
$this->assertEquals($field_values, $values[$property_path], 'Second extraction provided the same results as the first.');
}
}
}
$expected = [
'type' => ['article'],
'name' => ['Article 4'],
'links:entity:name' => [
'Article 1',
'Article 3',
],
'links:entity:links:entity:name' => [
'Article 1',
'Article 2',
],
];
$this->assertEquals($expected, $values, 'Field values were correctly extracted');
}
/**
* Tests extraction of properties, as used in processors or for result lists.
*
* @covers ::extractItemValues
*/
public function testPropertyValuesExtraction() {
$items['foobar'] = $this->fieldsHelper->createItemFromObject(
$this->index,
$this->entities[0]->getTypedData(),
Utility::createCombinedId('entity:entity_test_mulrev_changed', '0:en')
);
$properties = [
NULL => [
'rendered_item' => 'a',
// Since there is no field defined on "aggregated_field" for the index,
// we won't be able to extract it.
'aggregated_field' => 'b',
'search_api_url' => 'c',
],
'entity:entity_test_mulrev_changed' => [
'name' => 'd',
'type' => 'e',
'soul_mate:name' => 'f',
],
'unknown_datasource' => [
'name' => 'x',
],
];
$expected = [
'foobar' => [
'a' => [],
'b' => [],
'c' => [],
'd' => [],
'e' => [],
'f' => [],
],
];
$values = $this->fieldsHelper->extractItemValues($items, $properties, FALSE);
ksort($values['foobar']);
$this->assertEquals($expected, $values);
$expected = [
'foobar' => [
// 'a' => 'Tested separately.',
'b' => [],
'c' => ['/entity_test_mulrev_changed/manage/1'],
'd' => ['Article 1'],
'e' => ['article'],
'f' => ['Test user'],
],
];
$values = $this->fieldsHelper->extractItemValues($items, $properties);
ksort($values['foobar']);
$this->assertArrayHasKey('a', $values['foobar']);
$this->assertNotEmpty($values['foobar']['a']);
$this->assertContains('Article 1', $values['foobar']['a'][0]);
unset($values['foobar']['a']);
$this->assertEquals($expected, $values);
$items['foobar']->setFields([
'aa' => $this->fieldsHelper->createField($this->index, 'aa_foo', [
'property_path' => 'aggregated_field',
'values' => [1, 2],
]),
'bb' => $this->fieldsHelper->createField($this->index, 'bb_foo', [
'property_path' => 'rendered_item',
'values' => [3],
]),
'cc' => $this->fieldsHelper->createField($this->index, 'cc_foo', [
'datasource_id' => 'entity:entity_test_mulrev_changed',
'property_path' => 'type',
'values' => [4],
]),
'dd' => $this->fieldsHelper->createField($this->index, 'dd_foo', [
'datasource_id' => 'entity:entity_test_mulrev_changed',
'property_path' => 'soul_mate:name',
'values' => [5],
]),
]);
$expected = [
'foobar' => [
'a' => [3],
'b' => [1, 2],
'c' => [],
'd' => [],
'e' => [4],
'f' => [5],
],
];
$values = $this->fieldsHelper->extractItemValues($items, $properties, FALSE);
ksort($values['foobar']);
$this->assertEquals($expected, $values);
$expected = [
'foobar' => [
'a' => [3],
'b' => [1, 2],
'c' => ['/entity_test_mulrev_changed/manage/1'],
'd' => ['Article 1'],
'e' => [4],
'f' => [5],
],
];
$values = $this->fieldsHelper->extractItemValues($items, $properties);
ksort($values['foobar']);
$this->assertEquals($expected, $values);
}
}
