use strict; use warnings; use Test::More; use_ok('HTML::FormHandler::Field::Upload'); { 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' ); has basename => ( is => 'ro', lazy_build => 1 ); has fh => ( is => 'rw', required => 1, lazy => 1, default => sub { 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_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( $form->field('file')->render, ' <div><label class="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' ); done_testing;