Ready for 7.10.29 development.
This commit is contained in:
commit
c806f99b7b
4236 changed files with 1217679 additions and 0 deletions
319
t/Storage/Image.t
Normal file
319
t/Storage/Image.t
Normal file
|
|
@ -0,0 +1,319 @@
|
|||
#-------------------------------------------------------------------
|
||||
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
|
||||
#-------------------------------------------------------------------
|
||||
# Please read the legal notices (docs/legal.txt) and the license
|
||||
# (docs/license.txt) that came with this distribution before using
|
||||
# this software.
|
||||
#-------------------------------------------------------------------
|
||||
# http://www.plainblack.com info@plainblack.com
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
use FindBin;
|
||||
use strict;
|
||||
use lib "$FindBin::Bin/../lib";
|
||||
our $todo;
|
||||
|
||||
use WebGUI::Test;
|
||||
use WebGUI::Session;
|
||||
use WebGUI::Image;
|
||||
use WebGUI::Storage;
|
||||
|
||||
use File::Spec;
|
||||
use Test::More;
|
||||
use Test::Deep;
|
||||
|
||||
my $extensionTests = [
|
||||
{
|
||||
filename => 'filename',
|
||||
isImage => 0,
|
||||
comment => 'no extension',
|
||||
},
|
||||
{
|
||||
filename => 'filename.JPG',
|
||||
isImage => 1,
|
||||
comment => 'JPG caps',
|
||||
},
|
||||
{
|
||||
filename => 'filename.jpg',
|
||||
isImage => 1,
|
||||
comment => 'JPG lower case',
|
||||
},
|
||||
{
|
||||
filename => 'filename.jpeg',
|
||||
isImage => 1,
|
||||
comment => 'jpeg file',
|
||||
},
|
||||
{
|
||||
filename => 'filename.gif',
|
||||
isImage => 1,
|
||||
comment => 'gif file',
|
||||
},
|
||||
{
|
||||
filename => 'filename.png',
|
||||
isImage => 1,
|
||||
comment => 'png file',
|
||||
},
|
||||
{
|
||||
filename => 'filename.bmp',
|
||||
isImage => 0,
|
||||
comment => 'bmp file is not an image',
|
||||
},
|
||||
{
|
||||
filename => 'filename.tiff',
|
||||
isImage => 0,
|
||||
comment => 'tiff file is not an image',
|
||||
},
|
||||
];
|
||||
|
||||
plan tests => 55 + scalar @{ $extensionTests }; # increment this value for each test you create
|
||||
|
||||
my $session = WebGUI::Test->session;
|
||||
|
||||
my $uploadDir = $session->config->get('uploadsPath');
|
||||
ok ($uploadDir, "uploadDir defined in config");
|
||||
|
||||
my $uploadUrl = $session->config->get('uploadsURL');
|
||||
ok ($uploadUrl, "uploadDir defined in config");
|
||||
|
||||
####################################################
|
||||
#
|
||||
# getFile
|
||||
#
|
||||
####################################################
|
||||
|
||||
my $imageStore = WebGUI::Storage->create($session);
|
||||
WebGUI::Test->addToCleanup($imageStore);
|
||||
my $expectedFiles = ['.', ];
|
||||
cmp_bag($imageStore->getFiles(1), $expectedFiles, 'Starting with an empty storage object, no files in here except for . and ..');
|
||||
$imageStore->addFileFromScalar('.dotfile', 'dot file');
|
||||
push @{ $expectedFiles }, '.dotfile';
|
||||
cmp_bag($imageStore->getFiles(), [ ], 'getFiles() by default does not return dot files');
|
||||
cmp_bag($imageStore->getFiles(1), $expectedFiles, 'getFiles(1) returns all files, including dot files');
|
||||
|
||||
$imageStore->addFileFromScalar('dot.file', 'dot.file');
|
||||
push @{ $expectedFiles }, 'dot.file';
|
||||
cmp_bag($imageStore->getFiles(), ['dot.file'], 'getFiles() returns normal files');
|
||||
cmp_bag($imageStore->getFiles(1), $expectedFiles, 'getFiles(1) returns all files, including dot files');
|
||||
|
||||
$imageStore->addFileFromScalar('thumb-file.png', 'thumbnail file');
|
||||
push @{ $expectedFiles}, 'thumb-file.png';
|
||||
cmp_bag($imageStore->getFiles(), ['dot.file', ], 'getFiles() ignores thumb- file');
|
||||
cmp_bag($imageStore->getFiles(1), $expectedFiles, '... even when the allFiles switch is passed');
|
||||
|
||||
####################################################
|
||||
#
|
||||
# isImage
|
||||
#
|
||||
####################################################
|
||||
|
||||
foreach my $extTest ( @{ $extensionTests } ) {
|
||||
is( $imageStore->isImage($extTest->{filename}), $extTest->{isImage}, $extTest->{comment} );
|
||||
}
|
||||
|
||||
####################################################
|
||||
#
|
||||
# generateThumbnail
|
||||
#
|
||||
####################################################
|
||||
|
||||
WebGUI::Test->interceptLogging();
|
||||
|
||||
my $thumbStore = WebGUI::Storage->create($session);
|
||||
WebGUI::Test->addToCleanup($thumbStore);
|
||||
my $square = WebGUI::Image->new($session, 500, 500);
|
||||
$square->setBackgroundColor('#FF0000');
|
||||
$square->saveToStorageLocation($thumbStore, 'square.png');
|
||||
is($thumbStore->generateThumbnail(), 0, 'generateThumbnail returns 0 if no filename is supplied');
|
||||
is($WebGUI::Test::logger_error, q/Can't generate a thumbnail when you haven't specified a file./, 'generateThumbnail logs an error message for not sending a filename');
|
||||
is($thumbStore->generateThumbnail('file.txt'), 0, 'generateThumbnail returns 0 if you try to thumbnail a non-image file');
|
||||
is($WebGUI::Test::logger_warns, q/Can't generate a thumbnail for something that's not an image./, 'generateThumbnail logs a warning message for thumbnailing a non-image file.');
|
||||
chmod 0, $thumbStore->getPath('square.png');
|
||||
|
||||
SKIP: {
|
||||
skip "Root will cause this test to fail since it does not obey file permissions", 3
|
||||
if $< == 0;
|
||||
ok(! -r $thumbStore->getPath('square.png'), 'Made square.png not readable');
|
||||
is($thumbStore->generateThumbnail('square.png'), 0,
|
||||
'generateThumbnail returns 0 if there are errors reading the file');
|
||||
like($WebGUI::Test::logger_error, qr/^Couldn't read image for thumbnail creation: (.+)$/,
|
||||
'generateThumbnail when it cannot read the file for thumbnailing');
|
||||
chmod oct(644), $thumbStore->getPath('square.png');
|
||||
}
|
||||
|
||||
ok(-r $thumbStore->getPath('square.png'), 'Made square.png readable again');
|
||||
ok($thumbStore->generateThumbnail('square.png', 50), 'generateThumbnail returns true when there are no problems');
|
||||
ok(-e $thumbStore->getPath('thumb-square.png'), 'thumbnail exists in right place with correct name');
|
||||
|
||||
|
||||
####################################################
|
||||
#
|
||||
# getSizeInPixels
|
||||
#
|
||||
####################################################
|
||||
|
||||
cmp_bag([$thumbStore->getSizeInPixels('square.png')], [500,500], 'getSizeInPixels on original file');
|
||||
cmp_bag([$thumbStore->getSizeInPixels('thumb-square.png')], [50,50], 'getSizeInPixels on thumb');
|
||||
|
||||
is($thumbStore->getSizeInPixels(), 0, 'getSizeInPixels returns only a zero if no file is sent');
|
||||
is($WebGUI::Test::logger_error, q/Can't check the size when you haven't specified a file./, 'getSizeInPixels logs an error message for not sending a filename');
|
||||
|
||||
is($thumbStore->getSizeInPixels('noImage.txt'), 0, 'getSizeInPixels returns only a zero if sent a non-image file');
|
||||
is($WebGUI::Test::logger_error, q/Can't check the size of something that's not an image./, 'getSizeInPixels logs an error message for sending a non-image filename');
|
||||
|
||||
is($thumbStore->getSizeInPixels('noImage.gif'), 0, 'getSizeInPixels returns only a zero if sent a file that does not exist');
|
||||
like($WebGUI::Test::logger_error, qr/^Couldn't read image to check the size of it./, 'getSizeInPixels logs an error message for reading a file that does not exist');
|
||||
|
||||
####################################################
|
||||
#
|
||||
# copy
|
||||
#
|
||||
####################################################
|
||||
|
||||
my $imageCopy = $thumbStore->copy();
|
||||
WebGUI::Test->addToCleanup($imageCopy);
|
||||
isa_ok($imageCopy, 'WebGUI::Storage', 'copy returns an object');
|
||||
cmp_bag(
|
||||
$imageCopy->getFiles(),
|
||||
['square.png'],
|
||||
'copy copied the original file',
|
||||
);
|
||||
ok(-e $imageCopy->getPath('thumb-square.png'), 'copy also copied the thumbnail');
|
||||
|
||||
####################################################
|
||||
#
|
||||
# deleteFiles
|
||||
#
|
||||
####################################################
|
||||
|
||||
is($imageCopy->deleteFile('square.png'), 1, 'deleteFile only reports 1 file deleted');
|
||||
|
||||
cmp_bag(
|
||||
$imageCopy->getFiles(),
|
||||
[qw()],
|
||||
'delete deleted the file',
|
||||
);
|
||||
ok(!-e $imageCopy->getPath('thumb-square.png'), 'deleteFile also deleted the thumbnail');
|
||||
|
||||
is($imageCopy->deleteFile('../../'), undef, 'deleteFile in Storage::Image also returns undef if you try to delete a file outside of this storage object');
|
||||
|
||||
####################################################
|
||||
#
|
||||
# getThumbnailUrl
|
||||
#
|
||||
####################################################
|
||||
|
||||
is($thumbStore->getThumbnailUrl(), '', 'getThumbnailUrl returns undef if no file is sent');
|
||||
is($WebGUI::Test::logger_error, q/Can't find a thumbnail url without a filename./, 'getThumbnailUrl logs an error message for not sending a filename');
|
||||
|
||||
is($thumbStore->getThumbnailUrl('round.png'), '', 'getThumbnailUrl returns undef if the requested file is not in the storage location');
|
||||
is($WebGUI::Test::logger_error, q/Can't find a thumbnail for a file named 'round.png' that is not in my storage location./, 'getThumbnailUrl logs an error message for not sending a filename');
|
||||
|
||||
is($thumbStore->getThumbnailUrl('square.png'), $thumbStore->getUrl('thumb-square.png'), 'getThumbnailUrl returns the correct url');
|
||||
|
||||
is($thumbStore->getThumbnailUrl('file.pdf'), '', '... return empty string for a file that is not an image');
|
||||
|
||||
####################################################
|
||||
#
|
||||
# adjustMaxImageSize
|
||||
#
|
||||
####################################################
|
||||
|
||||
my $origMaxImageSize = $session->setting->get('maxImageSize');
|
||||
|
||||
my $sizeTest = WebGUI::Storage->create($session);
|
||||
WebGUI::Test->addToCleanup($sizeTest);
|
||||
|
||||
my $resizeTarget = 80;
|
||||
$session->setting->set('maxImageSize', 200 );
|
||||
my @testImages = (
|
||||
{
|
||||
filename => 'tooWide.gif',
|
||||
origWidth => 100,
|
||||
origHeight => 50,
|
||||
newWidth => 80,
|
||||
newHeight => 40,
|
||||
},
|
||||
{
|
||||
filename => 'tooTall.gif',
|
||||
origWidth => 50,
|
||||
origHeight => 100,
|
||||
newWidth => 40,
|
||||
newHeight => 80,
|
||||
}
|
||||
);
|
||||
|
||||
foreach my $testImage (@testImages) {
|
||||
$sizeTest->addFileFromFilesystem(
|
||||
WebGUI::Test->getTestCollateralPath($testImage->{filename})
|
||||
);
|
||||
}
|
||||
|
||||
cmp_bag(
|
||||
$sizeTest->getFiles(),
|
||||
[ map { $_->{filename} } @testImages ],
|
||||
'all files added to storage object for testing adjustMaxImageSize'
|
||||
);
|
||||
|
||||
|
||||
foreach my $testImage (@testImages) {
|
||||
my $filename = $testImage->{ filename };
|
||||
is($sizeTest->adjustMaxImageSize($filename), 0, "$filename does not need to be resized");
|
||||
cmp_bag(
|
||||
[ $sizeTest->getSizeInPixels($filename) ],
|
||||
[ @{ $testImage }{qw/origHeight origWidth/} ],
|
||||
"$filename was not resized"
|
||||
);
|
||||
}
|
||||
|
||||
$session->setting->set('maxImageSize', $resizeTarget );
|
||||
foreach my $testImage (@testImages) {
|
||||
my $filename = $testImage->{ filename };
|
||||
is($sizeTest->adjustMaxImageSize($filename), 1, "$filename needs to be resized");
|
||||
my @newSize = $sizeTest->getSizeInPixels($filename);
|
||||
cmp_bag(
|
||||
[ $sizeTest->getSizeInPixels($filename) ],
|
||||
[ @{ $testImage }{qw/newHeight newWidth/} ],
|
||||
"$filename was resized properly"
|
||||
);
|
||||
}
|
||||
|
||||
$session->setting->set('maxImageSize', $origMaxImageSize );
|
||||
|
||||
####################################################
|
||||
#
|
||||
# rotate
|
||||
#
|
||||
####################################################
|
||||
|
||||
my $rotateTest = WebGUI::Storage->create( $session );
|
||||
WebGUI::Test->addToCleanup($rotateTest);
|
||||
|
||||
# Add test image to the storage
|
||||
ok( $rotateTest->addFileFromFilesystem(WebGUI::Test->getTestCollateralPath("rotation_test.png")), "Can add test image to storage" );
|
||||
|
||||
# Rotate test image by 90° CW
|
||||
my $file = $rotateTest->getFiles->[0];
|
||||
$rotateTest->rotate($file, 90);
|
||||
# Check dimensions
|
||||
cmp_bag( [$rotateTest->getSizeInPixels( $file )], [2,3], "Check size of photo after rotating 90° CW" );
|
||||
# Check pixels
|
||||
my $image = Image::Magick->new;
|
||||
$image->Read( $rotateTest->getPath($file) );
|
||||
is( $image->GetPixel(x=>2, y=>0), 0, "Pixel at location [2,0] should be black" );
|
||||
|
||||
# Rotate test image by 90° CCW
|
||||
my $file = $rotateTest->getFiles->[0];
|
||||
$rotateTest->rotate($file, -90);
|
||||
# Check dimensions
|
||||
cmp_bag( [$rotateTest->getSizeInPixels( $file )], [3,2], "Check size of photo after rotating 90° CCW" );
|
||||
# Check pixels
|
||||
$image = Image::Magick->new;
|
||||
$image->Read( $rotateTest->getPath($file) );
|
||||
is( $image->GetPixel(x=>0, y=>0), 0, "Pixel at location [0,0] should be black" );
|
||||
|
||||
|
||||
|
||||
TODO: {
|
||||
local $TODO = "Methods that need to be tested";
|
||||
ok(0, 'resize');
|
||||
}
|
||||
74
t/Storage/utf8_filenames.t
Normal file
74
t/Storage/utf8_filenames.t
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
#-------------------------------------------------------------------
|
||||
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
|
||||
#-------------------------------------------------------------------
|
||||
# Please read the legal notices (docs/legal.txt) and the license
|
||||
# (docs/license.txt) that came with this distribution before using
|
||||
# this software.
|
||||
#-------------------------------------------------------------------
|
||||
# http://www.plainblack.com info@plainblack.com
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
#The goal of this test is to checkout uft8 handling in filenames.
|
||||
|
||||
use utf8;
|
||||
use FindBin;
|
||||
use strict;
|
||||
use lib "$FindBin::Bin/..//lib";
|
||||
|
||||
use WebGUI::Test;
|
||||
use WebGUI::Session;
|
||||
use WebGUI::Storage;
|
||||
|
||||
use Test::More;
|
||||
use Test::Deep;
|
||||
use Encode;
|
||||
use Cwd ();
|
||||
|
||||
my $session = WebGUI::Test->session;
|
||||
|
||||
plan tests => 4;
|
||||
|
||||
my $storage = WebGUI::Storage->create($session);
|
||||
WebGUI::Test->addToCleanup($storage);
|
||||
|
||||
my $filename = "Viel_Spa\x{00DF}.txt";
|
||||
utf8::upgrade($filename);
|
||||
$storage->addFileFromScalar($filename, 'some content');
|
||||
ok -e $storage->getPath($filename), 'addFileFromScalar: wrote filename with UTF-8 name';
|
||||
|
||||
my $filesystem_storage = WebGUI::Storage->create($session);
|
||||
WebGUI::Test->addToCleanup($filesystem_storage);
|
||||
|
||||
$filesystem_storage->addFileFromFilesystem($storage->getPath($filename));
|
||||
ok -e $filesystem_storage->getPath($filename), 'addFileFromFilesystem: brought file over with UTF-8 name';
|
||||
|
||||
cmp_deeply(
|
||||
$filesystem_storage->getFiles(),
|
||||
[ $filename ],
|
||||
'getFiles: returns names in UTF-8'
|
||||
);
|
||||
|
||||
my $copy_name = "Ca\x{0303}on.txt";
|
||||
utf8::upgrade($copy_name);
|
||||
$filesystem_storage->copyFile($filename, $copy_name);
|
||||
|
||||
cmp_bag(
|
||||
$filesystem_storage->getFiles(),
|
||||
[ $filename, $copy_name ],
|
||||
'copyFile: copies files handling UTF-8 correctly'
|
||||
)
|
||||
or diag(
|
||||
"GOT: " . join( ', ', map { nice_string($_) } @{ $filesystem_storage->getFiles } )
|
||||
. " EXPECT: " . join( ', ', map { nice_string($_) } ( $filename, $copy_name ) )
|
||||
);
|
||||
|
||||
sub nice_string {
|
||||
join("",
|
||||
map { $_ > 255 ? # if wide character...
|
||||
sprintf('\\x{%04X}', $_) : # \x{...}
|
||||
chr($_) =~ /[[:cntrl:]]/ ? # else if control character ...
|
||||
sprintf('\\x%02X', $_) : # \x..
|
||||
quotemeta(chr($_)) # else quoted or as themselves
|
||||
} unpack("W*", $_[0])); # unpack Unicode characters
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue