1use strict;
2use warnings;
3
4use Test::More tests => 4;
5
6use HTML::FormFu;
7
8my $form = HTML::FormFu->new(
9    { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } );
10
11$form->element('Checkbox')->name('bar')->value('y');
12
13$form->auto_fieldset(1);
14
15$form->default_model('HashRef');
16
17$form->populate(
18    {   elements => [
19            {   type         => "DateTime",
20                name         => "datetime",
21                auto_inflate => 1,
22                year         => { list => [1999] }
23            },
24            {   name     => "inflator",
25                deflator => { type => 'Strftime', strftime => '%F %H:%M' },
26                inflator =>
27                    { type => "DateTime", parser => { strptime => '%F' } }
28            },
29            {   type        => "Repeatable",
30                nested_name => "many",
31                elements    => [
32                    { name => "id" },
33                    {   type     => "Block",
34                        name     => "nested",
35                        elements => [ { type => "Text", name => "foo" } ] } ]
36            },
37            {   type    => "Select",
38                name    => "single-select",
39                options => [ [qw(1 foo)], [qw(2 bar)] ]
40            },
41            {   type    => "Select",
42                name    => "multi-select",
43                options => [ [qw(1 foo)], [qw(2 bar)] ]
44            },
45            {   type        => "Block",
46                nested_name => "nested",
47                elements    => [ { type => "Text", name => "foo" } ]
48            },
49            {   type     => "Multi",
50                name     => "address",
51                elements => [ { name => "street" }, { name => "number" } ]
52            },
53            {   type      => "Multi",
54                name      => "address-split",
55                elements  => [ { name => "street" }, { name => "number" } ],
56                deflators => [ { type => "CompoundSplit" } ]
57            },
58            {   type => "SimpleTable",
59                rows => [ [ { name => "table1" } ] ] } ] } );
60
61$form->auto_fieldset(0);
62
63$form->model->default_values(
64    {   datetime => '30-08-1999 22:00',
65        bar      => 'y',
66        many     => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
67        'single-select' => 1,
68        'inflator'      => '2008-09-22',
69        'multi-select'  => [ 1, 2 ],
70        nested          => { foo => "bar" },
71        address         => { street => "Lombardstreet", number => 22 },
72        'address-split' => "Lombardstreet 22",
73        table1          => "test"
74    } );
75
76$form->process;
77
78is_deeply(
79    $form->model->create,
80    {   bar  => 'y',
81        many => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
82        'single-select'   => 1,
83        'datetime_year'   => 1999,
84        'datetime_minute' => '00',
85        'datetime_month'  => 8,
86        'datetime_day'    => 30,
87        'datetime_hour'   => '22',
88        'datetime'        => '30-08-1999 22:00',
89        'multi-select'    => [ 1, 2 ],
90        nested            => { foo => "bar" },
91        address           => { street => "Lombardstreet", number => 22 },
92        'address-split'   => { street => "Lombardstreet", number => 22 },
93        table1            => "test",
94        inflator          => '2008-09-22 00:00'
95    } );
96
97$form->model->options(1);
98
99is_deeply(
100    $form->model->create,
101    {   bar  => 'y',
102        many => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
103        'single-select' => { value => 1, label => "foo" },
104        'multi-select' =>
105            [ { value => 1, label => "foo" }, { value => 2, label => "bar" } ],
106        nested          => { foo    => "bar" },
107        address         => { street => "Lombardstreet", number => 22 },
108        'address-split' => { street => "Lombardstreet", number => 22 },
109        table1         => "test",
110        'datetime_day' => {
111            'value' => 30,
112            'label' => 30
113        },
114        'datetime'        => '30-08-1999 22:00',
115        'datetime_minute' => {
116            'value' => '00',
117            'label' => '00'
118        },
119        'datetime_month' => {
120            'value' => 8,
121            'label' => 'August'
122        },
123        'datetime_hour' => {
124            'value' => '22',
125            'label' => '22'
126        },
127        'datetime_year' => {
128            'value' => '1999',
129            'label' => '1999'
130        },
131        inflator => '2008-09-22 00:00'
132    } );
133
134$form->model->flatten(1);
135
136$form->model->inflators(1);
137
138is_deeply(
139    $form->model->create,
140    {   'datetime_month.label'  => 'August',
141        'multi-select_0.label'  => 'foo',
142        'datetime_hour.value'   => '22',
143        'datetime_minute.value' => '00',
144        'multi-select_0.value'  => '1',
145        'address-split.street'  => 'Lombardstreet',
146        'datetime'              => '30-08-1999 22:00',
147        'table1'                => 'test',
148        'many_2.foo'            => 'baz',
149        'bar'                   => 'y',
150        'datetime_hour.label'   => '22',
151        'address-split.number'  => '22',
152        'many_1.foo'            => 'bar',
153        'many_2.id'             => 2,
154        'datetime_year.label'   => 1999,
155        'single-select.label'   => 'foo',
156        'address.number'        => 22,
157        'address.street'        => 'Lombardstreet',
158        'inflator'              => '2008-09-22 00:00',
159        'datetime_day.value'    => 30,
160        'datetime_minute.label' => '00',
161        'single-select.value'   => '1',
162        'datetime_month.value'  => 8,
163        'datetime_year.value'   => 1999,
164        'datetime_day.label'    => 30,
165        'nested.foo'            => 'bar',
166        'multi-select_1.label'  => 'bar',
167        'many_1.id'             => 1,
168        'multi-select_1.value'  => '2'
169    } );
170
171$form->model->flatten(0);
172
173$form->model->default_values(
174    {   many => [ { id => undef } ],
175        bar  => 'zzz',
176    } );
177
178is_deeply(
179    $form->model->create,
180    {   'inflator'      => undef,
181        'single-select' => { value => undef, label => undef },
182        'datetime_hour' => { value => undef, label => undef },
183        'address-split' => {
184            'number' => undef,
185            'street' => undef
186        },
187        'many'            => [ { id => undef, foo => undef } ],
188        'datetime_day'    => { value => undef, label => undef },
189        'nested'          => { 'foo' => undef },
190        'datetime'        => undef,
191        'datetime_year'   => { value => undef, label => undef },
192        'table1'          => undef,
193        'bar'             => 'zzz',
194        'datetime_minute' => { value => undef, label => undef },
195        'address'         => {
196            'number' => undef,
197            'street' => undef
198        },
199        'multi-select'   => { value => undef, label => undef },
200        'datetime_month' => { value => undef, label => undef } } );
201