1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
use strict;
use warnings;
use Test::More;
use HTML::FormHandler::Test;
use_ok('HTML::FormHandler::Field::Upload');
use HTML::FormHandler::I18N;
$ENV{LANGUAGE_HANDLE} = 'en_en';
{
package Mock::Upload;
use Moose;
use File::Copy ();
use IO::File ();
use File::Spec::Unix;
has filename => ( is => 'rw' );
has size => ( is => 'rw' );
has tempname => ( is => 'rw', lazy_build => 1 );
has basename => ( is => 'ro', lazy_build => 1 );
has tmpdir => ( is => 'ro', default => '' );
has fh => ( is => 'rw', required => 1, lazy_build => 1 );
sub _build_fh {
my $self = shift;
my $fh = IO::File->new( $self->tempname, IO::File::O_RDONLY );
unless ( defined $fh ) {
my $filename = $self->tempname;
die "Can't open '$filename': '$!'";
}
return $fh;
}
sub _build_tempname {
my $self = shift;
return $self->tmpdir . $self->basename;
}
sub _build_basename {
my $self = shift;
my $basename = $self->filename;
$basename =~ s|\\|/|g;
$basename = ( File::Spec::Unix->splitpath($basename) )[2];
$basename =~ s|[^\w\.-]+|_|g;
return $basename;
}
sub copy_to {
my $self = shift;
return File::Copy::copy( $self->tempname, @_ );
}
sub link_to {
my ( $self, $target ) = @_;
return CORE::link( $self->tempname, $target );
}
sub slurp {
my ( $self, $layer ) = @_;
unless ($layer) {
$layer = ':raw';
}
my $content = undef;
my $handle = $self->fh;
binmode( $handle, $layer );
while ( $handle->sysread( my $buffer, 8192 ) ) {
$content .= $buffer;
}
return $content;
}
}
{
package My::Form::Upload;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has '+enctype' => ( default => 'multipart/form-data');
has_field 'file' => ( type => 'Upload' );
has_field 'submit' => ( type => 'Submit', value => 'Upload' );
}
my $form = My::Form::Upload->new;
ok( $form, 'created form with upload field' );
is_html( $form->field('file')->render, '
<div><label for="file">File</label><input type="file" name="file" id="file" /></div>',
'renders ok' );
my $upload = Mock::Upload->new( filename => 'test.txt', size => 1024 );
$form->process( params => { file => $upload } );
ok( $form->validated, 'form validated' );
$upload->size( 20000000 );
$form->process( params => { file => $upload } );
ok( !$form->validated, 'form did not validate' );
# file exists, is empty
`touch temp.txt`;
open ( my $fh, '>', 'temp.txt' );
$form->process( params => { file => $fh } );
my @errors = $form->errors;
is( $errors[0], 'File uploaded is empty', 'empty file fails' );
# file exists, is not empty
print {$fh} "testing\n";
close( $fh );
open ( $fh, '<', 'temp.txt' );
$form->process( params => { file => $fh } );
ok( $form->validated, 'form validated' );
# file doesn't exist
$form->process( params => { file => 'not_there.txt' } );
@errors = $form->errors;
is( $errors[0], 'File not found for upload field', 'error when file does not exist' );
unlink('temp.txt');
{
package My::Form::Upload::NoSize;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has '+enctype' => ( default => 'multipart/form-data');
has_field 'file' => ( type => 'Upload', min_size => undef, max_size => undef );
has_field 'submit' => ( type => 'Submit', value => 'Upload' );
}
$form = My::Form::Upload::NoSize->new;
$upload = Mock::Upload->new( filename => 'test.txt', size => 4000000 );
$form->process( params => { file => $upload } );
ok( $form->validated, 'form validated with no size limit' );
done_testing;
|