File: basic.t

package info (click to toggle)
libhtml-formhandler-perl 0.40057-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,320 kB
  • ctags: 685
  • sloc: perl: 8,849; makefile: 2
file content (167 lines) | stat: -rw-r--r-- 4,473 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
use strict;
use warnings;
use Test::More;

use_ok( 'HTML::FormHandler' );
use HTML::FormHandler::I18N;
$ENV{LANGUAGE_HANDLE} = 'en_en';

{
   package My::Form;
   use Moose;
   extends 'HTML::FormHandler';
   has '+name' => ( default => 'testform_' );
   sub field_list {
       return [
           reqname     => {
              type => 'Text',
              required => 1,
              messages => { required => 'You must supply a reqname' },
           },
           fruit       => 'Select',
           optname     => 'Text',
           silly_name  => {
              type =>'Text',
              set_validate => 'valid_silly'
           }
       ];
   }
   sub options_fruit {
       return (
           1   => 'apples',
           2   => 'oranges',
           3   => 'kiwi',
       );
   }
   sub valid_silly
   {
      my ( $self, $field ) = @_;
      $field->add_error( 'Not a valid silly_name' )
            unless $field->value eq 'TeStInG';
   }
}

my $form = My::Form->new;

my $bad_1 = {
    optname => 'not req',
    fruit   => 4,
    silly_name => 'what??',
};

ok( !$form->process( $bad_1 ), 'bad 1' );

ok( $form->has_errors, 'form has error' );

my $errors_by_id = {
    fruit => [q{'4' is not a valid value}],
    reqname => ['You must supply a reqname'],
    silly_name => ['Not a valid silly_name'],
};
is_deeply( $form->errors_by_id, $errors_by_id, 'right errors' );
is_deeply( $form->errors_by_name, $errors_by_id, 'errors by name are the same as by id');

ok( $form->field('fruit')->has_errors, 'fruit has error' );

ok( $form->field('reqname')->has_errors, 'reqname has error' );

ok( !$form->field('optname')->has_errors, 'optname has no error' );
ok( $form->field('silly_name')->has_errors, 'silly_name has error' );
ok( $form->has_errors, 'form has errors' );

my @fields = $form->error_fields;
ok( @fields, 'error fields' );

my @errors = $form->errors;
is_deeply( \@errors, [
                     'You must supply a reqname',
                     '\'4\' is not a valid value',
                     'Not a valid silly_name' ],
     'errors from form' );

is( $form->num_errors, 3, 'number of errors' );

my @field_names = $form->error_field_names;
is_deeply( \@field_names,
           [ 'reqname', 'fruit', 'silly_name' ],
           'error field names' );

is( $form->field('fruit')->id, "fruit", 'field has id' );

{
   package Repeatable::Form;
   use HTML::FormHandler::Moose;
   extends 'HTML::FormHandler';

   has_field 'my_test';
   has_field 'addresses' => ( type => 'Repeatable', auto_id => 1 );
   has_field 'addresses.street';
   has_field 'addresses.city';
   has_field 'addresses.country';

   sub validate_addresses_city
   {
      my ( $self, $field ) = @_;
      $field->add_error("Invalid City: " . $field->value)
         if( $field->value !~ /City/ );
   }
}

my $init_object = {
   my_test => 'repeatable_errors',
   addresses => [
      {
         street => 'First Street',
         city => 'Prime',
         country => 'Utopia',
         id => 0,
      },
      {
         street => 'Second Street',
         city => 'Secondary',
         country => 'Graustark',
         id => 1,
      },
      {
         street => 'Third Street',
         city => 'Tertiary City',
         country => 'Atlantis',
         id => 2,
      }
   ]
};

$form = Repeatable::Form->new;
ok( $form, 'form created');
$form->process( $init_object );
ok( !$form->validated, 'form did not validate' );
is( $form->num_errors, 2, 'form has two errors' );
my $rendered_field = $form->field('addresses')->render;
ok( $rendered_field, 'rendered field with auto_id ok' );

{
    package Form;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has_field 'foo' => ( type => 'Repeatable', required => 1);
    has_field 'foo.bar' => ( type => 'Text', required => 1);
    has_field 'foo.optional' => ( type => 'Text', required => 0);
}

$form = Form->new;

ok(!$form->process( params => { 'foo.0.bar' => '' , 'foo.1.bar' => '' }),
   'Processing a form with empty fields should not validate');

ok(!$form->process( params => { 'foo.0.bar' => '' , 'foo.1.bar' => 'Test' }),
   'Processing a form with some empty fields should not validate');

ok(!$form->process( params => { 'foo.0.bar' => 'Test' , 'foo.1.bar' => '' }),
   'Processing a form with some empty fields should not validate');

ok($form->process( params => { 'foo.0.bar' => 'Test' , 'foo.1.bar' => 'Test' }),
   'Processing a form with all inputs validates');


done_testing;