Version 1
[yaffs-website] / web / modules / contrib / entity_embed / src / Tests / EntityEmbedDialogTest.php
diff --git a/web/modules/contrib/entity_embed/src/Tests/EntityEmbedDialogTest.php b/web/modules/contrib/entity_embed/src/Tests/EntityEmbedDialogTest.php
new file mode 100644 (file)
index 0000000..b7d84d9
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+
+namespace Drupal\entity_embed\Tests;
+
+use Drupal\editor\Entity\Editor;
+
+/**
+ * Tests the entity_embed dialog controller and route.
+ *
+ * @group entity_embed
+ */
+class EntityEmbedDialogTest extends EntityEmbedTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['image'];
+
+  /**
+   * Tests the entity embed dialog.
+   */
+  public function testEntityEmbedDialog() {
+    // Ensure that the route is not accessible without specifying all the
+    // parameters.
+    $this->getEmbedDialog();
+    $this->assertResponse(404, 'Embed dialog is not accessible without specifying filter format and embed button.');
+    $this->getEmbedDialog('custom_format');
+    $this->assertResponse(404, 'Embed dialog is not accessible without specifying embed button.');
+
+    // Ensure that the route is not accessible with an invalid embed button.
+    $this->getEmbedDialog('custom_format', 'invalid_button');
+    $this->assertResponse(404, 'Embed dialog is not accessible without specifying filter format and embed button.');
+
+    // Ensure that the route is not accessible with text format without the
+    // button configured.
+    $this->getEmbedDialog('plain_text', 'node');
+    $this->assertResponse(404, 'Embed dialog is not accessible with a filter that does not have an editor configuration.');
+
+    // Add an empty configuration for the plain_text editor configuration.
+    $editor = Editor::create([
+      'format' => 'plain_text',
+      'editor' => 'ckeditor',
+    ]);
+    $editor->save();
+    $this->getEmbedDialog('plain_text', 'node');
+    $this->assertResponse(403, 'Embed dialog is not accessible with a filter that does not have the embed button assigned to it.');
+
+    // Ensure that the route is accessible with a valid embed button.
+    // 'Node' embed button is provided by default by the module and hence the
+    // request must be successful.
+    $this->getEmbedDialog('custom_format', 'node');
+    $this->assertResponse(200, 'Embed dialog is accessible with correct filter format and embed button.');
+
+    // Ensure form structure of the 'select' step and submit form.
+    $this->assertFieldByName('entity_id', '', 'Entity ID/UUID field is present.');
+
+    // $edit = ['attributes[data-entity-id]' => $this->node->id()];
+    // $this->drupalPostAjaxForm(NULL, $edit, 'op');
+    // Ensure form structure of the 'embed' step and submit form.
+    // $this->assertFieldByName('attributes[data-entity-embed-display]', 'Entity Embed Display plugin field is present.');.
+  }
+
+  /**
+   * Tests the entity embed button markup.
+   */
+  public function testEntityEmbedButtonMarkup() {
+    // Ensure that the route is not accessible with text format without the
+    // button configured.
+    $this->getEmbedDialog('plain_text', 'node');
+    $this->assertResponse(404, 'Embed dialog is not accessible with a filter that does not have an editor configuration.');
+
+    // Add an empty configuration for the plain_text editor configuration.
+    $editor = Editor::create([
+      'format' => 'plain_text',
+      'editor' => 'ckeditor',
+    ]);
+    $editor->save();
+    $this->getEmbedDialog('plain_text', 'node');
+    $this->assertResponse(403, 'Embed dialog is not accessible with a filter that does not have the embed button assigned to it.');
+
+    // Ensure that the route is accessible with a valid embed button.
+    // 'Node' embed button is provided by default by the module and hence the
+    // request must be successful.
+    $this->getEmbedDialog('custom_format', 'node');
+    $this->assertResponse(200, 'Embed dialog is accessible with correct filter format and embed button.');
+
+    // Ensure form structure of the 'select' step and submit form.
+    $this->assertFieldByName('entity_id', '', 'Entity ID/UUID field is present.');
+
+    // Check that 'Next' is a primary button.
+    $this->assertFieldByXPath('//input[contains(@class, "button--primary")]', 'Next', 'Next is a primary button');
+
+    $title = $this->node->getTitle() . ' (' . $this->node->id() . ')';
+    $edit = ['entity_id' => $title];
+    $response = $this->drupalPostAjaxForm(NULL, $edit, 'op');
+    $plugins = [
+      'entity_reference:entity_reference_label',
+      'entity_reference:entity_reference_entity_id',
+      'view_mode:node.full',
+      'view_mode:node.rss',
+      'view_mode:node.search_index',
+      'view_mode:node.search_result',
+      'view_mode:node.teaser',
+    ];
+    foreach ($plugins as $plugin) {
+      $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.');
+    }
+
+    $this->container->get('config.factory')->getEditable('entity_embed.settings')
+      ->set('rendered_entity_mode', TRUE)->save();
+    $this->container->get('plugin.manager.entity_embed.display')->clearCachedDefinitions();
+
+    $this->getEmbedDialog('custom_format', 'node');
+    $title = $this->node->getTitle() . ' (' . $this->node->id() . ')';
+    $edit = ['entity_id' => $title];
+    $response = $this->drupalPostAjaxForm(NULL, $edit, 'op');
+
+    $plugins = [
+      'entity_reference:entity_reference_label',
+      'entity_reference:entity_reference_entity_id',
+      'entity_reference:entity_reference_entity_view',
+    ];
+    foreach ($plugins as $plugin) {
+      $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.');
+    }
+    /*$this->drupalPostForm(NULL, $edit, 'Next');
+    // Ensure form structure of the 'embed' step and submit form.
+    $this->assertFieldByName('attributes[data-entity-embed-display]', 'Entity Embed Display plugin field is present.');
+
+    // Check that 'Embed' is a primary button.
+    $this->assertFieldByXPath('//input[contains(@class, "button--primary")]', 'Embed', 'Embed is a primary button');*/
+  }
+
+  /**
+   * Tests entity embed functionality.
+   */
+  public function testEntityEmbedFunctionality() {
+    $edit = [
+      'entity_id' => $this->node->getTitle() . ' (' . $this->node->id() . ')',
+    ];
+    $this->getEmbedDialog('custom_format', 'node');
+    $this->drupalPostForm(NULL, $edit, t('Next'));
+    // Tests that the embed dialog doesn't trow a fatal in
+    // ImageFieldFormatter::isValidImage()
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Retrieves an embed dialog based on given parameters.
+   *
+   * @param string $filter_format_id
+   *   ID of the filter format.
+   * @param string $embed_button_id
+   *   ID of the embed button.
+   *
+   * @return string
+   *   The retrieved HTML string.
+   */
+  public function getEmbedDialog($filter_format_id = NULL, $embed_button_id = NULL) {
+    $url = 'entity-embed/dialog';
+    if (!empty($filter_format_id)) {
+      $url .= '/' . $filter_format_id;
+      if (!empty($embed_button_id)) {
+        $url .= '/' . $embed_button_id;
+      }
+    }
+    return $this->drupalGet($url);
+  }
+
+}