EntityReferenceAutocompleteWidgetTest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace Drupal\FunctionalJavascriptTests\EntityReference;
  3. use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
  4. use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
  5. use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
  6. use Drupal\Tests\node\Traits\NodeCreationTrait;
  7. /**
  8. * Tests the output of entity reference autocomplete widgets.
  9. *
  10. * @group entity_reference
  11. */
  12. class EntityReferenceAutocompleteWidgetTest extends WebDriverTestBase {
  13. use ContentTypeCreationTrait;
  14. use EntityReferenceTestTrait;
  15. use NodeCreationTrait;
  16. /**
  17. * {@inheritdoc}
  18. */
  19. public static $modules = ['node', 'field_ui'];
  20. /**
  21. * {@inheritdoc}
  22. */
  23. protected $defaultTheme = 'stark';
  24. /**
  25. * {@inheritdoc}
  26. */
  27. protected function setUp() {
  28. parent::setUp();
  29. // Create a Content type and two test nodes.
  30. $this->createContentType(['type' => 'page']);
  31. $this->createNode(['title' => 'Test page']);
  32. $this->createNode(['title' => 'Page test']);
  33. $user = $this->drupalCreateUser([
  34. 'access content',
  35. 'create page content',
  36. ]);
  37. $this->drupalLogin($user);
  38. }
  39. /**
  40. * Tests that the default autocomplete widget return the correct results.
  41. */
  42. public function testEntityReferenceAutocompleteWidget() {
  43. /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
  44. $display_repository = \Drupal::service('entity_display.repository');
  45. // Create an entity reference field and use the default 'CONTAINS' match
  46. // operator.
  47. $field_name = 'field_test';
  48. $this->createEntityReferenceField('node', 'page', $field_name, $field_name, 'node', 'default', ['target_bundles' => ['page'], 'sort' => ['field' => 'title', 'direction' => 'DESC']]);
  49. $form_display = $display_repository->getFormDisplay('node', 'page');
  50. $form_display->setComponent($field_name, [
  51. 'type' => 'entity_reference_autocomplete',
  52. 'settings' => [
  53. 'match_operator' => 'CONTAINS',
  54. ],
  55. ]);
  56. // To satisfy config schema, the size setting must be an integer, not just
  57. // a numeric value. See https://www.drupal.org/node/2885441.
  58. $this->assertIsInt($form_display->getComponent($field_name)['settings']['size']);
  59. $form_display->save();
  60. $this->assertIsInt($form_display->getComponent($field_name)['settings']['size']);
  61. // Visit the node add page.
  62. $this->drupalGet('node/add/page');
  63. $page = $this->getSession()->getPage();
  64. $assert_session = $this->assertSession();
  65. $autocomplete_field = $assert_session->waitForElement('css', '[name="' . $field_name . '[0][target_id]"].ui-autocomplete-input');
  66. $autocomplete_field->setValue('Test');
  67. $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), ' ');
  68. $assert_session->waitOnAutocomplete();
  69. $results = $page->findAll('css', '.ui-autocomplete li');
  70. $this->assertCount(2, $results);
  71. $assert_session->pageTextContains('Test page');
  72. $assert_session->pageTextContains('Page test');
  73. // Now switch the autocomplete widget to the 'STARTS_WITH' match operator.
  74. $display_repository->getFormDisplay('node', 'page')
  75. ->setComponent($field_name, [
  76. 'type' => 'entity_reference_autocomplete',
  77. 'settings' => [
  78. 'match_operator' => 'STARTS_WITH',
  79. ],
  80. ])
  81. ->save();
  82. $this->drupalGet('node/add/page');
  83. $this->doAutocomplete($field_name);
  84. $results = $page->findAll('css', '.ui-autocomplete li');
  85. $this->assertCount(1, $results);
  86. $assert_session->pageTextContains('Test page');
  87. $assert_session->pageTextNotContains('Page test');
  88. // Change the size of the result set.
  89. $display_repository->getFormDisplay('node', 'page')
  90. ->setComponent($field_name, [
  91. 'type' => 'entity_reference_autocomplete',
  92. 'settings' => [
  93. 'match_limit' => 1,
  94. ],
  95. ])
  96. ->save();
  97. $this->drupalGet('node/add/page');
  98. $this->doAutocomplete($field_name);
  99. $results = $page->findAll('css', '.ui-autocomplete li');
  100. $this->assertCount(1, $results);
  101. $assert_session->pageTextContains('Test page');
  102. $assert_session->pageTextNotContains('Page test');
  103. // Change the size of the result set via the UI.
  104. $this->drupalLogin($this->createUser([
  105. 'access content',
  106. 'administer content types',
  107. 'administer node fields',
  108. 'administer node form display',
  109. 'create page content',
  110. ]
  111. ));
  112. $this->drupalGet('/admin/structure/types/manage/page/form-display');
  113. $assert_session->pageTextContains('Autocomplete suggestion list size: 1');
  114. // Click on the widget settings button to open the widget settings form.
  115. $this->drupalPostForm(NULL, [], $field_name . "_settings_edit");
  116. $this->assertSession()->waitForElement('css', sprintf('[name="fields[%s][settings_edit_form][settings][match_limit]"]', $field_name));
  117. $page->fillField('Number of results', 2);
  118. $page->pressButton('Save');
  119. $assert_session->pageTextContains('Your settings have been saved.');
  120. $assert_session->pageTextContains('Autocomplete suggestion list size: 2');
  121. $this->drupalGet('node/add/page');
  122. $this->doAutocomplete($field_name);
  123. $this->assertCount(2, $page->findAll('css', '.ui-autocomplete li'));
  124. }
  125. /**
  126. * Executes an autocomplete on a given field and waits for it to finish.
  127. *
  128. * @param string $field_name
  129. * The field name.
  130. */
  131. protected function doAutocomplete($field_name) {
  132. $autocomplete_field = $this->getSession()->getPage()->findField($field_name . '[0][target_id]');
  133. $autocomplete_field->setValue('Test');
  134. $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), ' ');
  135. $this->assertSession()->waitOnAutocomplete();
  136. }
  137. }