EOF
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
baz => 'yada',
} );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
ok( $f->errors('baz'), 'baz has errors' );
ok( !$f->param('foo'), 'param foo is undef due to error' );
ok( !$f->param('bar'), 'param bar is undef due to error' );
ok( !$f->param('baz'), 'param baz is undef due to error' );
}
# Display error on first value only
{
$constraint->render_errors(qw/ foo /);
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
baz => 'nada',
} );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
ok( $f->errors('baz'), 'baz has errors' );
is( "$f", <
Invalid Input
EOF
}
# Display error on some
{
$constraint->render_errors(qw/ foo bar /);
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
baz => 'something completely different',
} );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
ok( $f->errors('baz'), 'baz has errors' );
is( "$f", <
Invalid InputInvalid Input
EOF
}
HTML-Widget-1.11/t/constraint_regex.t 0000644 0000764 0000764 00000002144 10571572142 017606 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'Regex', 'foo' )->regex(qr/^\w+$/);
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => "yada \n dada" } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'bar', 'yada' ] } );
my $f = $w->process($query);
is( $f->valid('foo'), 1, "Valid" );
my @results = $f->param('foo');
is( $results[0], 'bar', "Multiple valid values" );
is( $results[1], 'yada', "Multiple valid values" );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'yada', "\n" ] } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/constraint_bool.t 0000644 0000764 0000764 00000004104 10571572142 017425 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 15;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'Bool', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 1 } );
my $f = $w->process($query);
is( $f->param('foo'), 1, 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 0 } );
my $f = $w->process($query);
is( $f->param('foo'), 0, 'foo value' );
ok( !$f->errors, 'no errors' );
}
# undef valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => undef } );
my $f = $w->process($query);
ok( $f->valid('foo') );
}
# empty valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '' } );
my $f = $w->process($query);
ok( $f->valid('foo') );
is( $f->param('foo'), '', 'foo value' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 1, 0, 1 ], } );
my $f = $w->process($query);
ok( $f->valid('foo'), 'Valid' );
my @results = $f->param('foo');
is_deeply( \@results, [ 1, 0, 1 ], 'Multiple valid values' );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 1, 0, 2 ], } );
my $f = $w->process($query);
ok( !$f->valid('foo'), 'foo not valid' );
ok( $f->errors('foo'), 'foo has errors' );
}
# invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '11' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '1.1' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '10foo' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errros' );
}
HTML-Widget-1.11/t/constraint_ascii.t 0000644 0000764 0000764 00000002150 10571572142 017561 0 ustar cafranks cafranks use strict;
use warnings;
use utf8;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'ASCII', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '日本語' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'bar', 'yada' ] } );
my $f = $w->process($query);
is( $f->valid('foo'), 1, "Valid" );
my @results = $f->param('foo');
is( $results[0], 'bar', "Multiple valid values" );
is( $results[1], 'yada', "Multiple valid values" );
}
# Multiple Invalid
{
my $query
= HTMLWidget::TestLib->mock_query( { foo => [ 'yada', '日本語' ] } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/constraint_in.t 0000644 0000764 0000764 00000001772 10571572142 017110 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'In', 'foo' )->in( 'one', 'two', 'three' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'one' } );
my $f = $w->process($query);
is( $f->param('foo'), 'one', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'two' } );
my $f = $w->process($query);
is( $f->param('foo'), 'two', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'three' } );
my $f = $w->process($query);
is( $f->param('foo'), 'three', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'four' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/constraint_allornone.t 0000644 0000764 0000764 00000002730 10571572142 020466 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 11;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->constraint( 'AllOrNone', 'foo', 'bar' );
# Valid All
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
is( $f->param('bar'), 'nada', 'bar value' );
ok( !$f->errors, 'no errors' );
}
# Valid None
{
my $query = HTMLWidget::TestLib->mock_query( {} );
my $f = $w->process($query);
ok( !$f->valid, 'none valid' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( $f->errors('bar'), 'bar has errors' );
}
# Empty strings - like an empty form as submitted by Firefox
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => '',
bar => ''
} );
my $f = $w->process($query);
ok( !$f->errors('foo'), 'foo has no errors' );
ok( !$f->errors('bar'), 'bar has no errors' );
}
# "0" as a query value
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 0 } );
my $f = $w->process($query);
is( $f->param('foo'), 0, 'foo value' );
ok( $f->errors('bar'), 'bar has errors' );
}
HTML-Widget-1.11/t/filter_callback.t 0000644 0000764 0000764 00000002124 10571572142 017327 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->filter( 'Callback', 'foo' )->callback(
sub {
my $value = shift;
$value =~ s/foo/bar/g;
return $value;
} );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'foobar' } );
my $f = $w->process($query);
is( $f->param('foo'), 'barbar', 'foo value' );
}
my $w2 = HTML::Widget->new;
$w2->element( 'Textfield', 'foo' );
$w2->element( 'Textfield', 'bar' );
$w2->filter('Callback')->callback(
sub {
my $value = shift;
$value =~ s/foo/bar/g;
return $value;
} );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => [ 'foobar', 'foobuz' ],
bar => [ 'barfoo', 'barbuz' ] } );
my $f = $w2->process($query);
is_deeply( [ $f->param('foo') ], [qw/ barbar barbuz/], 'foo values' );
is_deeply( [ $f->param('bar') ], [qw/ barbar barbuz/], 'bar values' );
}
HTML-Widget-1.11/t/06bugs_select_zero_key_constraint.t 0000644 0000764 0000764 00000000737 10571572142 023056 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Select', 'foo' )->options( 1 => 'yes', 0 => 'no' )
->constrain_options(1);
my $f = $w->process();
my @constraints = $w->get_constraints;
is( scalar(@constraints), 1, '1 implicit IN constraint' );
my $keys = $constraints[0]->in;
is( $keys->[0], 1, 'constraint value' );
is( $keys->[1], 0, 'constraint value' );
HTML-Widget-1.11/t/get_errors.t 0000644 0000764 0000764 00000006050 10571572142 016403 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 6;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' )->value('foo');
# With mocked basic query
{
my $result = $w->process;
$result->add_error( {
name => 'foo',
message => 'bad foo',
type => 'Custom'
} );
$result->add_error( {
name => 'baz',
message => 'Baz error',
type => 'OtherType'
} );
is_deeply( [
new HTML::Widget::Error( {
type => 'OtherType',
name => 'baz',
message => 'Baz error'
}
),
new HTML::Widget::Error( {
type => 'Custom',
name => 'foo',
message => 'bad foo'
}
),
],
[ $result->errors ],
"Errors correct with no params"
);
is_deeply(
[],
[ $result->errors( undef, 'FakeType' ) ],
"There are no FakeType errors"
);
is_deeply( [
new HTML::Widget::Error( {
type => 'Custom',
name => 'foo',
message => 'bad foo'
} )
],
[ $result->errors( undef, 'Custom' ) ],
"Filtered returned correct type"
);
$result->add_error( {
name => 'baz',
message => 'Baz error 2',
type => 'All',
} );
is_deeply( [
new HTML::Widget::Error( {
type => 'OtherType',
name => 'baz',
message => 'Baz error'
}
),
new HTML::Widget::Error( {
type => 'All',
name => 'baz',
message => 'Baz error 2',
}
),
],
[ $result->errors('baz') ],
"Errors correct with name provided"
);
is_deeply( [
new HTML::Widget::Error( {
type => 'OtherType',
name => 'baz',
message => 'Baz error'
}
),
new HTML::Widget::Error( {
type => 'All',
name => 'baz',
message => 'Baz error 2',
}
),
new HTML::Widget::Error( {
type => 'Custom',
name => 'foo',
message => 'bad foo'
}
),
],
[ $result->errors ],
"Errors correct with no params"
);
is_deeply( [
new HTML::Widget::Error( {
type => 'All',
name => 'baz',
message => 'Baz error 2',
}
),
],
[ $result->errors( 'baz', 'All' ) ],
"errors correct with name and type params"
);
}
HTML-Widget-1.11/t/constraint_singlevalue.t 0000644 0000764 0000764 00000002304 10571572142 021010 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 9;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'SingleValue', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 1 } );
my $f = $w->process($query);
is( $f->param('foo'), 1, 'foo value' );
ok( !$f->errors, 'no errors' );
}
# undef valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => undef } );
my $f = $w->process($query);
ok( $f->valid('foo') );
}
# empty valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '' } );
my $f = $w->process($query);
ok( $f->valid('foo') );
is( $f->param('foo'), '', 'foo value' );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 1, 0 ], } );
my $f = $w->process($query);
ok( !$f->valid('foo'), 'foo not valid' );
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'foo', 'bar' ], } );
my $f = $w->process($query);
ok( !$f->valid('foo'), 'foo not valid' );
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/06bugs_constraint_range_zero_max.t 0000644 0000764 0000764 00000001151 10571572142 022657 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 4;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'Range', 'foo' )->min(-4)->max(0);
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 0 } );
my $f = $w->process($query);
ok( $f->valid('foo'), 'foo valid' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 1 } );
my $f = $w->process($query);
ok( !$f->valid('foo'), 'foo not valid' );
ok( $f->errors, 'errors' );
}
HTML-Widget-1.11/t/06bugs_value_no_default.t 0000644 0000764 0000764 00000011062 10571572142 020731 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Button', 'my_button', )->value(1);
$w->element( 'Checkbox', 'my_checkbox' )->value(1)->checked('checked');
$w->element( 'Checkbox', 'my_checkbox' )->value(0);
$w->element( 'Hidden', 'my_hidden' )->value(1);
$w->element( 'Password', 'my_password' )->value(1)->fill(1);
$w->element( 'Radio', 'my_radio' )->value(1)->checked('checked');
$w->element( 'Radio', 'my_radio' )->value(0);
$w->element( 'RadioGroup', 'my_radiogroup' )->values( 1, 0 )->checked(1);
$w->element( 'Reset', 'my_reset' )->value(1);
$w->element( 'Select', 'my_select' )
->options( 0 => 'unsubscribed', 1 => 'subscribed' )->selected(1);
$w->element( 'Submit', 'my_submit' )->value(1);
$w->element( 'Textarea', 'my_textarea' )->value(1);
$w->element( 'Textfield', 'my_textfield' )->value(1);
{
my $f = $w->process();
is( "$f", <
EOF
}
# make sure XML of the result object has empty values, not defaults
{
my $query = HTMLWidget::TestLib->mock_query( {} );
my $f = $w->process($query);
is( "$f", <
EOF
}
HTML-Widget-1.11/t/element_button.t 0000644 0000764 0000764 00000002216 10571572142 017254 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 4;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Button', 'foo' )->value('foo');
$w->element( 'Button', 'bar' );
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'bar' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
my $f = $w->process($query);
is( "$f", <
EOF
ok( !$f->valid('foo') );
ok( $f->valid('bar') );
}
HTML-Widget-1.11/t/09nested_embed.t 0000644 0000764 0000764 00000003234 10571572142 017020 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
#
# Old style
my $wo = HTML::Widget->new('foo')->action('/foo');
my $fso1 = HTML::Widget->new('main');
$fso1->element( 'Textfield', 'bar' );
my $fso2 = HTML::Widget->new('nested');
$fso2->element( 'Textfield', 'baz' );
$fso1->embed_into_first($fso2);
$wo->embed($fso1);
my $fo = $wo->process;
is( $fo->as_xml, <
EOF
# New style
my $w = HTML::Widget->new('foo')->action('/foo');
my $fs1 = $w->element( 'Fieldset', 'main' );
$fs1->element( 'Textfield', 'bar' );
my $fs2 = $fs1->element( 'Fieldset', 'nested' );
$fs2->element( 'Textfield', 'baz' );
my $f = $w->process;
is( $f->as_xml, <
EOF
# CHECK BOTH EXAMPLES PRODUCE SAME OUTPUT
is( "$fo", "$f", 'widgets are identical' );
HTML-Widget-1.11/t/filter_htmlescape.t 0000644 0000764 0000764 00000001416 10571573024 017723 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->filter( 'HTMLEscape', 'foo' );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => '
message
',
bar => '23',
} );
my $f = $w->process($query);
is( $f->param('foo'), '<p>message</p>', 'foo value' );
is( $f->param('bar'), '23', 'bar value' );
SKIP: {
skip "HTML::Element now checks for already-escaped characters - Won't fix", 1;
like(
"$f",
qr{\Q value="<p>message</p>" }x,
'XML output is double encoded'
);
}
}
HTML-Widget-1.11/t/02pod.t 0000644 0000764 0000764 00000000331 10571572142 015150 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More;
eval "use Test::Pod 1.14";
plan skip_all => 'Test::Pod 1.14 required' if $@;
plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD};
all_pod_files_ok();
HTML-Widget-1.11/t/06bugs_ascii_space.t 0000644 0000764 0000764 00000000672 10571572142 017665 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'ASCII', 'foo' );
my $query = HTMLWidget::TestLib->mock_query( { foo => ' ' } );
my $f = $w->process($query);
ok( !$f->has_errors, 'no errors' );
ok( $f->valid('foo'), 'foo valid' );
is( $f->param('foo'), ' ', 'value is space character' );
HTML-Widget-1.11/t/06bugs_result_elements_warnings.t 0000644 0000764 0000764 00000000707 10571572142 022543 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1 + 1; # +1 is for Test::NoWarnings
use Test::NoWarnings;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
{
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $result = $w->process($query);
my @elements = $result->elements;
ok( @elements == 1, '@elements contains 1 value' );
}
HTML-Widget-1.11/t/constraint_any.t 0000644 0000764 0000764 00000004451 10571572142 017266 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 10;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
my $constraint = $w->constraint( 'Any', 'foo', 'bar' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { baz => 23 } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
}
# Multiple invalid, error only on one
{
$constraint->render_errors(qw/ foo /);
my $query = HTMLWidget::TestLib->mock_query( { baz => 23 } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
is( "$f", <
Alternative Missing
EOF
}
# Multiple invalid, error on both (explicitly)
{
$constraint->render_errors(qw/ foo bar /);
my $query = HTMLWidget::TestLib->mock_query( { baz => 23 } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
is( "$f", <
Alternative MissingAlternative Missing
EOF
}
HTML-Widget-1.11/t/06bugs_widget_name_zero.t 0000644 0000764 0000764 00000000215 10571572142 020735 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1;
use HTML::Widget;
my $w = HTML::Widget->new(0);
is( $w->name, 0, 'widget name 0' );
HTML-Widget-1.11/t/get_constraints.t 0000644 0000764 0000764 00000003144 10571572142 017437 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 13;
use HTML::Widget;
my $w = HTML::Widget->new;
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Printable', 'bar' );
$w->constraint( 'All', 'baz', 'one' );
$w->constraint( 'All', 'baz', 'two' );
{
my @constraints = $w->get_constraints;
is( scalar(@constraints), 4, 'correct number of constraints' );
is_deeply( $constraints[0]->names, ['foo'], 'correct constraint names' );
is_deeply( $constraints[1]->names, ['bar'], 'correct constraint names' );
is_deeply( $constraints[2]->names,
[qw/ baz one /], 'correct constraint names' );
is_deeply( $constraints[3]->names,
[qw/ baz two /], 'correct constraint names' );
}
{
my @constraints = $w->get_constraints( type => 'Integer' );
is( scalar(@constraints), 1, 'correct number of constraints' );
is_deeply( $constraints[0]->names, ['foo'], 'correct constraint names' );
isa_ok(
$constraints[0],
'HTML::Widget::Constraint::Integer',
'correct constraint type'
);
}
{
my @constraints = $w->get_constraints( type => 'All' );
is( scalar(@constraints), 2, 'correct number of constraints' );
is_deeply( $constraints[0]->names,
[qw/ baz one /], 'correct constraint names' );
is_deeply( $constraints[1]->names,
[qw/ baz two /], 'correct constraint names' );
isa_ok(
$constraints[0],
'HTML::Widget::Constraint::All',
'correct constraint type'
);
isa_ok(
$constraints[1],
'HTML::Widget::Constraint::All',
'correct constraint type'
);
}
HTML-Widget-1.11/t/element_custom_namespace.t 0000644 0000764 0000764 00000002403 10571572142 021265 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( '+HTMLWidget::CustomElement', 'foo' )->value('foo')->size(30)
->label('Foo');
$w->constraint( 'Integer', 'foo' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
my $f = $w->process($query);
is( "$f", <
Invalid Input
EOF
}
HTML-Widget-1.11/t/filter_uppercase.t 0000644 0000764 0000764 00000001020 10571572142 017554 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->filter( 'UpperCase', 'foo' );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'Foo',
bar => 'Bar',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'FOO', 'foo value' );
is( $f->param('bar'), 'Bar', 'bar value' );
}
HTML-Widget-1.11/t/element_hidden.t 0000644 0000764 0000764 00000002136 10571572142 017175 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Hidden', 'foo' )->value('foo');
$w->element( 'Hidden', 'bar' );
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'bar' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
my $f = $w->process($query);
is( "$f", <
EOF
}
HTML-Widget-1.11/t/element_reset.t 0000644 0000764 0000764 00000001045 10571572142 017062 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Reset', 'foo' )->value('foo');
$w->element( 'Reset', 'bar' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
HTML-Widget-1.11/t/constraint_custom_namespace.t 0000644 0000764 0000764 00000001745 10571572142 022030 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( '+HTMLWidget::CustomConstraint', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 23 } );
my $f = $w->process($query);
is( $f->param('foo'), 23, 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( "$f", <
Invalid Input
EOF
}
HTML-Widget-1.11/t/element_submit.t 0000644 0000764 0000764 00000004245 10571572142 017250 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 4;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Submit', 'foo' )->value('foo');
$w->element( 'Submit', 'bar' );
$w->element( 'Submit', 'foobar' )->src('http://localhost/test.jpg');
$w->element( 'Submit', 'foo1' )->src('test.jpg')->height(10);
$w->element( 'Submit', 'foo2' )->src('test.jpg')->width(10);
$w->element( 'Submit', 'foo3' )->src('test.jpg')->height(10)->width(20);
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'bar' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
my $f = $w->process($query);
is( "$f", <
EOF
ok( !$f->valid('foo') );
ok( $f->valid('bar') );
}
HTML-Widget-1.11/t/06bugs_callbackone_missing_param.t 0000644 0000764 0000764 00000001410 10571572142 022560 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 5;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
my ( $foo, $bar, $zoo );
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->element( 'Textfield', 'zoo' );
$w->constraint( 'CallbackOnce', 'foo', 'bar', 'zoo' )
->callback( sub { ( $foo, $bar, $zoo ) = @_; return 1; } );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => '',
zoo => 'nada',
} );
my $f = $w->process($query);
is( $foo, '', '$foo assigned correctly' );
ok( !defined $bar, '$bar undef' );
is( $zoo, 'nada', '$zoo assigned correctly' );
ok( $f->valid('foo'), 'foo valid' );
ok( $f->valid('zoo'), 'zoo valid' );
}
HTML-Widget-1.11/t/10explicit_ids.t 0000644 0000764 0000764 00000002125 10571572142 017050 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new->explicit_ids(1);
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' )->attributes->{id} = 'my_bar';
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
# Add an id to the top-level widget too
$w->attributes->{id} = 'my_form';
my $f = $w->process($query);
is( "$f", <
EOF
}
HTML-Widget-1.11/t/06bugs_value_empty_string.t 0000644 0000764 0000764 00000000354 10571572142 021337 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1;
use HTML::Widget;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' )->value('');
my $f = $w->process();
like( "$f", qr/\Q value="" /x, 'empty value appears in XML' );
HTML-Widget-1.11/t/05strict.t 0000644 0000764 0000764 00000002461 10571572142 015707 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 11;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new->method('post')->action('/foo/bar')->strict(1);
$w->element( 'Textfield', 'age' )->label('Age')->size(3);
$w->element( 'Textfield', 'name' )->label('Name')->size(60);
$w->element( 'Submit', 'ok' )->value('OK');
$w->constraint( 'Integer', 'age' )->message('No integer.');
$w->constraint( 'Maybe', 'ok' );
my $query = HTMLWidget::TestLib->mock_query( {
age => 'NaN',
name => 'sri',
foo => 'blah',
bar => 'stuff',
ok => 'OK',
} );
my $f = $w->process($query);
ok( $f->valid('ok'), 'Field ok is valid' );
ok( !$f->valid('name'), 'Field name is valid' );
ok( !$f->valid('age'), 'Field age is not valid' );
ok( !$f->valid('foo'), 'Field foo is not valid' );
ok( !$f->valid('other'), 'Field other is not valid' );
is( $f->params->{ok}, 'OK', 'Param name is accessible' );
ok( !$f->params->{name}, 'Param name is accessible' );
# is this correct here?
ok( !exists $f->params->{age}, 'Param age does not exist in params hash' );
is( $f->params->{age}, undef, 'Param age is undef' );
ok( !exists $f->params->{foo}, 'Param foo is not in params hash' );
ok( !exists $f->params->{other}, 'Param other is not in params hash' );
HTML-Widget-1.11/t/constraint_string.t 0000644 0000764 0000764 00000002113 10571572142 017776 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'String', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '!@#$%' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'bar', 'yada' ] } );
my $f = $w->process($query);
is( $f->valid('foo'), 1, "Valid" );
my @results = $f->param('foo');
is( $results[0], 'bar', "Multiple valid values" );
is( $results[1], 'yada', "Multiple valid values" );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'yada', '-' ] } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/element_textarea.t 0000644 0000764 0000764 00000003374 10571572142 017564 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textarea', 'foo' )->value('foo')->cols(20)->rows(40)->wrap('off')
->label('Foo');
$w->element( 'Textarea', 'bar' )->label('Bar')->comment('Baz');
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'bar' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => '23',
} );
my $f = $w->process($query);
is( "$f", <
Invalid Input
EOF
}
HTML-Widget-1.11/t/constraint_callback.t 0000644 0000764 0000764 00000002163 10571572142 020231 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'Callback', 'foo' )->callback( sub { return 1 if $_[0] } );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query
= HTMLWidget::TestLib->mock_query( { foo => [ 'bar', 'yada' ], } );
my $f = $w->process($query);
is( $f->valid('foo'), 1, "Valid" );
my @results = $f->param('foo');
is( $results[0], 'bar', "Multiple valid values" );
is( $results[1], 'yada', "Multiple valid values" );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ '', '' ] } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/filter_lowercase.t 0000644 0000764 0000764 00000001020 10571572142 017551 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->filter( 'LowerCase', 'foo' );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'Foo',
bar => 'Bar',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'foo', 'foo value' );
is( $f->param('bar'), 'Bar', 'bar value' );
}
HTML-Widget-1.11/t/submitted.t 0000644 0000764 0000764 00000001212 10571572142 016223 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Select', 'foo' )->label('Foo')
->options( foo => 'Foo', bar => 'Bar' );
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'bar' );
# Without query
{
my $f = $w->process();
is( $f->submitted, 0, 'Form was not submitted' );
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'foo',
bar => [ 'yada', 23 ],
} );
my $f = $w->process($query);
is( $f->submitted, 1, 'Form was submitted' );
}
HTML-Widget-1.11/t/element_block.t 0000644 0000764 0000764 00000016734 10571572142 017045 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 28;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
my $e = $w->element( 'Block', 'foo' );
$e->element( 'Textfield', 'bar' )->value('bar')->label('Bar');
my $fs = $e->element( 'Fieldset', 'fs' )->legend('FS');
$fs->element( 'Textfield', 'baz' );
my $fs2 = $e->element( 'Fieldset', 'fs2' );
$fs2->element( 'Textfield', 'bartwo' );
$fs2->element( 'Textfield', 'baztwo' );
my $fsn = $fs2->element( 'Fieldset', 'fsnest' );
$fsn->element( 'Textfield', 'barnest' )->value('Barnest');
# Not completely sure if NullContainers should be used for real,
# but test them anyway as they're the base for Block.
my $nc = $e->element( 'NullContainer', 'nc' );
$nc->element( 'Textfield', 'norp' );
# Without query
{
my $f = $w->process;
is( "$f", <
EOF
}
# With mocked basic query - okay
{
my $query = HTMLWidget::TestLib->mock_query( {
bar => 'yada',
baz => '23',
bartwo => 'ping',
baztwo => '18',
barnest => 'yellow',
} );
my $f = $w->process($query);
is( "$f", <
EOF
}
# make sure XML of the result object has empty values, not defaults
{
my $query = HTMLWidget::TestLib->mock_query( {} );
my $f = $w->process($query);
is( "$f", <
EOF
}
HTML-Widget-1.11/t/10no_name.t 0000644 0000764 0000764 00000003474 10571572142 016014 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 4 + 1; # extra NoWarnings test
use Test::NoWarnings;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
{
my $w = HTML::Widget->new;
$w->element('Block');
my $f = $w->process;
is( "$f", <
EOF
}
{
my $w = HTML::Widget->new;
my $e = $w->element('Block');
$e->element('Submit');
my $f = $w->process;
is( "$f", <
EOF
}
{
my $w = HTML::Widget->new;
my $fs = $w->element('Fieldset');
$fs->element( 'Textfield', 'foo' );
my $f = $w->process;
is( "$f", <
EOF
}
{
my $w = HTML::Widget->new;
$w->element( 'Fieldset', 'foo' )
->legend( 'the legend of foo' )
->element('Fieldset')
->legend( 'the legend of blank' )
->element( 'Fieldset', 'baz' )
->legend( 'the legend of baz' )
->element( 'Textfield', 'bar' );
my $f = $w->process;
is( "$f", <
EOF
}
HTML-Widget-1.11/t/get_element.t 0000644 0000764 0000764 00000002364 10571572142 016524 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 11;
use HTML::Widget;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->element( 'Textarea', 'baz' );
$w->element( 'Password', 'baz' );
{
my @elements = $w->get_element;
is( scalar(@elements), 1, 'correct number of elements' );
is( $elements[0]->name, 'foo', 'correct element name' );
}
{
my @elements = $w->get_element( type => 'Textfield' );
is( scalar(@elements), 1, 'correct number of elements' );
is( $elements[0]->name, 'foo', 'correct element name' );
}
{
my @elements = $w->get_element( type => 'Textarea' );
is( scalar(@elements), 1, 'correct number of elements' );
is( $elements[0]->name, 'baz', 'correct element name' );
}
{
my @elements = $w->get_element( name => 'bar' );
is( scalar(@elements), 1, 'correct number of elements' );
is( $elements[0]->name, 'bar', 'correct element name' );
}
{
my @elements = $w->get_element( name => 'baz' );
is( scalar(@elements), 1, 'correct number of elements' );
is( $elements[0]->name, 'baz', 'correct element name' );
isa_ok(
$elements[0],
'HTML::Widget::Element::Textarea',
'correct element type'
);
}
HTML-Widget-1.11/t/06bugs_value_zero.t 0000644 0000764 0000764 00000001550 10571572142 017571 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1;
use HTML::Widget;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' )->value(0);
$w->element( 'RadioGroup', 'bar' )->values( 0, 1 )->value(0);
$w->constraint( 'All', 'foo', 'bar' );
my $f = $w->process();
is( "$f", <
EOF
HTML-Widget-1.11/t/constraint_length.t 0000644 0000764 0000764 00000002541 10571572142 017756 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 9;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->constraint( 'Length', 'foo' )->min(3)->max(4);
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( !$f->errors, 'no errors' );
}
# Valid (blank)
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '' } );
my $f = $w->process($query);
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yadayada' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query(
{ foo => [ 'yad', 'yada', 'nada' ], } );
my $f = $w->process($query);
is( $f->valid('foo'), 1, "Valid" );
my @results = $f->param('foo');
is( $results[0], 'yad', "Multiple valid values" );
is( $results[1], 'yada', "Multiple valid values" );
is( $results[2], 'nada', "Multiple valid values" );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query(
{ foo => [ 'yada', 'yadayada', 'yadayada' ], } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/08filter_all.t 0000644 0000764 0000764 00000001251 10571572142 016513 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 3;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->filter_all('UpperCase');
# this element shouldn't get a filter added
$w->element( 'Textfield', 'baz' );
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'Foo',
bar => 'Bar',
baz => 'yada',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'FOO', 'foo value' );
is( $f->param('bar'), 'BAR', 'bar value' );
is( $f->param('baz'), 'yada', 'bar value' );
}
HTML-Widget-1.11/t/08constraint_all.t 0000644 0000764 0000764 00000004212 10571572142 017412 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 16;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
my $fs = $w->element( 'Fieldset', 'outer' );
$fs->element( 'Textfield', 'foo' );
$fs->element( 'Textfield', 'bar' );
$w->constraint_all('Bool');
# this element shouldn't get a constraint added
$fs->element( 'Textfield', 'baz' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 1,
bar => 0,
baz => 'yada'
} );
my $f = $w->process($query);
ok( $f->valid('foo'), 'foo value' );
ok( $f->valid('bar'), 'bar value' );
ok( $f->valid('baz'), 'baz value' );
ok( !$f->errors, 'no errors' );
my @cons = $w->get_constraints;
is( scalar @cons, 2, '2 constraints' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 0 } );
my $f = $w->process($query);
ok( $f->valid('foo'), 'foo value' );
ok( !$f->errors, 'no errors' );
}
# undef valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => undef } );
my $f = $w->process($query);
ok( $f->valid('foo') );
}
# empty valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '' } );
my $f = $w->process($query);
ok( $f->valid('foo') );
is( $f->param('foo'), '', 'foo value' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada', bar => 1 } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
# Multiple Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 1, 0, 1 ], } );
my $f = $w->process($query);
ok( $f->valid('foo'), 'Valid' );
my @results = $f->param('foo');
is_deeply( \@results, [ 1, 0, 1 ], 'Multiple valid values' );
}
# Multiple Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 1, 0, 2 ], } );
my $f = $w->process($query);
ok( !$f->valid('foo'), 'foo not valid' );
ok( $f->errors('foo'), 'foo has errors' );
}
# invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => '11' } );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
}
HTML-Widget-1.11/t/constraint_time.t 0000644 0000764 0000764 00000002027 10571572142 017432 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'hour' );
$w->element( 'Textfield', 'minute' );
$w->element( 'Textfield', 'second' );
$w->constraint( 'Time', 'hour', 'minute', 'second' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( {
hour => '6',
minute => '12',
second => '9',
} );
my $f = $w->process($query);
is( $f->param('hour'), 6, 'hour value' );
is( $f->param('minute'), 12, 'minute value' );
is( $f->param('second'), 9, 'second value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( {
hour => '6',
minute => '400',
second => '5',
} );
my $f = $w->process($query);
ok( $f->errors('hour'), 'hour has errors' );
ok( $f->errors('minute'), 'minute has errors' );
ok( $f->errors('second'), 'second has errors' );
}
HTML-Widget-1.11/t/01use.t 0000644 0000764 0000764 00000000117 10571572142 015163 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 1;
use_ok('HTML::Widget');
HTML-Widget-1.11/t/lib/ 0000755 0000764 0000764 00000000000 10571575434 014617 5 ustar cafranks cafranks HTML-Widget-1.11/t/lib/HTMLWidget/ 0000755 0000764 0000764 00000000000 10571575434 016527 5 ustar cafranks cafranks HTML-Widget-1.11/t/lib/HTMLWidget/CustomConstraint.pm 0000644 0000764 0000764 00000000215 10571572141 022372 0 ustar cafranks cafranks package HTMLWidget::CustomConstraint;
use warnings;
use strict;
use base 'HTML::Widget::Constraint::Regex';
sub regex { qr/^[0-9]*$/ }
1;
HTML-Widget-1.11/t/lib/HTMLWidget/CustomFilter.pm 0000644 0000764 0000764 00000000247 10571572141 021500 0 ustar cafranks cafranks package HTMLWidget::CustomFilter;
use warnings;
use strict;
use base 'HTML::Widget::Filter';
sub filter {
my ( $self, $value ) = @_;
return lc $value;
}
1;
HTML-Widget-1.11/t/lib/HTMLWidget/TestLib.pm 0000644 0000764 0000764 00000002061 10571572141 020422 0 ustar cafranks cafranks package
HTMLWidget::TestLib;
use strict;
use warnings;
sub mock_query {
my ( $self, $query ) = @_;
return HTMLWidget::MockObject->new( $query );
}
####
package
HTMLWidget::MockObject;
use strict;
use warnings;
sub new {
my ( $class, $query ) = @_;
die "query must be a hashref"
unless ref($query) eq 'HASH';
return bless $query, $class;
}
sub param {
my ( $self, $param, $value ) = @_;
if ( @_ == 1 ) {
return keys %$self;
}
elsif ( @_ == 3 ) {
$self->{$param} = $value;
return $self->{$param};
}
else {
unless ( exists $self->{$param} ) {
return wantarray ? () : undef;
}
if ( ref $self->{$param} eq 'ARRAY' ) {
return (wantarray)
? @{ $self->{$param} }
: $self->{$param}->[0];
}
else {
return (wantarray)
? ( $self->{$param} )
: $self->{$param};
}
}
}
1;
HTML-Widget-1.11/t/lib/HTMLWidget/CustomElement.pm 0000644 0000764 0000764 00000001326 10571572141 021643 0 ustar cafranks cafranks package HTMLWidget::CustomElement;
use warnings;
use strict;
use base 'HTML::Widget::Element';
__PACKAGE__->mk_accessors(qw/comment label value/);
__PACKAGE__->mk_attr_accessors(qw/size maxlength/);
sub prepare {
my ($self) = @_;
$self->attributes->{class} = "my_tag";
}
sub containerize {
my ( $self, $w, $value, $errors ) = @_;
$value ||= $self->value;
$value = ref $value eq 'ARRAY' ? shift @$value : $value;
my $l = $self->mk_label( $w, $self->label, $self->comment, $errors );
my $i = $self->mk_input( $w, { type => 'text', value => $value }, $errors );
my $e = $self->mk_error( $w, $errors );
return $self->container( { element => $i, error => $e, label => $l } );
}
1;
HTML-Widget-1.11/t/lib/TestContainer.pm 0000644 0000764 0000764 00000001104 10571572141 017723 0 ustar cafranks cafranks
package
TestContainer;
use strict;
use warnings;
use base 'HTML::Widget::Container';
sub _build_element {
my $self = shift;
my $e = shift;
return () unless $e;
return map { $self->_build_element($_) } @{$e} if ref $e eq 'ARRAY';
my $class = $e->attr('class') || '';
$e = new HTML::Element('span', class => 'custom_fields_with_errors')->push_content($e->clone ) if $self->error && $e->tag eq 'input';
my @list;
push @list, $self->label, new HTML::Element('br') if $self->label;
push @list, $e if $e;
return @list;
}
1;
HTML-Widget-1.11/t/constraint_all.t 0000644 0000764 0000764 00000002515 10571572142 017246 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 10;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->constraint( 'All', 'foo', 'bar' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
is( $f->param('bar'), 'nada', 'bar value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada', } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( $f->errors('bar'), 'bar has errors' );
}
# Empty strings - like an empty form as submitted by Firefox - should be error
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => '',
bar => ''
} );
my $f = $w->process($query);
ok( $f->errors('foo'), 'foo has errors' );
ok( $f->errors('bar'), 'bar has errors' );
}
# "0" as a query value
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 0 } );
my $f = $w->process($query);
ok( $f->valid('foo'), 'foo valid' );
is( $f->param('foo'), 0, 'foo value' );
ok( $f->errors('bar'), 'bar has errors' );
}
HTML-Widget-1.11/t/04basic.t 0000644 0000764 0000764 00000016153 10571572142 015462 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 36;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new->method('post')->action('/foo/bar');
$w->element( 'Textfield', 'age' )->label('Age')->size(3);
$w->element( 'Textfield', 'name' )->label('Name')->size(60);
$w->element( 'Submit', 'ok' )->value('OK');
$w->legend('Fool');
$w->constraint( 'Integer', 'age' )->message('No integer.');
$w->constraint( 'Length', 'age' )->min(1)->max(3)->message('Wrong length.');
$w->constraint( 'Range', 'age' )->min(22)->max(24)->message('Wrong range.');
$w->constraint( 'Regex', 'age' )->regex(qr/\D+/)
->message('Contains digit characters.');
$w->constraint( 'Not_Integer', 'name' );
$w->constraint( 'All', 'age', 'name' )->message('Missing value.');
# Without query
{
my $f = $w->result;
is( $f->as_xml, <
EOF
}
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( {
age => 23,
name => 'sri',
ok => 'OK',
} );
my $f = $w->process($query);
isa_ok( $f, 'HTML::Widget::Result',
'Result is HTML::Widget::Result object' );
my @e = $f->has_errors;
ok( $f->valid('name'), 'Field name is valid' );
is( $e[0], 'age', 'Field age has errors' );
is( $f->valid('name'), 1, 'Field name is valid' );
is( !$f->valid('age'), 1, 'Field age is not valid' );
is( !$f->valid('foo'), 1, 'Field foo is not valid' );
is( !$f->has_errors('name'), 1, 'Field name has no errors' );
is( $f->has_errors('age'), 1, 'Field foo has errors' );
is( $f->has_error('foo'), 0, 'Field foo has no errors' );
is( $f->param('name'), 'sri', 'Param name is accessible' );
is( $f->param('age'), undef, 'Param age is not accessible' );
is( $f->param('foo'), undef, 'Param foo is not defined' );
is( $f->params->{name}, 'sri', 'Param name is defined' );
is( $f->params->{age}, undef, 'Param age is not defined' );
is( $f->parameters->{foo}, undef, 'Param foo is not defined' );
$f->add_valid( 'bar', 'dude' );
is( $f->params->{bar}, 'dude', 'Bar is dude' );
is( $f->param('bar'), 'dude', 'Bar is dude' );
is( $f->valid('bar'), 1, 'Bar is valid' );
my $c = $f->element('age');
isa_ok( $c, 'HTML::Widget::Container', 'Element is a container object' );
isa_ok( $c->element, 'HTML::Element', 'Element is a HTML::Element object' );
isa_ok( $c->error, 'HTML::Element', 'Error is a HTML::Element object' );
is( $c->javascript, '', 'JavaScript is empty' );
is( $c->element_xml, <Age
EOF
is( $c->error_xml, <Contains digit characters.
EOF
is( $c->javascript_xml, <
EOF
is( $c->as_xml, <Age
Contains digit characters.
EOF
my @errors = $f->errors;
is( $errors[0]->name, 'age', 'Expected error' );
is( $errors[0],
'Contains digit characters.',
'Field contains digit characters'
);
is( "$f", <
Contains digit characters.
EOF
}
# Embed
{
my $w2 = HTML::Widget->new('foo')->action('/foo');
my $w3 = HTML::Widget->new('bar');
$w3->element( 'Textfield', 'baz' );
$w2->embed($w);
$w2->embed($w3);
my $f = $w2->process;
is( $f->as_xml, <
EOF
}
# Merge
{
my $w2 = HTML::Widget->new('foo')->action('/foo');
my $w3 = HTML::Widget->new('bar');
$w3->element( 'Textfield', 'baz' );
$w2->merge($w);
$w2->merge($w3);
my $f = $w2->process;
is( $f->as_xml, <
EOF
}
# *_ref methods
{
my @element = $w->get_elements;
my @filter = $w->get_filters;
my @constraint = $w->get_constraints;
is_deeply( $w->get_elements_ref, \@element, 'get_elements_ref' );
is_deeply( $w->get_filters_ref, \@filter, 'get_filters_ref' );
is_deeply( $w->get_constraints_ref, \@constraint, 'get_constraints_ref' );
my $f = $w->process;
my @f_element = $f->elements;
is_deeply( $f->elements_ref, \@f_element, 'elements_ref' );
}
HTML-Widget-1.11/t/06bugs_result_params_multiple.t 0000644 0000764 0000764 00000000776 10571572142 022223 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 2;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w1 = HTML::Widget->new;
$w1->element( 'Textfield', 'foo' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => [ 'one', 'two' ], } );
my $result = $w1->process($query);
ok( $result->valid('foo'), 'foo valid' );
my $params = $result->params;
is_deeply(
$params,
{ foo => [ 'one', 'two' ] },
'$result->params is_deeply'
);
}
HTML-Widget-1.11/t/element_select_constrain_options.t 0000644 0000764 0000764 00000003134 10571572142 023053 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 7;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Select', 'foo' )->label('Foo')
->options( 0 => 'zero', 1 => 'one', 2 => 'two' )->constrain_options(1);
$w->element( 'Select', 'bar' )->label('Bar')
->options( 3 => 'three', 4 => 'four' )->constrain_values(1);
# With mocked basic query
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 1, bar => 1 } );
my $f = $w->process($query);
my @constraints = $w->get_constraints;
cmp_ok( scalar(@constraints), '==', 2, 'Two implicit IN constraints' );
cmp_ok( scalar( @{ $constraints[0]->in } ),
'==', 3, 'Three keys for constraint 0' );
cmp_ok( scalar( @{ $constraints[1]->in } ),
'==', 2, 'Two keys for constraint 1' );
ok( $f->valid('foo') );
ok( !$f->valid('bar') );
ok( $f->has_errors('bar') );
is( "$f", <
Invalid Input
EOF
}
HTML-Widget-1.11/t/constraint_dependon.t 0000644 0000764 0000764 00000002165 10571572142 020273 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 8;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Textfield', 'foo' );
$w->element( 'Textfield', 'bar' );
$w->constraint( 'DependOn', 'foo', 'bar' );
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( {
foo => 'yada',
bar => 'nada',
} );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
is( $f->param('bar'), 'nada', 'bar value' );
ok( !$f->errors, 'no errors' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { other => 'whatever' } );
my $f = $w->process($query);
ok( !$f->errors, 'no errors' );
}
# Valid
{
my $query = HTMLWidget::TestLib->mock_query( { bar => 'only' } );
my $f = $w->process($query);
is( $f->param('bar'), 'only', 'bar value' );
ok( !$f->errors, 'no errors' );
}
# Invalid
{
my $query = HTMLWidget::TestLib->mock_query( { foo => 'yada' } );
my $f = $w->process($query);
is( $f->param('foo'), 'yada', 'foo value' );
ok( $f->errors('bar'), 'bar has errors' );
}
HTML-Widget-1.11/t/element_select.t 0000644 0000764 0000764 00000005577 10571572142 017235 0 ustar cafranks cafranks use strict;
use warnings;
use Test::More tests => 6;
use HTML::Widget;
use lib 't/lib';
use HTMLWidget::TestLib;
my $w = HTML::Widget->new;
$w->element( 'Select', 'foo' )->label('Foo')
->options( foo => 'Foo', bar => 'Bar' )->selected('foo');
$w->element( 'Select', 'bar' )->options( 23 => 'Baz', yada => 'Yada' );
$w->element( 'Select', 'stool' )->options( 1 => 'one', 2 => 'two' )->size(2);
$w->element( 'Select', 'pigeon' )->options( 3 => 'three', 4 => 'four' )
->multiple(1)->selected('4');
$w->constraint( 'Integer', 'foo' );
$w->constraint( 'Integer', 'stool' );
# Without query
{
my $f = $w->process;
is( "$f", <
[% END %]
# XML output looks like this (easy to theme with css)
=head1 DESCRIPTION
Create easy to maintain HTML widgets!
Everything is optional, use validation only or just generate forms,
you can embed and merge them later.
The API was designed similar to other popular modules like
L and L,
L is also built in (and much faster).
This Module is very powerful, don't misuse it as a template system!
=head1 METHODS
=head2 new
Arguments: $name, \%attributes
Return Value: $widget
Create a new HTML::Widget object. The name parameter will be used as the
id of the form created by the to_xml method.
The C argument is equivalent to using the L
method.
=cut
sub new {
my ( $self, $name, $attrs ) = @_;
$self = bless {}, ( ref $self || $self );
$self->container('form');
$self->subcontainer('fieldset');
$self->name( defined $name ? $name : 'widget' );
if ( defined $attrs ) {
croak 'attributes argument must be a hash-reference'
if ref($attrs) ne 'HASH';
$self->attributes->{$_} = $attrs->{$_} for keys %$attrs;
}
return $self;
}
=head2 action
Arguments: $uri
Return Value: $uri
Get/Set the action associated with the form. The default is no action,
which causes most browsers to submit to the current URI.
=head2 attributes
=head2 attrs
Arguments: %attributes
Arguments: \%attributes
Return Value: $widget
Arguments: none
Return Value: \%attributes
Accepts either a list of key/value pairs, or a hash-ref.
$w->attributes( $key => $value );
$w->attributes( { $key => $value } );
Returns the C<$widget> object, to allow method chaining.
As of v1.10, passing a hash-ref no longer deletes current
attributes, instead the attributes are added to the current attributes
hash.
This means the attributes hash-ref can no longer be emptied using
C<< $w->attributes( { } ); >>. Instead, you may use
C<< %{ $w->attributes } = (); >>.
As a special case, if no arguments are passed, the return value is a
hash-ref of attributes instead of the object reference. This provides
backwards compatability to support:
$w->attributes->{key} = $value;
L is an alias for L.
=head2 container
Arguments: $tag
Return Value: $tag
Get/Set the tag used to contain the XML output when as_xml is called on the
HTML::Widget object.
Defaults to C