/t/structured.t
http://github.com/gshank/html-formhandler · Raku · 144 lines · 125 code · 11 blank · 8 comment · 0 complexity · 00312799b4eaa5430dbaffb2aee2e14a MD5 · raw file
- 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;