SelectionTest.php
Same filename in this branch
Same filename in other branches
- 9 core/modules/field/tests/src/Kernel/EntityReference/Views/SelectionTest.php
- 9 core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php
- 8.9.x core/modules/field/tests/src/Kernel/EntityReference/Views/SelectionTest.php
- 8.9.x core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php
- 10 core/modules/field/tests/src/Kernel/EntityReference/Views/SelectionTest.php
- 10 core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php
Namespace
Drupal\Tests\field\Kernel\EntityReference\ViewsFile
-
core/
modules/ field/ tests/ src/ Kernel/ EntityReference/ Views/ SelectionTest.php
View source
<?php
declare (strict_types=1);
namespace Drupal\Tests\field\Kernel\EntityReference\Views;
use Drupal\Component\Render\MarkupInterface;
use Drupal\Component\Utility\Html;
use Drupal\field\Entity\FieldConfig;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\field\Traits\EntityReferenceFieldCreationTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;
use Drupal\views\Views;
/**
* Tests entity reference selection handler.
*
* @group entity_reference
*/
class SelectionTest extends KernelTestBase {
use EntityReferenceFieldCreationTrait;
use NodeCreationTrait;
/**
* {@inheritdoc}
*/
protected static $modules = [
'entity_reference_test',
'entity_test',
'field',
'filter',
'node',
'system',
'user',
'views',
];
/**
* Nodes for testing.
*
* @var string[][]
*/
protected $nodes = [];
/**
* The selection handler.
*
* @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface
*/
protected $selectionHandler;
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this->installConfig([
'entity_reference_test',
'filter',
]);
$this->installEntitySchema('user');
$this->installEntitySchema('node');
// Create test nodes.
$type = $this->randomMachineName();
NodeType::create([
'type' => $type,
'name' => $this->randomString(),
])
->save();
$node1 = $this->createNode([
'type' => $type,
]);
$node2 = $this->createNode([
'type' => $type,
]);
$node3 = $this->createNode();
foreach ([
$node1,
$node2,
$node3,
] as $node) {
$this->nodes[$node->id()] = $node;
}
// Ensure the bundle to which the field is attached actually exists, or we
// will get config validation errors.
entity_test_create_bundle('test_bundle');
// Create an entity reference field.
$handler_settings = [
'view' => [
'view_name' => 'test_entity_reference',
'display_name' => 'entity_reference_1',
],
];
$this->createEntityReferenceField('entity_test', 'test_bundle', 'test_field', $this->randomString(), 'node', 'views', $handler_settings);
$field_config = FieldConfig::loadByName('entity_test', 'test_bundle', 'test_field');
$this->selectionHandler = $this->container
->get('plugin.manager.entity_reference_selection')
->getSelectionHandler($field_config);
}
/**
* Tests the selection handler.
*/
public function testSelectionHandler() : void {
// Tests the selection handler.
$this->assertResults($this->selectionHandler
->getReferenceableEntities());
// Add a relationship to the view.
$view = Views::getView('test_entity_reference');
$view->setDisplay();
$view->displayHandlers
->get('default')
->setOption('relationships', [
'test_relationship' => [
'id' => 'uid',
'table' => 'node_field_data',
'field' => 'uid',
],
]);
// Add a filter depending on the relationship to the test view.
$view->displayHandlers
->get('default')
->setOption('filters', [
'uid' => [
'id' => 'uid',
'table' => 'users_field_data',
'field' => 'uid',
'relationship' => 'test_relationship',
],
]);
// Set view to distinct so only one row per node is returned.
$query_options = $view->display_handler
->getOption('query');
$query_options['options']['distinct'] = TRUE;
$view->display_handler
->setOption('query', $query_options);
$view->save();
// Tests the selection handler with a relationship.
$this->assertResults($this->selectionHandler
->getReferenceableEntities());
}
/**
* Tests the anchor tag stripping.
*
* Unstripped results based on the data above will result in output like so:
* ...<a href="/node/1" hreflang="en">Test first node</a>...
* ...<a href="/node/2" hreflang="en">Test second node</a>...
* ...<a href="/node/3" hreflang="en">Test third node</a>...
* If we expect our output to not have the <a> tags, and this matches what's
* produced by the tag-stripping method, we'll know that it's working.
*/
public function testAnchorTagStripping() : void {
$filtered_rendered_results_formatted = [];
foreach ($this->selectionHandler
->getReferenceableEntities() as $subresults) {
$filtered_rendered_results_formatted += array_map(fn(MarkupInterface $markup): string => (string) $markup, $subresults);
}
// Note the missing <a> tags.
$expected = [
1 => '<span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[1]
->label()) . '</span></span>',
2 => '<span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[2]
->label()) . '</span></span>',
3 => '<span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[3]
->label()) . '</span></span>',
];
$this->assertSame($expected, $filtered_rendered_results_formatted, 'Anchor tag stripping has failed.');
}
/**
* Confirm the expected results are returned.
*
* @param array $result
* Query results keyed by node type and nid.
*
* @internal
*/
protected function assertResults(array $result) : void {
foreach ($result as $node_type => $values) {
foreach ($values as $nid => $label) {
$this->assertSame($node_type, $this->nodes[$nid]
->bundle());
$this->assertSame(trim(strip_tags((string) $label)), Html::escape($this->nodes[$nid]
->label()));
}
}
}
}
Classes
Title | Deprecated | Summary |
---|---|---|
SelectionTest | Tests entity reference selection handler. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.