use strict;
use warnings;
use Test::More;
use HTML::FormHandler::I18N;
$ENV{LANGUAGE_HANDLE} = HTML::FormHandler::I18N->get_handle('en_en');
use_ok('HTML::FormHandler');
{
package My::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has '+name' => ( default => 'testform_' );
has '+no_preload' => ( default => 1 );
has_field 'optname' => ( temp => 'First' );
has_field 'reqname' => ( required => 1 );
has_field 'somename';
has_field 'my_selected' => ( type => 'Checkbox' );
has_field 'must_select' => ( type => 'Checkbox', required => 1 );
sub field_list
{
return [
fruit => 'Select',
optname => { temp => 'Second' }
];
}
sub options_fruit
{
return (
1 => 'apples',
2 => 'oranges',
3 => 'kiwi',
);
}
}
my $form = My::Form->new;
is( $form->field('optname')->temp, 'Second', 'got second optname field' );
ok( !$form->process, 'Empty data' );
is_deeply( $form->value, {}, 'no values returns hashref');
my $good = {
reqname => 'hello',
optname => 'not req',
fruit => 2,
must_select => 1,
};
ok( $form->process($good), 'Good data' );
is( $form->field('somename')->value, undef, 'no value for somename' );
ok( !$form->field('somename')->has_value, 'predicate no value' );
$good->{somename} = 'testing';
$form->process($good);
is( $form->field('somename')->value, 'testing', 'use input for extra data' );
is( $form->field('my_selected')->value, 0, 'correct value for unselected checkbox' );
ok( !$form->process( {} ), 'form doesn\'t validate with empty params' );
is( $form->num_errors, 0, 'form doesn\'t have errors with empty params' );
my $bad_1 = {
reqname => '',
optname => 'not req',
fruit => 4,
};
ok( !$form->process($bad_1), 'bad 1' );
ok( $form->field('fruit')->has_errors, 'fruit has error' );
ok( $form->field('reqname')->has_errors, 'reqname has error' );
ok( $form->field('must_select')->has_errors, 'must_select has error' );
ok( !$form->field('optname')->has_errors, 'optname has no error' );
is( $form->field('fruit')->id, "fruit", 'field has id' );
is( $form->field('fruit')->label, 'Fruit', 'field label' );
ok( !$form->process( {} ), 'no leftover params' );
is( $form->num_errors, 0, 'no leftover errors' );
ok( !$form->field('reqname')->has_errors, 'no leftover error in field' );
ok( !$form->field('optname')->fif, 'no lefover fif values' );
my $init_object = {
reqname => 'Starting Perl',
optname => 'Over Again'
};
# if you're going to load something on new and expect it to work without
# process, you need to have no_preload turned off
$form = My::Form->new( init_object => $init_object, no_preload => 0 );
is( $form->field('optname')->value, 'Over Again', 'value with int_obj' );
$form->process( params => {} );
my $value = $form->value;
ok( !$form->validated, 'form validated' );
# it's not crystal clear what the behavior should be here, but I think
# this is more correct than the previous behavior
# it fills in the missing fields, which is what always happened for an
# initial object (as opposed to hash), but it used to behave
# differently for a hash, which seems wrong
# TODO verify behavior is correct
my $init_obj_plus_defaults = {
'fruit' => undef,
'must_select' => 0,
'my_selected' => 0,
'optname' => 'Over Again',
'reqname' => 'Starting Perl',
'somename' => undef,
};
is_deeply( $form->value, $init_obj_plus_defaults, 'value with empty params' );
$init_object->{my_selected} = 0; # checkboxes must be forced to 0
my %fif = %$init_object;
$fif{somename} = '';
$fif{fruit} = '';
$fif{must_select} = 0;
is_deeply( $form->fif, \%fif, 'get right fif with init_object' );
# make sure that checkbox is 0 in values
$init_object->{must_select} = 1;
$fif{must_select} = 1;
ok( $form->process($init_object), 'form validates with params' );
#my %init_obj_value = (%$init_object, fruit => undef );
#is_deeply( $form->value, \%init_obj_value, 'value init obj' );
$init_object->{fruit} = undef;
is_deeply( $form->value, $init_object, 'value init obj' );
is_deeply( $form->fif, \%fif, 'get right fif with init_object' );
$form->clear;
ok( !$form->has_value, 'Form value cleared' );
ok( !$form->has_input, 'Form input cleared' );
# check that form is cleared if fif is done before process
$form->fif;
$form->process($init_object);
is_deeply( $form->fif, \%fif, 'get right fif when process preceded by fif');
$form = HTML::FormHandler->new( field_list => [ foo => { type => 'Text', required => 1 } ] );
if ( !$form->process( params => { bar => 1, } ) )
{
# On some versions, the above process() returned false, but
# error_fields did not return anything.
my @fields = $form->error_fields;
if ( is( scalar @fields, 1, "there is an error field" ) )
{
my @errors = $fields[0]->all_errors;
is( scalar @errors, 1, "there is an error" );
is( $errors[0], $fields[0]->label . " field is required", "error messages match" );
}
else
{
fail("there is an error");
fail("error messages match");
}
}
# 'image' input produces { foo => bar, 'foo.x' => 42, 'foo.y' => 23 }
$form = HTML::FormHandler->new( name => 'baz', html_prefix => 1, field_list => [ 'foo' ] );
eval{ $form->process( params => { 'baz.foo' => 'bar', 'baz.foo.x' => 42, 'baz.foo.y' => 23 } ) };
ok( !$@, 'image field processed' ) or diag $@;
is_deeply( $form->field( 'foo' )->value, { '' => 'bar', x => 42, y => 23 }, 'image field' );
{
package Test::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has_field 'foo';
has_field 'bar';
sub validate {
my $self = shift;
if( $self->field('foo')->value eq 'cow' ) {
$self->field('foo')->value('bovine');
}
}
}
$form = Test::Form->new;
$form->process( { foo => 'cow', bar => 'horse' } );
is_deeply( $form->value, { foo => 'bovine', bar => 'horse' }, 'correct value' );
# check for hashref constructor
$form = HTML::FormHandler->new( { name => 'test_form', field_list => { one => 'Text', two => 'Text' } } );
ok( $form, 'form constructed ok' );
done_testing;