use strict;
use warnings;
use utf8;
use Test::More tests => 58;
use lib qw(MENTA/extlib);
use NanoA;
use Class::Accessor::Lite; # usally loaded (or bundled) in nanoa.cgi
BEGIN { use_ok('NanoA::Form'); };
my $form = NanoA::Form->new(
secure => 1,
action => '/action',
fields => [
username => {
type => 'text',
class => 'hoge_class',
value => 'def"val',
# validation
required => 1,
min_length => 6,
max_length => 8,
regexp => qr/^[0-9a-z_]{6,8}/,
},
sex => {
type => 'radio',
options => [
male => { label => '男性' },
female => { label => '女性' },
],
# validation
required => 1,
},
age => {
type => 'select',
options => [
'' => { label => '選択してください', selected => 1 },
19 => { label => '〜19才' },
20 => { label => '20才〜29才' },
30 => { label => '30才〜39才' },
40 => { label => '40才〜49才' },
50 => { label => '50才〜59才' },
99 => { label => '60才以上' },
],
# validation
required => 1,
},
interest => {
type => 'checkbox',
options => [
c => { label => 'C/C++' },
perl => { label => 'perl', checked => 1 },
php => { label => 'PHP' },
ruby => { label => 'Ruby' },
],
# validation
required => [ 2, 3 ],
},
comment => {
type => 'textarea',
rows => 10,
cols => 40,
value => 'def"val',
# validation
required => undef,
min_length => 5,
max_length => 10,
},
unique_key => {
type => 'hidden',
# validation
required => 1,
},
],
);
is(ref $form, 'NanoA::Form', 'post-new');
ok($form->secure, 'secure flag');
is(scalar @{$form->fields}, 6, '# of fields');
my $field = $form->fields->[0];
is(ref $field, q(NanoA::Form::Field::Text), 'field object');
is($field->type, q(text), 'text type');
is($field->name, q(username), 'text name');
is($field->label, q(Username), 'text label');
is($field->min_length, 6, 'text min_length');
is($field->max_length, 8, 'text max_length');
like($field->validate([ 'aaaaa' ])->message, qr/短すぎ/, 'text min_length error');
like($field->validate([ 'aaaaaaaaa' ])->message, qr/長すぎ/, 'text max_length error');
like($field->validate([ '$-13409' ])->message, qr/無効/, 'text regexp error');
ok(! $field->validate([ 'michael' ]), 'text regexp');
is(${$field->render},
'',
'text render',
);
is(${$field->render([ 'hoge' ])},
'',
'text render 2',
);
$field = $form->fields->[1];
is($field->type, q(radio), 'radio type');
like($field->validate([])->message, qr/選択してください/, 'radio required');
like($field->validate([ 'nonexistent' ])->message, qr/不正な/, 'radio unexpected');
like($field->validate([ qw/male female/ ])->message, qr/不正な/, 'radio multi');
ok(! $field->validate([ 'male' ]), 'radio validate');
ok(! $field->validate([ 'female' ]), 'radio validate 2');
like(${$field->options->[0]->render},
qr{},
'radio render',
);
like(${$field->render},
qr{\s*},
'radio render 2',
);
like(${$field->render([ 'male' ])},
qr{\s*},
'radio render 3',
);
$field = $form->fields->[2];
is($field->type, q(select), 'select type');
like($field->validate([])->message, qr/選択してください/, 'select required');
like($field->validate([ 'x' ])->message, qr/不正な/, 'select unexpected');
like($field->validate([ '' ])->message, qr/選択してください/, 'select required');
like($field->validate([ qw/20 30/ ])->message, qr/不正な/, 'select multi');
ok(! $field->validate([ 20 ]), 'select validate');
ok(! $field->validate([ 30 ]), 'select validate 2');
is(${$field->options->[0]->render},
'',
'select render 1',
);
is(${$field->options->[1]->render},
'',
'select render 2',
);
is(${$field->render},
join(
'',
'',
),
'select render 3',
);
is(${$field->render([ 20 ])},
join(
'',
'',
),
'select render 4',
);
$field = $form->fields->[3];
is($field->type, q(checkbox), 'checkbox type');
like($field->validate([ 'hoge' ])->message, qr/不正な/, 'checkbox unexpected');
like($field->validate([ qw/perl/ ])->message, qr/の中から 2 〜 3/, 'checkbox required 1');
ok(! $field->validate([ qw/c perl/ ]), 'checkbox required 2');
ok(! $field->validate([ qw/c perl ruby/ ]), 'checkbox required 3');
like($field->validate([ qw/c perl php ruby/ ])->message, qr/の中から 2 〜 3/, 'checkbox required 4');
like(
${$field->options->[0]->render},
qr{},
'checkbox render 1',
);
like(
${$field->options->[1]->render},
qr{},
'checkbox render 2',
);
like(
${$field->render},
qr{ },
'checkbox render 3',
);
like(
${$field->render([ qw/perl php/ ])},
qr{ },
'checkbox render 4',
);
$field = $form->fields->[4];
is($field->type, q(textarea), 'textarea type');
ok(! $field->validate([]), 'textarea required');
like($field->validate([ 'abcd' ])->message, qr/短すぎ/, 'textarea min_length');
like($field->validate([ 'abcdefghijk' ])->message, qr/長すぎ/, 'textarea max_length');
ok(! $field->validate([ 'abcde' ]), 'textarea validate');
is(${$field->render},
'',
'textarea render 1',
);
is(${$field->render([ qw/abcde/ ])},
'',
'textarea render 2',
);
$field = $form->fields->[5];
is($field->type, q(hidden), 'hidden type');
like($field->validate([])->message, qr/を入力してください/, 'hidden required');
ok(! $field->validate([ 'abc' ]), 'hidden validate');
is(${$field->render},
'',
'hidden render 1',
);
is(${$field->render([ qw/abcde/ ])},
'',
'hidden render 1',
);