Version 1
[yaffs-website] / web / modules / contrib / entity_browser / tests / src / FunctionalJavascript / InlineEntityFormTest.php
diff --git a/web/modules/contrib/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php b/web/modules/contrib/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php
new file mode 100644 (file)
index 0000000..259e0f8
--- /dev/null
@@ -0,0 +1,260 @@
+<?php
+
+namespace Drupal\Tests\entity_browser\FunctionalJavascript;
+
+use Behat\Mink\Element\NodeElement;
+
+/**
+ * Test for integration of entity browser and inline entity form.
+ *
+ * @group entity_browser
+ *
+ * @package Drupal\Tests\entity_browser\FunctionalJavascript
+ */
+class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'ctools',
+    'views',
+    'block',
+    'node',
+    'file',
+    'image',
+    'field_ui',
+    'views_ui',
+    'system',
+    'node',
+    'inline_entity_form',
+    'entity',
+    'entity_browser_ief_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $userPermissions = [
+    'create media',
+    'update media',
+    'access ief_entity_browser_file entity browser pages',
+    'access ief_entity_browser_file_modal entity browser pages',
+    'access content',
+    'create ief_content content',
+    'edit any ief_content content',
+  ];
+
+  /**
+   * Drag element in document with defined offset position.
+   *
+   * @param \Behat\Mink\Element\NodeElement $element
+   *   Element that will be dragged.
+   * @param int $offsetX
+   *   Vertical offset for element drag in pixels.
+   * @param int $offsetY
+   *   Horizontal offset for element drag in pixels.
+   */
+  protected function dragDropElement(NodeElement $element, $offsetX, $offsetY) {
+    $elemXpath = $element->getXpath();
+
+    $jsCode = "var fireMouseEvent = function (type, element, x, y) {"
+      . "  var event = document.createEvent('MouseEvents');"
+      . "  event.initMouseEvent(type, true, (type !== 'mousemove'), window, 0, 0, 0, x, y, false, false, false, false, 0, element);"
+      . "  element.dispatchEvent(event); };";
+
+    // XPath provided by getXpath uses single quote (') to encapsulate strings,
+    // that's why xpath has to be quited with double quites in javascript code.
+    $jsCode .= "(function() {" .
+      "  var dragElement = document.evaluate(\"{$elemXpath}\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" .
+      "  var pos = dragElement.getBoundingClientRect();" .
+      "  var centerX = Math.floor((pos.left + pos.right) / 2);" .
+      "  var centerY = Math.floor((pos.top + pos.bottom) / 2);" .
+      "  fireMouseEvent('mousedown', dragElement, centerX, centerY);" .
+      "  fireMouseEvent('mousemove', document, centerX + {$offsetX}, centerY + {$offsetY});" .
+      "  fireMouseEvent('mouseup', dragElement, centerX + {$offsetX}, centerY + {$offsetY});" .
+      "})();";
+
+    $this->getSession()->executeScript($jsCode);
+  }
+
+  /**
+   * Check that selection state in entity browser Inline Entity Form.
+   */
+  public function testEntityBrowserInsideInlineEntityForm() {
+
+    $this->createFile('test_file1');
+    $this->createFile('test_file2');
+    $this->createFile('test_file3');
+
+    $this->drupalGet('node/add/ief_content');
+    $page = $this->getSession()->getPage();
+
+    $page->fillField('Title', 'Test IEF Title');
+    $page->pressButton('Add new Test File Media');
+
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->fillField('Media name', 'Test Bundle Media');
+    $page->clickLink('Select entities');
+
+    $this->getSession()
+      ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file');
+    $page->checkField('entity_browser_select[file:1]');
+    $page->checkField('entity_browser_select[file:2]');
+
+    $page->pressButton('Select entities');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Use selected');
+    $this->getSession()->switchToIFrame();
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Create Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Save');
+
+    $this->drupalGet('node/1/edit');
+    $page = $this->getSession()->getPage();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Test reorder of elements.
+    $dragged = $this->xpath("//div[@data-drupal-selector='edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current-items-0']")[0];
+    $this->dragDropElement($dragged, 150, 0);
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Update Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Check that element on second position is test_file1 (file:1).
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    if (empty($secondElement)) {
+      throw new \Exception('Element is not found.');
+    }
+    $this->assertSame('file:1', $secondElement->getAttribute('data-entity-id'));
+
+    // Test remove of element.
+    $this->click('input[name*="ief_media_bundle_file_field_remove_1_1"]');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Update Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Check that remote button does not exist for already removed entity.
+    $this->assertSession()
+      ->elementNotExists('css', '[name*="ief_media_bundle_file_field_remove_1_1"]');
+
+    // Test add inside Entity Browser.
+    $page->clickLink('Select entities');
+
+    $this->getSession()
+      ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file');
+    $page->checkField('entity_browser_select[file:3]');
+
+    $page->pressButton('Select entities');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Use selected');
+    $this->getSession()->switchToIFrame();
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Update Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Check that element on second position is test_file3 (file:3).
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    if (empty($secondElement)) {
+      throw new \Exception('Element is not found.');
+    }
+    $this->assertSame('file:3', $secondElement->getAttribute('data-entity-id'));
+
+    // Test reorder inside Entity Browser.
+    $page->clickLink('Select entities');
+
+    $this->getSession()
+      ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file');
+
+    $dragged = $this->xpath("//div[@data-drupal-selector='edit-selected-items-2-0']")[0];
+    $this->dragDropElement($dragged, 150, 0);
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Use selected');
+    $this->getSession()->switchToIFrame();
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Update Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Check that element on second position is test_file2 (file:2).
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    if (empty($secondElement)) {
+      throw new \Exception('Element is not found.');
+    }
+    $this->assertSame('file:2', $secondElement->getAttribute('data-entity-id'));
+
+    // Test remove inside entity browser.
+    $page->clickLink('Select entities');
+
+    $this->getSession()
+      ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('remove_3_0');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Use selected');
+    $this->getSession()->switchToIFrame();
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Update Test File Media');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Edit');
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    // Check that element on first position is test_file2 (file:2).
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[1]');
+    if (empty($secondElement)) {
+      throw new \Exception('Element is not found.');
+    }
+    $this->assertSame('file:2', $secondElement->getAttribute('data-entity-id'));
+  }
+
+  /**
+   * Checks auto_open functionality for modals.
+   */
+  public function testModalAutoOpenInsideInlineEntityForm() {
+
+    $this->config('core.entity_form_display.node.ief_content.default')
+      ->set('content.ief_media_field.third_party_settings.entity_browser_entity_form.entity_browser_id', 'ief_entity_browser_file_modal')
+      ->save();
+
+    $this->drupalGet('node/add/ief_content');
+    $page = $this->getSession()->getPage();
+
+    $page->fillField('Title', 'Test IEF Title');
+    $page->pressButton('Add existing Test File Media');
+
+    $this->assertSession()->assertWaitOnAjaxRequest();
+
+    $this->getSession()
+      ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file_modal');
+
+    $this->assertSession()->pageTextContains('Test entity browser file modal');
+  }
+}