The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;