search_api-8.x-1.15/tests/src/Kernel/Processor/ReverseEntityReferencesTest.php
tests/src/Kernel/Processor/ReverseEntityReferencesTest.php
<?php namespace Drupal\Tests\search_api\Kernel\Processor; use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface; use Drupal\node\Entity\Node; use Drupal\node\Entity\NodeType; use Drupal\search_api\Datasource\DatasourceInterface; use Drupal\search_api\Item\Field; use Drupal\search_api\Processor\ProcessorPropertyInterface; use Drupal\user\Entity\User; /** * Tests the "Reverse entity references" processor. * * @group search_api * * @coversDefaultClass \Drupal\search_api\Plugin\search_api\processor\ReverseEntityReferences */ class ReverseEntityReferencesTest extends ProcessorTestBase { /** * The nodes created for testing. * * @var \Drupal\node\Entity\Node[] */ protected $nodes; /** * The author UIDs of the created nodes, keyed by index in $this->nodes. * * @var array */ protected $nodeUids = [ 1, 0, 1, 2, 0, 1, ]; /** * {@inheritdoc} */ public function setUp($processor = NULL) { parent::setUp('reverse_entity_references'); // Create a node type for testing. $type = NodeType::create(['type' => 'page', 'name' => 'page']); $type->save(); // Insert the anonymous user into the database, as well as some other users. User::create([ 'uid' => 0, 'name' => '', ])->save(); User::create([ 'uid' => 1, 'name' => 'admin', ])->save(); User::create([ 'uid' => 2, 'name' => 'user', ])->save(); User::create([ 'uid' => 3, 'name' => 'other user', ])->save(); // Create nodes. foreach ($this->nodeUids as $i => $uid) { $values = [ 'type' => 'page', 'title' => 'test title', 'uid' => $uid, ]; $this->nodes[$i] = Node::create($values); $this->nodes[$i]->save(); } // Switch the index to index users and add a reverse reference to the nodes // authored by the indexed user. $datasources = \Drupal::getContainer() ->get('search_api.plugin_helper') ->createDatasourcePlugins($this->index, [ 'entity:user', ]); $this->index->setDatasources($datasources); $field = new Field($this->index, 'nid'); $field->setType('integer'); $field->setPropertyPath('search_api_reverse_entity_references_node__uid:nid'); $field->setDatasourceId('entity:user'); $field->setLabel('Authored nodes'); $this->index->addField($field); $this->index->save(); \Drupal::getContainer() ->get('search_api.index_task_manager') ->addItemsAll($this->index); $index_storage = \Drupal::entityTypeManager() ->getStorage('search_api_index'); $index_storage->resetCache([$this->index->id()]); $this->index = $index_storage->load($this->index->id()); } /** * Tests that property definitions are created correctly. * * @covers ::getPropertyDefinitions */ public function testGetPropertyDefinitions() { $properties = $this->processor->getPropertyDefinitions(NULL); $this->assertEmpty($properties); $datasource = $this->createMock(DatasourceInterface::class); $datasource->method('getEntityTypeId') ->willReturn(NULL); $properties = $this->processor->getPropertyDefinitions($datasource); $this->assertEmpty($properties); $datasource = $this->index->getDatasource('entity:user'); $properties = $this->processor->getPropertyDefinitions($datasource); $this->assertArrayHasKey('search_api_reverse_entity_references_node__uid', $properties); /** @var \Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface|\Drupal\search_api\Processor\ProcessorPropertyInterface $property */ $property = $properties['search_api_reverse_entity_references_node__uid']; $this->assertInstanceOf(EntityDataDefinitionInterface::class, $property); $this->assertInstanceOf(ProcessorPropertyInterface::class, $property); $this->assertEquals('node', $property->getEntityTypeId()); $this->assertEquals('reverse_entity_references', $property->getProcessorId()); $this->assertTrue($property->isList()); } /** * Tests that field value extraction works correctly. * * @covers ::addFieldValues */ public function testAddFieldValues() { $nids_by_user = []; foreach ($this->nodeUids as $i => $uid) { $nids_by_user[$uid][] = $this->nodes[$i]->id(); } $fields_helper = \Drupal::getContainer()->get('search_api.fields_helper'); foreach ([0, 1, 2, 3] as $uid) { $item = $fields_helper->createItem($this->index, "entity:user/$uid:en"); // This will automatically trigger field extraction. $nids = $item->getField('nid')->getValues(); sort($nids); $nids_by_user += [$uid => []]; $this->assertEquals($nids_by_user[$uid], $nids, "Unexpected field values extracted for user #$uid."); } } }