3 namespace Drupal\diff\Tests;
5 use Drupal\field\Entity\FieldConfig;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\field_ui\Tests\FieldUiTestTrait;
10 * Tests the Diff module entity plugins.
14 class DiffPluginFileTest extends DiffPluginTestBase {
23 public static $modules = [
30 * The file system service.
32 * @var \Drupal\Core\File\FileSystemInterface
34 protected $fileSystem;
39 protected function setUp() {
42 $this->fileSystem = \Drupal::service('file_system');
44 // FieldUiTestTrait checks the breadcrumb when adding a field, so we need
45 // to show the breadcrumb block.
46 $this->drupalPlaceBlock('system_breadcrumb_block');
50 * Tests the File plugin.
52 * @see \Drupal\diff\Plugin\diff\Field\FileFieldBuilder
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',
62 $field_storage->save();
64 'entity_type' => 'node',
65 'field_storage' => $field_storage,
66 'bundle' => 'article',
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)
75 $this->formDisplay->load('node.article.default')
76 ->setComponent('test_field', ['type' => 'entity_reference_autocomplete'])
77 ->setComponent($file_field_name, ['type' => 'file_generic'])
81 $node = $this->drupalCreateNode([
83 'title' => 'Test article',
85 $revision1 = $node->getRevisionId();
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();
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();
106 // Check differences between revisions.
107 $this->clickLink(t('Revisions'));
109 'radios_left' => $revision1,
110 'radios_right' => $revision3,
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');
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');
126 * Tests the Image plugin.
128 * @see \Drupal\diff\Plugin\diff\Field\ImageFieldBuilder
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',
141 $field_config = FieldConfig::create([
142 'field_name' => $image_field_name,
144 'entity_type' => 'node',
145 'bundle' => 'article',
147 'settings' => ['alt_field' => 1],
149 $field_config->save();
151 $this->formDisplay->load('node.article.default')
152 ->setComponent($image_field_name, [
153 'type' => 'image_image',
158 $this->viewDisplay->load('node.article.default')
159 ->setComponent($image_field_name, [
165 // Create an article.
166 $node = $this->drupalCreateNode([
168 'title' => 'Test article',
170 $revision1 = $node->getRevisionId();
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'));
177 'field_image[0][alt]' => 'Image alt',
180 $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
181 $node = $this->drupalGetNodeByTitle('Test article', TRUE);
182 $revision2 = $node->getRevisionId();
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'));
190 'field_image[0][alt]' => 'Image alt updated',
193 $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
194 $node = $this->drupalGetNodeByTitle('Test article', TRUE);
195 $revision3 = $node->getRevisionId();
197 // Check differences between revisions.
198 $this->clickLink(t('Revisions'));
200 'radios_left' => $revision1,
201 'radios_right' => $revision3,
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');
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,
214 // Add image title and alt text.
216 'field_image[0][alt]' => 'Image alt updated new',
218 'field_image[0][title]' => 'Image title updated',
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');
230 $this->drupalGet('admin/config/content/diff/fields');
231 $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_edit');
233 'fields[node.field_image][settings_edit_form][settings][show_id]' => TRUE,
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');
241 // Disable alt image fields.
242 $this->drupalGet('admin/config/content/diff/fields');
243 $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_edit');
245 'fields[node.field_image][settings_edit_form][settings][compare_alt_field]' => FALSE,
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');
255 // Disable title image fields, reenable alt.
256 $this->drupalGet('admin/config/content/diff/fields');
257 $this->drupalPostAjaxForm(NULL, [], 'node.field_image_settings_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,
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);
273 // Disable thumbnail image field.
274 $this->drupalPostAjaxForm('admin/config/content/diff/fields', [], 'node.field_image_settings_edit');
276 'fields[node.field_image][settings_edit_form][settings][show_thumbnail]' => FALSE,
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'));
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);