Updated all the contrib modules to their latest versions.
[yaffs-website] / web / modules / contrib / entity_browser / tests / src / FunctionalJavascript / EntityReferenceWidgetTest.php
1 <?php
2
3 namespace Drupal\Tests\entity_browser\FunctionalJavascript;
4
5 use Drupal\Core\Field\FieldStorageDefinitionInterface;
6 use Drupal\entity_browser\Element\EntityBrowserElement;
7 use Drupal\field\Entity\FieldConfig;
8 use Drupal\field\Entity\FieldStorageConfig;
9 use Drupal\node\Entity\Node;
10 use Drupal\user\Entity\Role;
11
12 /**
13  * Tests the Entity Reference Widget.
14  *
15  * @group entity_browser
16  */
17 class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
18
19   /**
20    * {@inheritdoc}
21    */
22   public function setUp() {
23     parent::setUp();
24
25     /** @var \Drupal\user\RoleInterface $role */
26     $role = Role::load('authenticated');
27     $this->grantPermissions($role, [
28       'access test_entity_browser_iframe_node_view entity browser pages',
29       'bypass node access',
30       'administer node form display',
31     ]);
32
33   }
34
35   /**
36    * Tests Entity Reference widget.
37    */
38   public function testEntityReferenceWidget() {
39     $session = $this->getSession();
40     $page = $session->getPage();
41     $assert_session = $this->assertSession();
42
43     // Create an entity_reference field to test the widget.
44     $field_storage = FieldStorageConfig::create([
45       'field_name' => 'field_entity_reference1',
46       'type' => 'entity_reference',
47       'entity_type' => 'node',
48       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
49       'settings' => [
50         'target_type' => 'node',
51       ],
52     ]);
53     $field_storage->save();
54
55     $field = FieldConfig::create([
56       'field_name' => 'field_entity_reference1',
57       'entity_type' => 'node',
58       'bundle' => 'article',
59       'label' => 'Referenced articles',
60       'settings' => [],
61     ]);
62     $field->save();
63
64     /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */
65     $form_display = $this->container->get('entity_type.manager')
66       ->getStorage('entity_form_display')
67       ->load('node.article.default');
68
69     $form_display->setComponent('field_entity_reference1', [
70       'type' => 'entity_browser_entity_reference',
71       'settings' => [
72         'entity_browser' => 'test_entity_browser_iframe_node_view',
73         'open' => TRUE,
74         'field_widget_edit' => TRUE,
75         'field_widget_remove' => TRUE,
76         'field_widget_replace' => FALSE,
77         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
78         'field_widget_display' => 'label',
79         'field_widget_display_settings' => [],
80       ],
81     ])->save();
82
83     // Create a dummy node that will be used as target.
84     $target_node = Node::create([
85       'title' => 'Target example node 1',
86       'type' => 'article',
87     ]);
88     $target_node->save();
89
90     $this->drupalGet('/node/add/article');
91     $page->fillField('title[0][value]', 'Referencing node 1');
92     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
93     $this->waitForAjaxToFinish();
94     $page->checkField('edit-entity-browser-select-node1');
95     $page->pressButton('Select entities');
96     $session->switchToIFrame();
97     $this->waitForAjaxToFinish();
98     $page->pressButton('Save');
99
100     $assert_session->pageTextContains('Article Referencing node 1 has been created.');
101     $nid = $this->container->get('entity.query')->get('node')->condition('title', 'Referencing node 1')->execute();
102     $nid = reset($nid);
103
104     $this->drupalGet('node/' . $nid . '/edit');
105     $assert_session->pageTextContains('Target example node 1');
106     // Make sure both "Edit" and "Remove" buttons are visible.
107     $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-remove-button');
108     $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-edit-button');
109
110     // Test whether changing these definitions on the browser config effectively
111     // change the visibility of the buttons.
112     $form_display->setComponent('field_entity_reference1', [
113       'type' => 'entity_browser_entity_reference',
114       'settings' => [
115         'entity_browser' => 'test_entity_browser_iframe_node_view',
116         'open' => TRUE,
117         'field_widget_edit' => FALSE,
118         'field_widget_remove' => FALSE,
119         'field_widget_replace' => FALSE,
120         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
121         'field_widget_display' => 'label',
122         'field_widget_display_settings' => [],
123       ],
124     ])->save();
125     $this->drupalGet('node/' . $nid . '/edit');
126     $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-remove-button');
127     $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-edit-button');
128
129     // Set them to visible again.
130     $form_display->setComponent('field_entity_reference1', [
131       'type' => 'entity_browser_entity_reference',
132       'settings' => [
133         'entity_browser' => 'test_entity_browser_iframe_node_view',
134         'open' => TRUE,
135         'field_widget_edit' => TRUE,
136         'field_widget_remove' => TRUE,
137         'field_widget_replace' => FALSE,
138         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
139         'field_widget_display' => 'label',
140         'field_widget_display_settings' => [],
141       ],
142     ])->save();
143     $this->drupalGet('node/' . $nid . '/edit');
144     $remove_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-remove-button');
145     $this->assertEquals('Remove', $remove_button->getValue());
146     $this->assertTrue($remove_button->hasClass('remove-button'));
147     $edit_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-edit-button');
148     $this->assertEquals('Edit', $edit_button->getValue());
149     $this->assertTrue($edit_button->hasClass('edit-button'));
150     // Make sure the "Replace" button is not there.
151     $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-replace-button');
152
153     // Test the "Remove" button on the widget works.
154     $page->pressButton('Remove');
155     $this->waitForAjaxToFinish();
156     $assert_session->pageTextNotContains('Target example node 1');
157
158     // Test the "Replace" button functionality.
159     $form_display->setComponent('field_entity_reference1', [
160       'type' => 'entity_browser_entity_reference',
161       'settings' => [
162         'entity_browser' => 'test_entity_browser_iframe_node_view',
163         'open' => TRUE,
164         'field_widget_edit' => TRUE,
165         'field_widget_remove' => TRUE,
166         'field_widget_replace' => TRUE,
167         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
168         'field_widget_display' => 'label',
169         'field_widget_display_settings' => [],
170       ],
171     ])->save();
172     // In order to ensure the replace button opens the browser, it needs to be
173     // closed.
174     /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */
175     $browser = $this->container->get('entity_type.manager')
176       ->getStorage('entity_browser')
177       ->load('test_entity_browser_iframe_node_view');
178     $browser->getDisplay()
179       ->setConfiguration([
180         'width' => 650,
181         'height' => 500,
182         'link_text' => 'Select entities',
183         'auto_open' => FALSE,
184       ]);
185     $browser->save();
186     // We'll need a third node to be able to make a new selection.
187     $target_node2 = Node::create([
188       'title' => 'Target example node 2',
189       'type' => 'article',
190     ]);
191     $target_node2->save();
192     $this->drupalGet('node/' . $nid . '/edit');
193     // If there is only one entity in the current selection the button should
194     // show up.
195     $replace_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-replace-button');
196     $this->assertEquals('Replace', $replace_button->getValue());
197     $this->assertTrue($replace_button->hasClass('replace-button'));
198     // Clicking on the button should empty the selection and automatically
199     // open the browser again.
200     $replace_button->click();
201     $this->waitForAjaxToFinish();
202     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
203     $this->waitForAjaxToFinish();
204     $page->checkField('edit-entity-browser-select-node3');
205     $page->pressButton('Select entities');
206     $session->wait(1000);
207     $session->switchToIFrame();
208     $this->waitForAjaxToFinish();
209     // Even in the AJAX-built markup for the newly selected element, the replace
210     // button should be there.
211     $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
212     // Adding a new node to the selection, however, should make it disappear.
213     $open_iframe_link = $assert_session->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
214     $open_iframe_link->click();
215     $this->waitForAjaxToFinish();
216     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
217     $this->waitForAjaxToFinish();
218     $page->checkField('edit-entity-browser-select-node1');
219     $page->pressButton('Select entities');
220     $session->wait(1000);
221     $session->switchToIFrame();
222     $this->waitForAjaxToFinish();
223     $assert_session->elementNotExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
224     $page->pressButton('Save');
225     $assert_session->pageTextContains('Article Referencing node 1 has been updated.');
226
227     // Test the replace button again with different field cardinalities.
228     FieldStorageConfig::load('node.field_entity_reference1')->setCardinality(1)->save();
229     $this->drupalGet('/node/add/article');
230     $page->fillField('title[0][value]', 'Referencing node 2');
231     $open_iframe_link = $assert_session->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
232     $open_iframe_link->click();
233     $this->waitForAjaxToFinish();
234     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
235     $this->waitForAjaxToFinish();
236     $page->checkField('edit-entity-browser-select-node1');
237     $page->pressButton('Select entities');
238     $session->wait(1000);
239     $session->switchToIFrame();
240     $this->waitForAjaxToFinish();
241     $assert_session->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Target example node 1');
242     // All three buttons should be visible.
243     $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-remove-button"]');
244     $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-edit-button"]');
245     $replace_button = $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
246     // Clicking on the button should empty the selection and automatically
247     // open the browser again.
248     $replace_button->click();
249     $this->waitForAjaxToFinish();
250     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
251     $this->waitForAjaxToFinish();
252     $page->checkField('edit-entity-browser-select-node2');
253     $page->pressButton('Select entities');
254     $session->wait(1000);
255     $session->switchToIFrame();
256     $this->waitForAjaxToFinish();
257     $assert_session->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Referencing node 1');
258
259     // Do the same as above but now with cardinality 2.
260     FieldStorageConfig::load('node.field_entity_reference1')->setCardinality(2)->save();
261     $this->drupalGet('/node/add/article');
262     $page->fillField('title[0][value]', 'Referencing node 3');
263     $open_iframe_link = $assert_session->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
264     $open_iframe_link->click();
265     $this->waitForAjaxToFinish();
266     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
267     $this->waitForAjaxToFinish();
268     $page->checkField('edit-entity-browser-select-node1');
269     $page->pressButton('Select entities');
270     $session->wait(1000);
271     $session->switchToIFrame();
272     $this->waitForAjaxToFinish();
273     $assert_session->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Target example node 1');
274     // All three buttons should be visible.
275     $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-remove-button"]');
276     $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-edit-button"]');
277     $replace_button = $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
278     // Clicking on the button should empty the selection and automatically
279     // open the browser again.
280     $replace_button->click();
281     $this->waitForAjaxToFinish();
282     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
283     $this->waitForAjaxToFinish();
284     $page->checkField('edit-entity-browser-select-node2');
285     $page->pressButton('Select entities');
286     $session->wait(1000);
287     $session->switchToIFrame();
288     $this->waitForAjaxToFinish();
289     $assert_session->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Referencing node 1');
290
291     // Verify that if the user cannot edit the entity, the "Edit" button does
292     // not show up, even if configured to.
293     /** @var \Drupal\user\RoleInterface $role */
294     $role = Role::load('authenticated');
295     $role->revokePermission('bypass node access')->trustData()->save();
296     $this->drupalGet('node/add/article');
297     $open_iframe_link = $assert_session->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
298     $open_iframe_link->click();
299     $this->waitForAjaxToFinish();
300     $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
301     $this->waitForAjaxToFinish();
302     $page->checkField('edit-entity-browser-select-node1');
303     $page->pressButton('Select entities');
304     $session->switchToIFrame();
305     $this->waitForAjaxToFinish();
306     $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-edit-button');
307
308   }
309
310 }