use strict;
use warnings;
use Test::More;
{
package Test::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has 'secret' => ( is => 'rw', default => 'wrong' );
has_field 'foo';
has_field 'bar';
sub validate_foo {
my ( $self, $field ) = @_;
$field->add_error('Not a valid foo')
if( $field->value eq 'test' );
}
sub validate_bar {
my ( $self, $field ) = @_;
$field->add_error('Not a valid bar')
if( $field->value eq 'bad_bar' );
}
sub validate {
my $self = shift;
$self->add_form_error('Try again')
if( $self->field('foo')->value ne $self->secret );
}
}
my $form = Test::Form->new;
ok( $form, 'form builds' );
$form->process( params => {} );
my $params = {
foo => 'test',
bar => 'bad_bar',
};
$form->process( secret => 'yikes', params => $params );
ok( !$form->validated, 'form did not validate' );
$form->process( secret => 'my_bar', params => { bar => 'my_bar', foo => 'my_foo' } );
my @errors = $form->errors;
is( $errors[0], 'Try again', 'form error' );
$form->process( secret => 'my_foo', params => { bar => 'my_bar', foo => 'my_foo' } );
ok( $form->validated, 'form validated' );
ok( !$form->has_form_errors, 'form errors are gone' );
done_testing;