/web/core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php
https://gitlab.com/mohamed_hussein/prodt · PHP · 124 lines · 70 code · 19 blank · 35 comment · 0 complexity · 01bfd9436a46685747c9019424321e13 MD5 · raw file
- <?php
- namespace Drupal\Tests\field\Functional\EntityReference\Views;
- use Drupal\Component\Serialization\Json;
- use Drupal\Component\Utility\Crypt;
- use Drupal\Component\Utility\Html;
- use Drupal\Core\Site\Settings;
- use Drupal\Tests\BrowserTestBase;
- use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
- use Drupal\views\Views;
- /**
- * Tests entity reference selection handler.
- *
- * @group entity_reference
- */
- class SelectionTest extends BrowserTestBase {
- use EntityReferenceTestTrait;
- /**
- * {@inheritdoc}
- */
- protected static $modules = [
- 'node',
- 'views',
- 'entity_reference_test',
- 'entity_test',
- ];
- /**
- * {@inheritdoc}
- */
- protected $defaultTheme = 'stark';
- /**
- * An array of node titles, keyed by content type and node ID.
- *
- * @var \Drupal\node\NodeInterface[]
- */
- protected $nodes = [];
- /**
- * The handler settings for the entity reference field.
- *
- * @var array
- */
- protected $handlerSettings;
- /**
- * {@inheritdoc}
- */
- protected function setUp(): void {
- parent::setUp();
- // Create content types and nodes.
- $type1 = $this->drupalCreateContentType()->id();
- $type2 = $this->drupalCreateContentType()->id();
- // Add some characters that should be escaped but not double escaped.
- $node1 = $this->drupalCreateNode(['type' => $type1, 'title' => 'Test first node &<>']);
- $node2 = $this->drupalCreateNode(['type' => $type1, 'title' => 'Test second node &&&']);
- $node3 = $this->drupalCreateNode(['type' => $type2, 'title' => 'Test third node <span />']);
- foreach ([$node1, $node2, $node3] as $node) {
- $this->nodes[$node->id()] = $node;
- }
- // Create an entity reference field.
- $handler_settings = [
- 'view' => [
- 'view_name' => 'test_entity_reference',
- 'display_name' => 'entity_reference_1',
- ],
- ];
- $this->handlerSettings = $handler_settings;
- $this->createEntityReferenceField('entity_test', 'test_bundle', 'test_field', $this->randomString(), 'node', 'views', $handler_settings);
- }
- /**
- * Tests that the Views selection handles the views output properly.
- */
- public function testAutocompleteOutput() {
- // Reset any internal static caching.
- \Drupal::service('entity_type.manager')->getStorage('node')->resetCache();
- $view = Views::getView('test_entity_reference');
- $view->setDisplay();
- // Enable the display of the 'type' field so we can test that the output
- // does not contain only the entity label.
- $fields = $view->displayHandlers->get('entity_reference_1')->getOption('fields');
- $fields['type']['exclude'] = FALSE;
- $view->displayHandlers->get('entity_reference_1')->setOption('fields', $fields);
- $view->save();
- // Prepare the selection settings key needed by the entity reference
- // autocomplete route.
- $target_type = 'node';
- $selection_handler = 'views';
- $selection_settings = $this->handlerSettings;
- $selection_settings_key = Crypt::hmacBase64(serialize($selection_settings) . $target_type . $selection_handler, Settings::getHashSalt());
- \Drupal::keyValue('entity_autocomplete')->set($selection_settings_key, $selection_settings);
- $result = Json::decode($this->drupalGet('entity_reference_autocomplete/' . $target_type . '/' . $selection_handler . '/' . $selection_settings_key, ['query' => ['q' => 't']]));
- $expected = [
- 0 => [
- 'value' => $this->nodes[1]->bundle() . ': ' . $this->nodes[1]->label() . ' (' . $this->nodes[1]->id() . ')',
- 'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[1]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[1]->label()) . '</span></span>',
- ],
- 1 => [
- 'value' => $this->nodes[2]->bundle() . ': ' . $this->nodes[2]->label() . ' (' . $this->nodes[2]->id() . ')',
- 'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[2]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[2]->label()) . '</span></span>',
- ],
- 2 => [
- 'value' => $this->nodes[3]->bundle() . ': ' . $this->nodes[3]->label() . ' (' . $this->nodes[3]->id() . ')',
- 'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[3]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content">' . Html::escape($this->nodes[3]->label()) . '</span></span>',
- ],
- ];
- $this->assertEquals($expected, $result, 'The autocomplete result of the Views entity reference selection handler contains the proper output.');
- }
- }