From 1b3d7f0c2b9a377762312562f1a69567018eb288 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Sat, 24 Nov 2007 05:30:15 +0000 Subject: [PATCH] Refactor out the copied code to resize images based on the max file size from the Admin Settings and create a new method in Storage::Image. Build a test to verify that it works correctly. --- lib/WebGUI/Asset/File/Image.pm | 10 +------ lib/WebGUI/Asset/Post.pm | 12 +------- lib/WebGUI/Asset/Wobject/Article.pm | 11 +------- lib/WebGUI/Storage/Image.pm | 29 +++++++++++++++++++ t/Storage/Image.t | 44 +++++++++++++++++++++++++++-- 5 files changed, 74 insertions(+), 32 deletions(-) diff --git a/lib/WebGUI/Asset/File/Image.pm b/lib/WebGUI/Asset/File/Image.pm index f8b4add7e..2976e78b2 100644 --- a/lib/WebGUI/Asset/File/Image.pm +++ b/lib/WebGUI/Asset/File/Image.pm @@ -78,15 +78,7 @@ sub applyConstraints { $self->update({parameters=>$parameters.' alt="'.$self->get("title").'"'}); } my $file = $self->get("filename"); - my ($w, $h) = $storage->getSizeInPixels($file); - if($w > $maxImageSize || $h > $maxImageSize) { - if($w > $h) { - $storage->resize($file, $maxImageSize); - } - else { - $storage->resize($file, 0, $maxImageSize); - } - } + $storage->adjustMaxImageSize($file); $self->generateThumbnail($thumbnailSize); $self->setSize; } diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index 6f5133aa2..730a6117d 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -844,17 +844,7 @@ sub postProcess { my $storage = $self->getStorageLocation; foreach my $file (@{$storage->getFiles}) { if ($storage->isImage($file)) { - my ($w, $h) = $storage->getSizeInPixels($file); - my $max_size = $self->getThread->getParent->get("maxImageSize") - || $self->session->setting->get("maxImageSize"); - if($w > $max_size || $h > $max_size) { - if($w > $h) { - $storage->resize($file, $max_size); - } - else { - $storage->resize($file, 0, $max_size); - } - } + $storage->adjustMaxImageSize($file); $storage->generateThumbnail($file, $self->getThread->getParent->get("thumbnailSize")); } $size += $storage->getFileSize($file); diff --git a/lib/WebGUI/Asset/Wobject/Article.pm b/lib/WebGUI/Asset/Wobject/Article.pm index 83490db3f..c0f44fd30 100644 --- a/lib/WebGUI/Asset/Wobject/Article.pm +++ b/lib/WebGUI/Asset/Wobject/Article.pm @@ -230,16 +230,7 @@ sub processPropertiesFromFormPost { my $storage = $self->getStorageLocation; foreach my $file (@{$storage->getFiles}) { if ($storage->isImage($file)) { - my ($w, $h) = $storage->getSizeInPixels($file); - my $max_size = $self->session->setting->get("maxImageSize"); - if($w > $max_size || $h > $max_size) { - if($w > $h) { - $storage->resize($file, $max_size); - } - else { - $storage->resize($file, 0, $max_size); - } - } + $storage->adjustMaxImageSize($size); } $size += $storage->getFileSize($file); } diff --git a/lib/WebGUI/Storage/Image.pm b/lib/WebGUI/Storage/Image.pm index 008a6ed6c..4e9ebedb3 100644 --- a/lib/WebGUI/Storage/Image.pm +++ b/lib/WebGUI/Storage/Image.pm @@ -118,6 +118,35 @@ sub addFileFromCaptcha { return ($filename, $challenge); } +=head2 adjustMaxImageSize ( $file ) + +Adjust the size of an image according to the C setting in the Admin +Console. + +=head3 $file + +The name of the file to check for a maximum file size violation. + +=cut + +sub adjustMaxImageSize { + my $self = shift; + my $file = shift; + my ($w, $h) = $self->getSizeInPixels($file); + my $max_size = $self->session->setting->get("maxImageSize"); + my $resized = 0; + if($w > $max_size || $h > $max_size) { + if($w > $h) { + $self->resize($file, $max_size); + } + else { + $self->resize($file, 0, $max_size); + } + $resized = 1; + } + return $resized; +} + #------------------------------------------------------------------- =head2 copy ( [ storage ] ) diff --git a/t/Storage/Image.t b/t/Storage/Image.t index e522442ab..60ea83054 100644 --- a/t/Storage/Image.t +++ b/t/Storage/Image.t @@ -65,7 +65,7 @@ my $extensionTests = [ }, ]; -plan tests => 40 + scalar @{ $extensionTests }; # increment this value for each test you create +plan tests => 51 + scalar @{ $extensionTests }; # increment this value for each test you create my $session = WebGUI::Test->session; @@ -198,6 +198,45 @@ is($WebGUI::Test::logger_error, q/Can't make a thumbnail for a file that is not is($thumbStore->getThumbnailUrl('square.png'), $thumbStore->getUrl('thumb-square.png'), 'getThumbnailUrl returns the correct url'); +#################################################### +# +# adjustMaxImageSize +# +#################################################### + +my $origMaxImageSize = $session->setting->get('maxImageSize'); + +my $sizeTest = WebGUI::Storage::Image->create($session); + +my @testImages = qw/tooWide.gif tooTall.gif/; + +foreach my $testImage (@testImages) { + $sizeTest->addFileFromFilesystem( + File::Spec->catfile(WebGUI::Test->getTestCollateralPath, $testImage), + ); +} + +cmp_bag($sizeTest->getFiles(), ['tooWide.gif', 'tooTall.gif'], 'both files added to storage object for testing'); + + +$session->setting->set('maxImageSize', 200 ); +foreach my $testImage (@testImages) { + my $originalSize = [ $sizeTest->getSizeInPixels($testImage) ]; + is($sizeTest->adjustMaxImageSize($testImage), 0, "$testImage does not need to be resized"); + cmp_bag([$sizeTest->getSizeInPixels($testImage)], $originalSize, "$testImage was not resized"); +} + +$session->setting->set('maxImageSize', 75 ); +foreach my $testImage (@testImages) { + my @originalSize = $sizeTest->getSizeInPixels($testImage); + is($sizeTest->adjustMaxImageSize($testImage), 1, "$testImage needs to be resized"); + my @newSize = $sizeTest->getSizeInPixels($testImage); + ok ($originalSize[0] != $newSize[0], "$testImage width changed"); + ok ($originalSize[1] != $newSize[1], "$testImage height changed"); +} + +$session->setting->set('maxImageSize', $origMaxImageSize ); + TODO: { local $TODO = "Methods that need to be tested"; ok(0, 'resize'); @@ -205,8 +244,9 @@ TODO: { END { foreach my $stor ( - $imageStore, $thumbStore, $imageCopy, + $imageStore, $thumbStore, $imageCopy, $sizeTest, ) { ref $stor eq "WebGUI::Storage::Image" and $stor->delete; } + $session->setting->set('maxImageSize', $origMaxImageSize ); }