X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Feditor%2Ftests%2Fsrc%2FFunctional%2FEditorUploadImageScaleTest.php;fp=web%2Fcore%2Fmodules%2Feditor%2Ftests%2Fsrc%2FFunctional%2FEditorUploadImageScaleTest.php;h=46f9a6e4589d6315275f4d374d3b6a6bd1201143;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hp=0000000000000000000000000000000000000000;hpb=74df008bdbb3a11eeea356744f39b802369bda3c;p=yaffs-website diff --git a/web/core/modules/editor/tests/src/Functional/EditorUploadImageScaleTest.php b/web/core/modules/editor/tests/src/Functional/EditorUploadImageScaleTest.php new file mode 100644 index 000000000..46f9a6e45 --- /dev/null +++ b/web/core/modules/editor/tests/src/Functional/EditorUploadImageScaleTest.php @@ -0,0 +1,227 @@ + 'basic_html', + 'name' => 'Basic HTML', + 'weight' => 0, + ])->save(); + + // Set up text editor. + Editor::create([ + 'format' => 'basic_html', + 'editor' => 'unicorn', + 'image_upload' => [ + 'status' => TRUE, + 'scheme' => 'public', + 'directory' => 'inline-images', + 'max_size' => '', + 'max_dimensions' => [ + 'width' => NULL, + 'height' => NULL, + ], + ], + ])->save(); + + // Create admin user. + $this->adminUser = $this->drupalCreateUser(['administer filters', 'use text format basic_html']); + $this->drupalLogin($this->adminUser); + } + + /** + * Tests scaling of inline images. + */ + public function testEditorUploadImageScale() { + // Generate testing images. + $testing_image_list = $this->getTestFiles('image'); + + // Case 1: no max dimensions set: uploaded image not scaled. + $test_image = $testing_image_list[0]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = NULL; + $max_height = NULL; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $image_file_width); + $this->assertEqual($uploaded_image_file_height, $image_file_height); + $this->assertNoRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', ['%dimensions' => $max_width . 'x' . $max_height])); + + // Case 2: max width smaller than uploaded image: image scaled down. + $test_image = $testing_image_list[1]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = $image_file_width - 5; + $max_height = $image_file_height; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $max_width); + $this->assertEqual($uploaded_image_file_height, $uploaded_image_file_height * ($uploaded_image_file_width / $max_width)); + $this->assertRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', ['%dimensions' => $max_width . 'x' . $max_height])); + + // Case 3: max height smaller than uploaded image: image scaled down. + $test_image = $testing_image_list[2]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = $image_file_width; + $max_height = $image_file_height - 5; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $uploaded_image_file_width * ($uploaded_image_file_height / $max_height)); + $this->assertEqual($uploaded_image_file_height, $max_height); + $this->assertRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', ['%dimensions' => $max_width . 'x' . $max_height])); + + // Case 4: max dimensions greater than uploaded image: image not scaled. + $test_image = $testing_image_list[3]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = $image_file_width + 5; + $max_height = $image_file_height + 5; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $image_file_width); + $this->assertEqual($uploaded_image_file_height, $image_file_height); + $this->assertNoRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', ['%dimensions' => $max_width . 'x' . $max_height])); + + // Case 5: only max width dimension was provided and it was smaller than + // uploaded image: image scaled down. + $test_image = $testing_image_list[4]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = $image_file_width - 5; + $max_height = NULL; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $max_width); + $this->assertEqual($uploaded_image_file_height, $uploaded_image_file_height * ($uploaded_image_file_width / $max_width)); + $this->assertRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed width of %width pixels.', ['%width' => $max_width])); + + // Case 6: only max height dimension was provided and it was smaller than + // uploaded image: image scaled down. + $test_image = $testing_image_list[5]; + list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri); + $max_width = NULL; + $max_height = $image_file_height - 5; + $this->setMaxDimensions($max_width, $max_height); + $this->assertSavedMaxDimensions($max_width, $max_height); + list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri); + $this->assertEqual($uploaded_image_file_width, $uploaded_image_file_width * ($uploaded_image_file_height / $max_height)); + $this->assertEqual($uploaded_image_file_height, $max_height); + $this->assertRaw((string) new FormattableMarkup('The image was resized to fit within the maximum allowed height of %height pixels.', ['%height' => $max_height])); + } + + /** + * Gets the dimensions of an uploaded image. + * + * @param string $uri + * The URI of the image. + * + * @return array + * An array containing the uploaded image's width and height. + */ + protected function getTestImageInfo($uri) { + $image_file = $this->container->get('image.factory')->get($uri); + return [ + (int) $image_file->getWidth(), + (int) $image_file->getHeight(), + ]; + } + + /** + * Sets the maximum dimensions and saves the configuration. + * + * @param string|int $width + * The width of the image. + * @param string|int $height + * The height of the image. + */ + protected function setMaxDimensions($width, $height) { + $editor = Editor::load('basic_html'); + $image_upload_settings = $editor->getImageUploadSettings(); + $image_upload_settings['max_dimensions']['width'] = $width; + $image_upload_settings['max_dimensions']['height'] = $height; + $editor->setImageUploadSettings($image_upload_settings); + $editor->save(); + } + + /** + * Uploads an image via the editor dialog. + * + * @param string $uri + * The URI of the image. + * + * @return array + * An array containing the uploaded image's width and height. + */ + protected function uploadImage($uri) { + $edit = [ + 'files[fid]' => \Drupal::service('file_system')->realpath($uri), + ]; + $this->drupalGet('editor/dialog/image/basic_html'); + $this->drupalPostForm('editor/dialog/image/basic_html', $edit, t('Upload')); + $uploaded_image_file = $this->container->get('image.factory')->get('public://inline-images/' . basename($uri)); + return [ + (int) $uploaded_image_file->getWidth(), + (int) $uploaded_image_file->getHeight(), + ]; + } + + /** + * Asserts whether the saved maximum dimensions equal the ones provided. + * + * @param string $width + * The expected width of the uploaded image. + * @param string $height + * The expected height of the uploaded image. + * + * @return bool + */ + protected function assertSavedMaxDimensions($width, $height) { + $image_upload_settings = Editor::load('basic_html')->getImageUploadSettings(); + $expected = [ + 'width' => $image_upload_settings['max_dimensions']['width'], + 'height' => $image_upload_settings['max_dimensions']['height'], + ]; + $same_width = $this->assertEqual($width, $expected['width'], 'Actual width of "' . $width . '" equals the expected width of "' . $expected['width'] . '"'); + $same_height = $this->assertEqual($height, $expected['height'], 'Actual height of "' . $height . '" equals the expected width of "' . $expected['height'] . '"'); + return $same_width && $same_height; + } + +}