Interim commit.
[yaffs-website] / web / modules / contrib / entity_embed / src / Tests / EntityEmbedDialogTest.php
1 <?php
2
3 namespace Drupal\entity_embed\Tests;
4
5 use Drupal\editor\Entity\Editor;
6
7 /**
8  * Tests the entity_embed dialog controller and route.
9  *
10  * @group entity_embed
11  */
12 class EntityEmbedDialogTest extends EntityEmbedTestBase {
13
14   /**
15    * Modules to enable.
16    *
17    * @var array
18    */
19   public static $modules = ['image'];
20
21   /**
22    * Tests the entity embed dialog.
23    */
24   public function testEntityEmbedDialog() {
25     // Ensure that the route is not accessible without specifying all the
26     // parameters.
27     $this->getEmbedDialog();
28     $this->assertResponse(404, 'Embed dialog is not accessible without specifying filter format and embed button.');
29     $this->getEmbedDialog('custom_format');
30     $this->assertResponse(404, 'Embed dialog is not accessible without specifying embed button.');
31
32     // Ensure that the route is not accessible with an invalid embed button.
33     $this->getEmbedDialog('custom_format', 'invalid_button');
34     $this->assertResponse(404, 'Embed dialog is not accessible without specifying filter format and embed button.');
35
36     // Ensure that the route is not accessible with text format without the
37     // button configured.
38     $this->getEmbedDialog('plain_text', 'node');
39     $this->assertResponse(404, 'Embed dialog is not accessible with a filter that does not have an editor configuration.');
40
41     // Add an empty configuration for the plain_text editor configuration.
42     $editor = Editor::create([
43       'format' => 'plain_text',
44       'editor' => 'ckeditor',
45     ]);
46     $editor->save();
47     $this->getEmbedDialog('plain_text', 'node');
48     $this->assertResponse(403, 'Embed dialog is not accessible with a filter that does not have the embed button assigned to it.');
49
50     // Ensure that the route is accessible with a valid embed button.
51     // 'Node' embed button is provided by default by the module and hence the
52     // request must be successful.
53     $this->getEmbedDialog('custom_format', 'node');
54     $this->assertResponse(200, 'Embed dialog is accessible with correct filter format and embed button.');
55
56     // Ensure form structure of the 'select' step and submit form.
57     $this->assertFieldByName('entity_id', '', 'Entity ID/UUID field is present.');
58
59     // $edit = ['attributes[data-entity-id]' => $this->node->id()];
60     // $this->drupalPostAjaxForm(NULL, $edit, 'op');
61     // Ensure form structure of the 'embed' step and submit form.
62     // $this->assertFieldByName('attributes[data-entity-embed-display]', 'Entity Embed Display plugin field is present.');.
63   }
64
65   /**
66    * Tests the entity embed button markup.
67    */
68   public function testEntityEmbedButtonMarkup() {
69     // Ensure that the route is not accessible with text format without the
70     // button configured.
71     $this->getEmbedDialog('plain_text', 'node');
72     $this->assertResponse(404, 'Embed dialog is not accessible with a filter that does not have an editor configuration.');
73
74     // Add an empty configuration for the plain_text editor configuration.
75     $editor = Editor::create([
76       'format' => 'plain_text',
77       'editor' => 'ckeditor',
78     ]);
79     $editor->save();
80     $this->getEmbedDialog('plain_text', 'node');
81     $this->assertResponse(403, 'Embed dialog is not accessible with a filter that does not have the embed button assigned to it.');
82
83     // Ensure that the route is accessible with a valid embed button.
84     // 'Node' embed button is provided by default by the module and hence the
85     // request must be successful.
86     $this->getEmbedDialog('custom_format', 'node');
87     $this->assertResponse(200, 'Embed dialog is accessible with correct filter format and embed button.');
88
89     // Ensure form structure of the 'select' step and submit form.
90     $this->assertFieldByName('entity_id', '', 'Entity ID/UUID field is present.');
91
92     // Check that 'Next' is a primary button.
93     $this->assertFieldByXPath('//input[contains(@class, "button--primary")]', 'Next', 'Next is a primary button');
94
95     $title = $this->node->getTitle() . ' (' . $this->node->id() . ')';
96     $edit = ['entity_id' => $title];
97     $response = $this->drupalPostAjaxForm(NULL, $edit, 'op');
98     $plugins = [
99       'entity_reference:entity_reference_label',
100       'entity_reference:entity_reference_entity_id',
101       'view_mode:node.full',
102       'view_mode:node.rss',
103       'view_mode:node.search_index',
104       'view_mode:node.search_result',
105       'view_mode:node.teaser',
106     ];
107     foreach ($plugins as $plugin) {
108       $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.');
109     }
110
111     $this->container->get('config.factory')->getEditable('entity_embed.settings')
112       ->set('rendered_entity_mode', TRUE)->save();
113     $this->container->get('plugin.manager.entity_embed.display')->clearCachedDefinitions();
114
115     $this->getEmbedDialog('custom_format', 'node');
116     $title = $this->node->getTitle() . ' (' . $this->node->id() . ')';
117     $edit = ['entity_id' => $title];
118     $response = $this->drupalPostAjaxForm(NULL, $edit, 'op');
119
120     $plugins = [
121       'entity_reference:entity_reference_label',
122       'entity_reference:entity_reference_entity_id',
123       'entity_reference:entity_reference_entity_view',
124     ];
125     foreach ($plugins as $plugin) {
126       $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.');
127     }
128     /*$this->drupalPostForm(NULL, $edit, 'Next');
129     // Ensure form structure of the 'embed' step and submit form.
130     $this->assertFieldByName('attributes[data-entity-embed-display]', 'Entity Embed Display plugin field is present.');
131
132     // Check that 'Embed' is a primary button.
133     $this->assertFieldByXPath('//input[contains(@class, "button--primary")]', 'Embed', 'Embed is a primary button');*/
134   }
135
136   /**
137    * Tests entity embed functionality.
138    */
139   public function testEntityEmbedFunctionality() {
140     $edit = [
141       'entity_id' => $this->node->getTitle() . ' (' . $this->node->id() . ')',
142     ];
143     $this->getEmbedDialog('custom_format', 'node');
144     $this->drupalPostForm(NULL, $edit, t('Next'));
145     // Tests that the embed dialog doesn't trow a fatal in
146     // ImageFieldFormatter::isValidImage()
147     $this->assertResponse(200);
148   }
149
150   /**
151    * Retrieves an embed dialog based on given parameters.
152    *
153    * @param string $filter_format_id
154    *   ID of the filter format.
155    * @param string $embed_button_id
156    *   ID of the embed button.
157    *
158    * @return string
159    *   The retrieved HTML string.
160    */
161   public function getEmbedDialog($filter_format_id = NULL, $embed_button_id = NULL) {
162     $url = 'entity-embed/dialog';
163     if (!empty($filter_format_id)) {
164       $url .= '/' . $filter_format_id;
165       if (!empty($embed_button_id)) {
166         $url .= '/' . $embed_button_id;
167       }
168     }
169     return $this->drupalGet($url);
170   }
171
172 }