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