use strict;
use warnings;
use Test::More;
my $struct = {
username => 'Joe Blow',
occupation => 'Programmer',
tags => ['Perl', 'programming', 'Moose' ],
employer => {
name => 'TechTronix',
country => 'Utopia',
},
options => {
flags => {
opt_in => 1,
email => 0,
},
cc_cards => [
{
type => 'Visa',
number => '4248999900001010',
},
{
type => 'MasterCard',
number => '4335992034971010',
},
],
},
addresses => [
{
street => 'First Street',
city => 'Prime City',
country => 'Utopia',
id => 0,
},
{
street => 'Second Street',
city => 'Secondary City',
country => 'Graustark',
id => 1,
},
{
street => 'Third Street',
city => 'Tertiary City',
country => 'Atlantis',
id => 2,
}
]
};
{
package Structured::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has_field 'username';
has_field 'occupation';
has_field 'tags' => ( type => 'Repeatable' );
has_field 'tags.contains' => ( type => 'Text' );
has_field 'employer' => ( type => 'Compound' );
has_field 'employer.name';
has_field 'employer.country';
has_field 'options' => ( type => 'Compound' );
has_field 'options.flags' => ( type => 'Compound' );
has_field 'options.flags.opt_in' => ( type => 'Boolean' );
has_field 'options.flags.email' => ( type => 'Boolean' );
has_field 'options.cc_cards' => ( type => 'Repeatable' );
has_field 'options.cc_cards.type';
has_field 'options.cc_cards.number';
has_field 'addresses' => ( type => 'Repeatable' );
has_field 'addresses.street';
has_field 'addresses.city';
has_field 'addresses.country';
has_field 'addresses.id';
}
#===========
# test structured params
my $form = Structured::Form->new;
ok( $form, 'form created' );
$form->process( params => $struct );
is( $form->result->num_results, 6, 'correct number of results' );
ok( $form->validated, 'form validated');
is_deeply( $form->field('tags')->value, ['Perl', 'programming', 'Moose' ],
'list field tags has right values' );
is( $form->field('addresses.0.city')->value, 'Prime City', 'get address field OK' );
is( $form->field('options.flags.opt_in')->value, 1, 'get opt_in flag');
#============
# test structured init_object/item
my $form2 = Structured::Form->new;
ok( $form2, 'form created' );
$form2->process( init_object => $struct, params => {} );
is( $form2->result->num_results, 6, 'correct number of results' );
ok( !$form2->validated, 'form validated');
is_deeply( $form2->field('employer')->item, { name => 'TechTronix', country => 'Utopia', }, 'has item');
is_deeply( $form2->field('addresses')->item, $struct->{addresses}, 'item for repeatable' );
#=============
my $fif = {
'addresses.0.city' => 'Prime City',
'addresses.0.country' => 'Utopia',
'addresses.0.id' => 0,
'addresses.0.street' => 'First Street',
'addresses.1.city' => 'Secondary City',
'addresses.1.country' => 'Graustark',
'addresses.1.id' => 1,
'addresses.1.street' => 'Second Street',
'addresses.2.city' => 'Tertiary City',
'addresses.2.country' => 'Atlantis',
'addresses.2.id' => 2,
'addresses.2.street' => 'Third Street',
'employer.country' => 'Utopia',
'employer.name' => 'TechTronix',
'occupation' => 'Programmer',
'options.cc_cards.0.number' => '4248999900001010',
'options.cc_cards.0.type' => 'Visa',
'options.cc_cards.1.number' => '4335992034971010',
'options.cc_cards.1.type' => 'MasterCard',
'options.flags.email' => 0,
'options.flags.opt_in' => 1,
'tags.0' => 'Perl',
'tags.1' => 'programming',
'tags.2' => 'Moose',
'username' => 'Joe Blow'
};
#=========
is_deeply( $form->fif, $fif, 'fif is correct' );
$form->process( $fif );
ok( $form->validated, 'form processed from fif' );
is_deeply( $form->values, $struct, 'values round-tripped from fif');
#=========
# works with item and params
$form2->process( item => $struct, params => $fif );
ok( $form2->validated, 'form processed from fif' );
is( $form2->result->num_results, 6, 'correct number of results' );
is_deeply( $form2->field('employer')->item, { name => 'TechTronix', country => 'Utopia', }, 'has item');
is_deeply( $form2->field('addresses')->item, $struct->{addresses}, 'item for repeatable' );
done_testing;