aa9441e045415b682646680d12e19eb29365f6be
[yaffs-website] / web / core / modules / image / tests / src / Functional / ImageFieldValidateTest.php
1 <?php
2
3 namespace Drupal\Tests\image\Functional;
4
5 use Drupal\Tests\TestFileCreationTrait;
6
7 /**
8  * Tests validation functions such as min/max resolution.
9  *
10  * @group image
11  */
12 class ImageFieldValidateTest extends ImageFieldTestBase {
13
14   use TestFileCreationTrait {
15     getTestFiles as drupalGetTestFiles;
16     compareFiles as drupalCompareFiles;
17   }
18
19   /**
20    * Test image validity.
21    */
22   public function testValid() {
23     $file_system = $this->container->get('file_system');
24     $image_files = $this->drupalGetTestFiles('image');
25
26     $field_name = strtolower($this->randomMachineName());
27     $this->createImageField($field_name, 'article', [], ['file_directory' => 'test-upload']);
28     $expected_path = 'public://test-upload';
29
30     // Create alt text for the image.
31     $alt = $this->randomMachineName();
32
33     // Create a node with a valid image.
34     $node = $this->uploadNodeImage($image_files[0], $field_name, 'article', $alt);
35     $this->assertTrue(file_exists($expected_path . '/' . $image_files[0]->filename));
36
37     // Remove the image.
38     $this->drupalPostForm('node/' . $node . '/edit', [], t('Remove'));
39     $this->drupalPostForm(NULL, [], t('Save'));
40
41     // Get invalid image test files from simpletest.
42     $files = file_scan_directory(drupal_get_path('module', 'simpletest') . '/files', '/invalid-img-.*/');
43     $invalid_image_files = [];
44     foreach ($files as $file) {
45       $invalid_image_files[$file->filename] = $file;
46     }
47
48     // Try uploading a zero-byte image.
49     $zero_size_image = $invalid_image_files['invalid-img-zero-size.png'];
50     $edit = [
51       'files[' . $field_name . '_0]' => $file_system->realpath($zero_size_image->uri),
52     ];
53     $this->drupalPostForm('node/' . $node . '/edit', $edit, t('Upload'));
54     $this->assertFalse(file_exists($expected_path . '/' . $zero_size_image->filename));
55
56     // Try uploading an invalid image.
57     $invalid_image = $invalid_image_files['invalid-img-test.png'];
58     $edit = [
59       'files[' . $field_name . '_0]' => $file_system->realpath($invalid_image->uri),
60     ];
61     $this->drupalPostForm('node/' . $node . '/edit', $edit, t('Upload'));
62     $this->assertFalse(file_exists($expected_path . '/' . $invalid_image->filename));
63
64     // Upload a valid image again.
65     $valid_image = $image_files[0];
66     $edit = [
67       'files[' . $field_name . '_0]' => $file_system->realpath($valid_image->uri),
68     ];
69     $this->drupalPostForm('node/' . $node . '/edit', $edit, t('Upload'));
70     $this->assertTrue(file_exists($expected_path . '/' . $valid_image->filename));
71   }
72
73   /**
74    * Test min/max resolution settings.
75    */
76   public function testResolution() {
77     $field_names = [
78       0 => strtolower($this->randomMachineName()),
79       1 => strtolower($this->randomMachineName()),
80       2 => strtolower($this->randomMachineName()),
81     ];
82     $min_resolution = [
83       'width' => 50,
84       'height' => 50,
85     ];
86     $max_resolution = [
87       'width' => 100,
88       'height' => 100,
89     ];
90     $no_height_min_resolution = [
91       'width' => 50,
92       'height' => NULL,
93     ];
94     $no_height_max_resolution = [
95       'width' => 100,
96       'height' => NULL,
97     ];
98     $no_width_min_resolution = [
99       'width' => NULL,
100       'height' => 50,
101     ];
102     $no_width_max_resolution = [
103       'width' => NULL,
104       'height' => 100,
105     ];
106     $field_settings = [
107       0 => $this->getFieldSettings($min_resolution, $max_resolution),
108       1 => $this->getFieldSettings($no_height_min_resolution, $no_height_max_resolution),
109       2 => $this->getFieldSettings($no_width_min_resolution, $no_width_max_resolution),
110     ];
111     $this->createImageField($field_names[0], 'article', [], $field_settings[0]);
112     $this->createImageField($field_names[1], 'article', [], $field_settings[1]);
113     $this->createImageField($field_names[2], 'article', [], $field_settings[2]);
114
115     // We want a test image that is too small, and a test image that is too
116     // big, so cycle through test image files until we have what we need.
117     $image_that_is_too_big = FALSE;
118     $image_that_is_too_small = FALSE;
119     $image_factory = $this->container->get('image.factory');
120     foreach ($this->drupalGetTestFiles('image') as $image) {
121       $image_file = $image_factory->get($image->uri);
122       if ($image_file->getWidth() > $max_resolution['width']) {
123         $image_that_is_too_big = $image;
124       }
125       if ($image_file->getWidth() < $min_resolution['width']) {
126         $image_that_is_too_small = $image;
127         $image_that_is_too_small_file = $image_file;
128       }
129       if ($image_that_is_too_small && $image_that_is_too_big) {
130         break;
131       }
132     }
133     $this->uploadNodeImage($image_that_is_too_small, $field_names[0], 'article');
134     $this->assertRaw(t('The specified file %name could not be uploaded.', ['%name' => $image_that_is_too_small->filename]));
135     $this->assertRaw(t('The image is too small. The minimum dimensions are %dimensions pixels and the image size is %widthx%height pixels.', [
136       '%dimensions' => '50x50',
137       '%width' => $image_that_is_too_small_file->getWidth(),
138       '%height' => $image_that_is_too_small_file->getHeight(),
139       ]));
140     $this->uploadNodeImage($image_that_is_too_big, $field_names[0], 'article');
141     $this->assertText(t('The image was resized to fit within the maximum allowed dimensions of 100x100 pixels.'));
142     $this->uploadNodeImage($image_that_is_too_small, $field_names[1], 'article');
143     $this->assertRaw(t('The specified file %name could not be uploaded.', ['%name' => $image_that_is_too_small->filename]));
144     $this->uploadNodeImage($image_that_is_too_big, $field_names[1], 'article');
145     $this->assertText(t('The image was resized to fit within the maximum allowed width of 100 pixels.'));
146     $this->uploadNodeImage($image_that_is_too_small, $field_names[2], 'article');
147     $this->assertRaw(t('The specified file %name could not be uploaded.', ['%name' => $image_that_is_too_small->filename]));
148     $this->uploadNodeImage($image_that_is_too_big, $field_names[2], 'article');
149     $this->assertText(t('The image was resized to fit within the maximum allowed height of 100 pixels.'));
150   }
151
152   /**
153    * Test that required alt/title fields gets validated right.
154    */
155   public function testRequiredAttributes() {
156     $field_name = strtolower($this->randomMachineName());
157     $field_settings = [
158       'alt_field' => 1,
159       'alt_field_required' => 1,
160       'title_field' => 1,
161       'title_field_required' => 1,
162       'required' => 1,
163     ];
164     $instance = $this->createImageField($field_name, 'article', [], $field_settings);
165     $images = $this->drupalGetTestFiles('image');
166     // Let's just use the first image.
167     $image = $images[0];
168     $this->uploadNodeImage($image, $field_name, 'article');
169
170     // Look for form-required for the alt text.
171     $elements = $this->xpath('//label[@for="edit-' . $field_name . '-0-alt" and @class="js-form-required form-required"]/following-sibling::input[@id="edit-' . $field_name . '-0-alt"]');
172
173     $this->assertTrue(isset($elements[0]), 'Required marker is shown for the required alt text.');
174
175     $elements = $this->xpath('//label[@for="edit-' . $field_name . '-0-title" and @class="js-form-required form-required"]/following-sibling::input[@id="edit-' . $field_name . '-0-title"]');
176
177     $this->assertTrue(isset($elements[0]), 'Required marker is shown for the required title text.');
178
179     $this->assertText(t('Alternative text field is required.'));
180     $this->assertText(t('Title field is required.'));
181
182     $instance->setSetting('alt_field_required', 0);
183     $instance->setSetting('title_field_required', 0);
184     $instance->save();
185
186     $edit = [
187       'title[0][value]' => $this->randomMachineName(),
188     ];
189     $this->drupalPostForm('node/add/article', $edit, t('Save'));
190
191     $this->assertNoText(t('Alternative text field is required.'));
192     $this->assertNoText(t('Title field is required.'));
193
194     $instance->setSetting('required', 0);
195     $instance->setSetting('alt_field_required', 1);
196     $instance->setSetting('title_field_required', 1);
197     $instance->save();
198
199     $edit = [
200       'title[0][value]' => $this->randomMachineName(),
201     ];
202     $this->drupalPostForm('node/add/article', $edit, t('Save'));
203
204     $this->assertNoText(t('Alternative text field is required.'));
205     $this->assertNoText(t('Title field is required.'));
206   }
207
208   /**
209    * Returns field settings.
210    *
211    * @param int[] $min_resolution
212    *   The minimum width and height resolution setting.
213    * @param int[] $max_resolution
214    *   The maximum width and height resolution setting.
215    *
216    * @return array
217    */
218   protected function getFieldSettings($min_resolution, $max_resolution) {
219     return [
220       'max_resolution' => $max_resolution['width'] . 'x' . $max_resolution['height'],
221       'min_resolution' => $min_resolution['width'] . 'x' . $min_resolution['height'],
222       'alt_field' => 0,
223     ];
224   }
225
226 }