PageRenderTime 23ms CodeModel.GetById 2ms app.highlight 18ms RepoModel.GetById 1ms app.codeStats 0ms

/t/structured.t

http://github.com/gshank/html-formhandler
Unknown | 144 lines | 133 code | 11 blank | 0 comment | 0 complexity | 00312799b4eaa5430dbaffb2aee2e14a MD5 | raw file
  1use strict;
  2use warnings;
  3use Test::More;
  4
  5
  6my $struct = {
  7   username => 'Joe Blow',
  8   occupation => 'Programmer',
  9   tags => ['Perl', 'programming', 'Moose' ],
 10   employer => {
 11      name => 'TechTronix',
 12      country => 'Utopia',
 13   },
 14   options => {
 15      flags => {
 16         opt_in => 1,
 17         email => 0,
 18      },
 19      cc_cards => [
 20         {
 21            type => 'Visa',
 22            number => '4248999900001010',
 23         },
 24         {
 25            type => 'MasterCard',
 26            number => '4335992034971010',
 27         },
 28      ],
 29   },
 30   addresses => [
 31      {
 32         street => 'First Street',
 33         city => 'Prime City',
 34         country => 'Utopia',
 35         id => 0,
 36      },
 37      {
 38         street => 'Second Street',
 39         city => 'Secondary City',
 40         country => 'Graustark',
 41         id => 1,
 42      },
 43      {
 44         street => 'Third Street',
 45         city => 'Tertiary City',
 46         country => 'Atlantis',
 47         id => 2,
 48      }
 49   ]
 50};
 51
 52
 53{
 54   package Structured::Form;
 55   use HTML::FormHandler::Moose;
 56   extends 'HTML::FormHandler';
 57
 58   has_field 'username';
 59   has_field 'occupation';
 60   has_field 'tags' => ( type => 'Repeatable' );
 61   has_field 'tags.contains' => ( type => 'Text' );
 62   has_field 'employer' => ( type => 'Compound' );
 63   has_field 'employer.name';
 64   has_field 'employer.country';
 65   has_field 'options' => ( type => 'Compound' );
 66   has_field 'options.flags' => ( type => 'Compound' );
 67   has_field 'options.flags.opt_in' => ( type => 'Boolean' );
 68   has_field 'options.flags.email' => ( type => 'Boolean' );
 69   has_field 'options.cc_cards' => ( type => 'Repeatable' );
 70   has_field 'options.cc_cards.type';
 71   has_field 'options.cc_cards.number';
 72   has_field 'addresses' => ( type => 'Repeatable' );
 73   has_field 'addresses.street';
 74   has_field 'addresses.city';
 75   has_field 'addresses.country';
 76   has_field 'addresses.id';
 77
 78}
 79
 80#===========
 81# test structured params
 82my $form = Structured::Form->new;
 83ok( $form, 'form created' );
 84$form->process( params => $struct );
 85is( $form->result->num_results, 6, 'correct number of results' );
 86ok( $form->validated, 'form validated');
 87is_deeply( $form->field('tags')->value, ['Perl', 'programming', 'Moose' ],
 88   'list field tags has right values' );
 89is( $form->field('addresses.0.city')->value, 'Prime City', 'get address field OK' );
 90is( $form->field('options.flags.opt_in')->value, 1, 'get opt_in flag');
 91#============
 92# test structured init_object/item
 93my $form2 = Structured::Form->new;
 94ok( $form2, 'form created' );
 95$form2->process( init_object => $struct, params => {} );
 96is( $form2->result->num_results, 6, 'correct number of results' );
 97ok( !$form2->validated, 'form validated');
 98is_deeply( $form2->field('employer')->item, { name => 'TechTronix', country => 'Utopia', }, 'has item');
 99is_deeply( $form2->field('addresses')->item, $struct->{addresses}, 'item for repeatable' );
100#=============
101
102my $fif = {
103   'addresses.0.city' => 'Prime City',
104   'addresses.0.country' => 'Utopia',
105   'addresses.0.id' => 0,
106   'addresses.0.street' => 'First Street',
107   'addresses.1.city' => 'Secondary City',
108   'addresses.1.country' => 'Graustark',
109   'addresses.1.id' => 1,
110   'addresses.1.street' => 'Second Street',
111   'addresses.2.city' => 'Tertiary City',
112   'addresses.2.country' => 'Atlantis',
113   'addresses.2.id' => 2,
114   'addresses.2.street' => 'Third Street',
115   'employer.country' => 'Utopia',
116   'employer.name' => 'TechTronix',
117   'occupation' => 'Programmer',
118   'options.cc_cards.0.number' => '4248999900001010',
119   'options.cc_cards.0.type' => 'Visa',
120   'options.cc_cards.1.number' => '4335992034971010',
121   'options.cc_cards.1.type' => 'MasterCard',
122   'options.flags.email' => 0,
123   'options.flags.opt_in' => 1,
124   'tags.0' => 'Perl',
125   'tags.1' => 'programming',
126   'tags.2' => 'Moose',
127   'username' => 'Joe Blow'
128};
129
130#=========
131is_deeply( $form->fif, $fif, 'fif is correct' );
132$form->process( $fif );
133ok( $form->validated, 'form processed from fif' );
134is_deeply( $form->values, $struct, 'values round-tripped from fif');
135
136#=========
137# works with item and params
138$form2->process( item => $struct, params => $fif );
139ok( $form2->validated, 'form processed from fif' );
140is( $form2->result->num_results, 6, 'correct number of results' );
141is_deeply( $form2->field('employer')->item, { name => 'TechTronix', country => 'Utopia', }, 'has item');
142is_deeply( $form2->field('addresses')->item, $struct->{addresses}, 'item for repeatable' );
143
144done_testing;