Version 1
[yaffs-website] / web / modules / contrib / diff / src / Tests / DiffPluginFileTest.php
1 <?php
2
3 namespace Drupal\diff\Tests;
4
5 use Drupal\field\Entity\FieldConfig;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\field_ui\Tests\FieldUiTestTrait;
8
9 /**
10  * Tests the Diff module entity plugins.
11  *
12  * @group diff
13  */
14 class DiffPluginFileTest extends DiffPluginTestBase {
15
16   use FieldUiTestTrait;
17
18   /**
19    * Modules to enable.
20    *
21    * @var array
22    */
23   public static $modules = [
24     'file',
25     'image',
26     'field_ui',
27   ];
28
29   /**
30    * The file system service.
31    *
32    * @var \Drupal\Core\File\FileSystemInterface
33    */
34   protected $fileSystem;
35
36   /**
37    * {@inheritdoc}
38    */
39   protected function setUp() {
40     parent::setUp();
41
42     $this->fileSystem = \Drupal::service('file_system');
43
44     // FieldUiTestTrait checks the breadcrumb when adding a field, so we need
45     // to show the breadcrumb block.
46     $this->drupalPlaceBlock('system_breadcrumb_block');
47   }
48
49   /**
50    * Tests the File plugin.
51    *
52    * @see \Drupal\diff\Plugin\diff\Field\FileFieldBuilder
53    */
54   public function testFilePlugin() {
55     // Add file field to the article content type.
56     $file_field_name = 'field_file';
57     $field_storage = FieldStorageConfig::create(array(
58       'field_name' => $file_field_name,
59       'entity_type' => 'node',
60       'type' => 'file',
61     ));
62     $field_storage->save();
63     FieldConfig::create([
64       'entity_type' => 'node',
65       'field_storage' => $field_storage,
66       'bundle' => 'article',
67       'label' => 'File',
68     ])->save();
69
70     // Make the field visible in the form and desfault display.
71     $this->viewDisplay->load('node.article.default')
72       ->setComponent('test_field')
73       ->setComponent($file_field_name)
74       ->save();
75     $this->formDisplay->load('node.article.default')
76       ->setComponent('test_field', ['type' => 'entity_reference_autocomplete'])
77       ->setComponent($file_field_name, ['type' => 'file_generic'])
78       ->save();
79
80     // Create an article.
81     $node = $this->drupalCreateNode([
82       'type' => 'article',
83       'title' => 'Test article',
84     ]);
85     $revision1 = $node->getRevisionId();
86
87     // Upload a file to the article.
88     $test_files = $this->drupalGetTestFiles('text');
89     $edit['files[field_file_0]'] = $this->fileSystem->realpath($test_files['0']->uri);
90     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, 'Upload');
91     $edit['revision'] = TRUE;
92     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
93     $node = $this->drupalGetNodeByTitle('Test article', TRUE);
94     $revision2 = $node->getRevisionId();
95
96     // Replace the file by a different one.
97     $this->drupalPostForm('node/' . $node->id() . '/edit', [], 'Remove');
98     $this->drupalPostForm(NULL, ['revision' => FALSE], t('Save and keep published'));
99     $edit['files[field_file_0]'] = $this->fileSystem->realpath($test_files['1']->uri);
100     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, 'Upload');
101     $edit['revision'] = TRUE;
102     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
103     $node = $this->drupalGetNodeByTitle('Test article', TRUE);
104     $revision3 = $node->getRevisionId();
105
106     // Check differences between revisions.
107     $this->clickLink(t('Revisions'));
108     $edit = [
109       'radios_left' => $revision1,
110       'radios_right' => $revision3,
111     ];
112     $this->drupalPostForm(NULL, $edit, t('Compare selected revisions'));
113     $this->assertText('File');
114     $this->assertText('File: text-1.txt');
115     $this->assertText('File ID: 4');
116
117     // Use the unified fields layout.
118     $this->clickLink('Unified fields');
119     $this->assertResponse(200);
120     $this->assertText('File');
121     $this->assertText('File: text-1.txt');
122     $this->assertText('File ID: 4');
123   }
124
125   /**
126    * Tests the Image plugin.
127    *
128    * @see \Drupal\diff\Plugin\diff\Field\ImageFieldBuilder
129    */
130   public function testImagePlugin() {
131     // Add image field to the article content type.
132     $image_field_name = 'field_image';
133     FieldStorageConfig::create([
134       'field_name' => $image_field_name,
135       'entity_type' => 'node',
136       'type' => 'image',
137       'settings' => [],
138       'cardinality' => 1,
139     ])->save();
140
141     $field_config = FieldConfig::create([
142       'field_name' => $image_field_name,
143       'label' => 'Image',
144       'entity_type' => 'node',
145       'bundle' => 'article',
146       'required' => FALSE,
147       'settings' => ['alt_field' => 1],
148     ]);
149     $field_config->save();
150
151     $this->formDisplay->load('node.article.default')
152       ->setComponent($image_field_name, [
153         'type' => 'image_image',
154         'settings' => [],
155       ])
156       ->save();
157
158     $this->viewDisplay->load('node.article.default')
159       ->setComponent($image_field_name, [
160         'type' => 'image',
161         'settings' => [],
162       ])
163       ->save();
164
165     // Create an article.
166     $node = $this->drupalCreateNode([
167       'type' => 'article',
168       'title' => 'Test article',
169     ]);
170     $revision1 = $node->getRevisionId();
171
172     // Upload an image to the article.
173     $test_files = $this->drupalGetTestFiles('image');
174     $edit = ['files[field_image_0]' => $this->fileSystem->realpath($test_files['1']->uri)];
175     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
176     $edit = [
177       'field_image[0][alt]' => 'Image alt',
178       'revision' => TRUE,
179     ];
180     $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
181     $node = $this->drupalGetNodeByTitle('Test article', TRUE);
182     $revision2 = $node->getRevisionId();
183
184     // Replace the image by a different one.
185     $this->drupalPostForm('node/' . $node->id() . '/edit', [], 'Remove');
186     $this->drupalPostForm(NULL, ['revision' => FALSE], t('Save and keep published'));
187     $edit = ['files[field_image_0]' => $this->fileSystem->realpath($test_files['1']->uri)];
188     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
189     $edit = [
190       'field_image[0][alt]' => 'Image alt updated',
191       'revision' => TRUE,
192     ];
193     $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
194     $node = $this->drupalGetNodeByTitle('Test article', TRUE);
195     $revision3 = $node->getRevisionId();
196
197     // Check differences between revisions.
198     $this->clickLink(t('Revisions'));
199     $edit = [
200       'radios_left' => $revision1,
201       'radios_right' => $revision3,
202     ];
203     $this->drupalPostForm(NULL, $edit, t('Compare selected revisions'));
204     $this->assertText('Image');
205     $this->assertText('Image: image-test-transparent-indexed.gif');
206     // Image title must be absent since it is not set in previous revisions.
207     $this->assertNoText('Title');
208
209     // Enable Title field in instance settings.
210     $this->drupalPostForm('admin/structure/types/manage/article/fields/node.article.field_image', [
211       'settings[title_field]' => 1,
212     ], 'Save settings');
213
214     // Add image title and alt text.
215     $edit = [
216       'field_image[0][alt]' => 'Image alt updated new',
217       'revision' => TRUE,
218       'field_image[0][title]' => 'Image title updated',
219     ];
220     $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
221     $this->drupalPostForm('node/' . $node->id() . '/revisions', [], t('Compare selected revisions'));
222     $rows = $this->xpath('//tbody/tr');
223     // Image title and alternative text must be shown.
224     $this->assertEqual(htmlspecialchars_decode(strip_tags($rows[2]->td[2]->asXML())), 'Alt: Image alt updated');
225     $this->assertEqual(htmlspecialchars_decode(strip_tags($rows[2]->td[5]->asXML())), 'Alt: Image alt updated new');
226     $this->assertEqual(htmlspecialchars_decode(strip_tags($rows[3]->td[2]->asXML())), '');
227     $this->assertEqual(htmlspecialchars_decode(strip_tags($rows[3]->td[5]->asXML())), 'Title: Image title updated');
228
229     // Show File ID.
230     $this->drupalGet('admin/config/content/diff/fields');
231     $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_edit');
232     $edit = [
233       'fields[node.field_image][settings_edit_form][settings][show_id]' => TRUE,
234     ];
235     $this->drupalPostAjaxForm(NULL, $edit, 'node.field_image_plugin_settings_update');
236     $this->drupalPostForm(NULL, [], t('Save'));
237     $this->drupalPostForm('node/' . $node->id() . '/revisions', [], t('Compare selected revisions'));
238     // Alt and title must be hidden.
239     $this->assertText('File ID: 2');
240
241     // Disable alt image fields.
242     $this->drupalGet('admin/config/content/diff/fields');
243     $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_edit');
244     $edit = [
245       'fields[node.field_image][settings_edit_form][settings][compare_alt_field]' => FALSE,
246     ];
247     $this->drupalPostAjaxForm(NULL, $edit, 'node.field_image_plugin_settings_update');
248     $this->drupalPostForm(NULL, [], t('Save'));
249     $this->drupalPostForm('node/' . $node->id() . '/revisions', [], t('Compare selected revisions'));
250     // Alt and title must be hidden.
251     $this->assertNoText('Alt: Image alt updated');
252     $this->assertNoText('Alt: Image alt updated new');
253     $this->assertText('Title: Image title updated');
254
255     // Disable title image fields, reenable alt.
256     $this->drupalGet('admin/config/content/diff/fields');
257     $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_edit');
258     $edit = [
259       'fields[node.field_image][settings_edit_form][settings][compare_alt_field]' => TRUE,
260       'fields[node.field_image][settings_edit_form][settings][compare_title_field]' => FALSE,
261     ];
262     $this->drupalPostAjaxForm(NULL, $edit, 'node.field_image_plugin_settings_update');
263     $this->drupalPostForm(NULL, [], t('Save'));
264     $this->drupalPostForm('node/' . $node->id() . '/revisions', [], t('Compare selected revisions'));
265     $this->assertText('Alt: Image alt updated');
266     $this->assertText('Alt: Image alt updated new');
267     $this->assertNoText('Title: Image title updated');
268     // Assert the thumbnail is displayed.
269     $img1_url = file_create_url(\Drupal::token()->replace("public://styles/thumbnail/public/[date:custom:Y]-[date:custom:m]/" . $test_files['1']->name));
270     $image_url = file_url_transform_relative($img1_url);
271     $this->assertRaw($image_url);
272
273     // Disable thumbnail image field.
274     $this->drupalPostAjaxForm('admin/config/content/diff/fields', [], 'node.field_image_settings_edit');
275     $edit = [
276       'fields[node.field_image][settings_edit_form][settings][show_thumbnail]' => FALSE,
277     ];
278     $this->drupalPostAjaxForm(NULL, $edit, 'node.field_image_plugin_settings_update');
279     $this->drupalPostForm(NULL, [], t('Save'));
280     $this->drupalPostForm('node/' . $node->id() . '/revisions', [], t('Compare selected revisions'));
281
282     // Assert the thumbnail is not displayed.
283     $img1_url = file_create_url(\Drupal::token()->replace("public://styles/thumbnail/public/[date:custom:Y]-[date:custom:m]/" . $test_files['1']->name));
284     $image_url = file_url_transform_relative($img1_url);
285     $this->assertNoRaw($image_url);
286   }
287
288 }