397 lines
12 KiB
Perl
397 lines
12 KiB
Perl
# vim:syntax=perl
|
|
#-------------------------------------------------------------------
|
|
# WebGUI is Copyright 2001-2012 Plain Black Corporation.
|
|
#-------------------------------------------------------------------
|
|
# Please read the legal notices (docs/legal.txt) and the license
|
|
# (docs/license.txt) that came with this distribution before using
|
|
# this software.
|
|
#------------------------------------------------------------------
|
|
# http://www.plainblack.com info@plainblack.com
|
|
#------------------------------------------------------------------
|
|
|
|
# Write a little about what this script tests.
|
|
#
|
|
#
|
|
|
|
use warnings;
|
|
use strict;
|
|
use Test::More;
|
|
use Test::Deep;
|
|
use WebGUI::Test; # Must use this before any other WebGUI modules
|
|
use WebGUI::Session;
|
|
use WebGUI::BestPractices;
|
|
|
|
use Carp;
|
|
$SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Init
|
|
my $session = WebGUI::Test->session;
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Tests
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Constructor and properties
|
|
use_ok( 'WebGUI::FormBuilder' );
|
|
|
|
my $fb = WebGUI::FormBuilder->new( $session );
|
|
isa_ok( $fb, 'WebGUI::FormBuilder' );
|
|
is( $fb->method, 'POST', 'method default' );
|
|
ok( !$fb->action, 'action default' );
|
|
is( $fb->enctype, 'multipart/form-data', 'enctype default' );
|
|
ok( !$fb->name, 'name default' );
|
|
|
|
$fb = WebGUI::FormBuilder->new( $session,
|
|
action => '/myurl',
|
|
enctype => 'application/x-www-form-urlencoded',
|
|
name => 'search',
|
|
method => 'get',
|
|
extras => q{onclick="alert('hi');"},
|
|
);
|
|
isa_ok( $fb, 'WebGUI::FormBuilder' );
|
|
is( $fb->method, 'get' );
|
|
is( $fb->action, '/myurl' );
|
|
is( $fb->enctype, 'application/x-www-form-urlencoded' );
|
|
is( $fb->name, 'search' );
|
|
is( $fb->extras, q{onclick="alert('hi');"} );
|
|
|
|
# Test mutators
|
|
is( $fb->method("POST"), "POST" );
|
|
is( $fb->method, "POST" );
|
|
is( $fb->action('/otherurl'), '/otherurl' );
|
|
is( $fb->action, '/otherurl' );
|
|
is( $fb->enctype('multipart/form-data'), 'multipart/form-data' );
|
|
is( $fb->enctype, 'multipart/form-data' );
|
|
is( $fb->name('myname'), 'myname' );
|
|
is( $fb->name, 'myname' );
|
|
is( $fb->extras(""), "" );
|
|
is( $fb->extras, "" );
|
|
|
|
# getHeader
|
|
like( $fb->getHeader, qr{ method="POST"} );
|
|
like( $fb->getHeader, qr{ action="/otherurl"} );
|
|
like( $fb->getHeader, qr{ enctype="multipart/form-data"} );
|
|
like( $fb->getHeader, qr{ name="myname"} );
|
|
|
|
$fb->extras(q{onclick="alert()"});
|
|
like( $fb->getHeader, qr{ onclick="alert\(\)"} );
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Adding objects
|
|
# -- This tests the HasTabs, HasFieldsets, and HasFields roles
|
|
|
|
# addTab with properties
|
|
my $tab = $fb->addTab( name => "mytab", label => "My Tab" );
|
|
isa_ok( $tab, 'WebGUI::FormBuilder::Tab' );
|
|
is( $fb->getTab('mytab'), $tab, 'getTab returns exact object' );
|
|
is( $fb->tabsets, $fb->tabsets, 'tabsets always returns same arrayref' );
|
|
cmp_deeply(
|
|
$fb->tabsets,
|
|
[ $fb->getTabset( "default" ) ],
|
|
'tabsets',
|
|
);
|
|
cmp_deeply(
|
|
$fb->tabsets->[0]->tabs,
|
|
[ $tab ],
|
|
'tabs',
|
|
);
|
|
|
|
# addTab with objects
|
|
my $field = $tab->addField(
|
|
'WebGUI::Form::Text' => (
|
|
name => 'search',
|
|
value => "Search Now",
|
|
)
|
|
);
|
|
my $fset = $tab->addFieldset(
|
|
name => 'advanced',
|
|
label => 'Advanced Search',
|
|
);
|
|
my $subtab = $tab->addTab(
|
|
name => 'more',
|
|
label => 'More',
|
|
);
|
|
|
|
my $newTab = $fb->addTab( $tab, name => 'newname' );
|
|
isa_ok( $newTab, 'WebGUI::FormBuilder::Tab' );
|
|
isnt( $newTab, $tab, 'addTab creates a new object from the properties' );
|
|
is( $newTab->name, 'newname', 'addTab allows property overrides' );
|
|
is( $newTab->label, 'My Tab', 'label was not overridden' );
|
|
ok( $newTab->fields->[0], 'field exists' );
|
|
is( $newTab->fields->[0]->get('name'), 'search', 'field has same name' );
|
|
ok( $newTab->fieldsets->[0], 'fieldset exists' );
|
|
is( $newTab->fieldsets->[0]->name, 'advanced', 'fieldset has same name' );
|
|
ok( $newTab->tabsets->[0], 'subtabset exists' );
|
|
is( $newTab->tabsets->[0]->name, 'default', 'subtabset has correct name' );
|
|
ok( $newTab->tabsets->[0]->tabs->[0], 'subtab exists' );
|
|
is( $newTab->tabsets->[0]->tabs->[0]->name, 'more', 'subtab has correct name' );
|
|
|
|
cmp_deeply(
|
|
$fb->tabsets->[0]->tabs,
|
|
[ $tab, $newTab ],
|
|
'added tab',
|
|
);
|
|
is( $fb->getTab('newname'), $newTab, 'new tab can be gotten' );
|
|
|
|
# deleteTab
|
|
my $deletedTab = $fb->deleteTab( 'newname' );
|
|
is( $deletedTab, $newTab, 'deleteTab returns object' );
|
|
cmp_deeply(
|
|
$fb->tabsets->[0]->tabs,
|
|
[ $tab ],
|
|
'deleted tab',
|
|
);
|
|
ok( !$fb->getTab('newname'), 'deleted tab cannot be gotten' );
|
|
|
|
# addFieldset with properties
|
|
$fb = WebGUI::FormBuilder->new( $session );
|
|
$fset = $fb->addFieldset(
|
|
name => 'advanced',
|
|
label => 'Advanced Search',
|
|
);
|
|
is( $fb->getFieldset('advanced'), $fset, 'getFieldset returns exact object' );
|
|
is( $fb->fieldsets, $fb->fieldsets, 'fieldsets always returns same arrayref' );
|
|
cmp_deeply(
|
|
$fb->fieldsets,
|
|
[ $fset ],
|
|
'fieldsets',
|
|
);
|
|
|
|
# addFieldset with objects
|
|
$field = $fset->addField(
|
|
'WebGUI::Form::Text' => (
|
|
name => 'search',
|
|
value => "Search Now",
|
|
)
|
|
);
|
|
my $subfset = $fset->addFieldset(
|
|
name => 'advanced',
|
|
label => 'Advanced Search',
|
|
);
|
|
$tab = $fset->addTab(
|
|
name => 'more',
|
|
label => 'More',
|
|
);
|
|
|
|
my $newFset = $fb->addFieldset( $fset, name => 'newname' );
|
|
isa_ok( $newFset, 'WebGUI::FormBuilder::Fieldset' );
|
|
isnt( $newFset, $fset, 'addFieldset creates a new object from the properties' );
|
|
is( $newFset->name, 'newname', 'addFieldset allows property overrides' );
|
|
is( $newFset->label, 'Advanced Search', 'label was not overridden' );
|
|
ok( $newFset->fields->[0], 'field exists' );
|
|
is( $newFset->fields->[0]->get('name'), 'search', 'field has same name' );
|
|
ok( $newFset->fieldsets->[0], 'subfieldset exists' );
|
|
is( $newFset->fieldsets->[0]->name, 'advanced', 'subfieldset has same name' );
|
|
ok( $newFset->tabsets->[0]->tabs->[0], 'tab exists' );
|
|
is( $newFset->tabsets->[0]->tabs->[0]->name, 'more', 'tab has same name' );
|
|
cmp_deeply(
|
|
$fb->fieldsets,
|
|
[ $fset, $newFset],
|
|
'added fieldset',
|
|
);
|
|
is( $fb->getFieldset('newname'), $newFset, 'new fieldset can be gotten' );
|
|
|
|
# deletefieldset
|
|
my $deletedFieldset = $fb->deleteFieldset( 'newname' );
|
|
is( $deletedFieldset, $newFset, 'deletefieldset returns object' );
|
|
cmp_deeply(
|
|
$fb->fieldsets,
|
|
[ $fset ],
|
|
'deleted fieldset',
|
|
);
|
|
ok( !$fb->getFieldset('newname'), 'deleted fieldset cannot be gotten' );
|
|
|
|
# addField with properties
|
|
$fb = WebGUI::FormBuilder->new( $session );
|
|
$field = $fb->addField(
|
|
'Text' => (
|
|
name => 'search',
|
|
value => 'Search Now',
|
|
)
|
|
);
|
|
|
|
isa_ok( $field, 'WebGUI::Form::Text' );
|
|
is( $fb->getField('search'), $field, 'getField returns exact object' );
|
|
is( $fb->fields, $fb->fields, 'fields always returns same arrayref' );
|
|
cmp_deeply(
|
|
$fb->fields,
|
|
[ $field ],
|
|
'fields',
|
|
);
|
|
|
|
# addField with object
|
|
my $field2 = $fb->addField(
|
|
WebGUI::Form::Text->new( $session, {
|
|
name => 'type',
|
|
label => "Asset Type",
|
|
} )
|
|
);
|
|
isa_ok( $field2, 'WebGUI::Form::Text' );
|
|
is( $fb->getField('type'), $field2, 'getField returns exact object' );
|
|
cmp_deeply(
|
|
$fb->fields,
|
|
[ $field, $field2 ],
|
|
'fields 2',
|
|
);
|
|
|
|
# deleteField
|
|
my $field3 = $fb->deleteField( 'type' );
|
|
is( $field3, $field2, 'deleteField returns same field' );
|
|
ok( !$fb->getField('type'), 'field is deleted' );
|
|
cmp_deeply(
|
|
$fb->fields,
|
|
[ $field ],
|
|
'field is deleted from fields',
|
|
);
|
|
|
|
# addFieldAt
|
|
$fb = WebGUI::FormBuilder->new( $session );
|
|
$field = $fb->addField( 'Text', name => "zero" );
|
|
|
|
$tab = $fb->addTab( tabset => 'one', name => 'one' );
|
|
$fset = $fb->addFieldset( name => 'three', label => 'Three' );
|
|
$field2 = $fb->addFieldAt( WebGUI::Form::Text->new( $session, name => "two" ), 2 );
|
|
|
|
cmp_deeply(
|
|
$fb->objects,
|
|
[ $field, $fb->getTabset('one'), $field2, $fset ],
|
|
'objects array is correct',
|
|
);
|
|
cmp_deeply(
|
|
$fb->fields,
|
|
[ $field, $field2 ],
|
|
'fields array is correct',
|
|
);
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Serialize and deserialize
|
|
|
|
$fb = WebGUI::FormBuilder->new( $session );
|
|
$fset = $fb->addFieldset( name => 'search', label => 'Search' );
|
|
$fset->addField( 'text', name => 'keywords', label => 'Keywords' );
|
|
$tab = $fb->addTab( name => 'advanced', label => 'Advanced Search' );
|
|
$tab->addField( 'text', name => 'type', label => 'Type' );
|
|
$fb->addField( 'submit', name => 'submit', label => 'Submit' );
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
# toTemplateVars
|
|
|
|
$fb = WebGUI::FormBuilder->new( $session );
|
|
$field = $fb->addField( 'Text', name => 'field1' );
|
|
my $fieldset = $fb->addFieldset( name => 'two', label => 'Two' );
|
|
my $fieldsetField = $fieldset->addField( 'Text', name => 'two one' );
|
|
$tab = $fb->addTab( name => 'three 1', label => 'Three 1' );
|
|
$tab->addField( 'Text', name => 'three 1 1' );
|
|
my $tab2 = $fb->addTab( name => 'three 2', label => 'Three 2' );
|
|
$tab2->addField( 'Checkbox', name => 'three 2 1' );
|
|
$tab2->addField( 'Checkbox', name => 'three 2 1' );
|
|
$field2 = $fb->addField( 'Submit', name => 'submit' );
|
|
$field3 = $fb->addField( 'Button', name => 'cancel' );
|
|
|
|
my $expected_var = {
|
|
header => $fb->getHeader,
|
|
footer => $fb->getFooter,
|
|
%{ object_vars( $fb ) },
|
|
};
|
|
|
|
# Add the prefix
|
|
$expected_var = { map { ("fb_$_" => delete $expected_var->{$_}) } keys %$expected_var };
|
|
|
|
cmp_deeply(
|
|
$fb->toTemplateVars('fb_'),
|
|
$expected_var,
|
|
'toTemplateVars complete and correct'
|
|
);
|
|
|
|
done_testing;
|
|
|
|
sub field_vars {
|
|
my $field = shift;
|
|
my $var = {
|
|
field => $field->toHtmlWithWrapper,
|
|
field_input => $field->toHtml,
|
|
%{$field->toTemplateVars}, # not testing field's toTemplateVars method
|
|
};
|
|
return $var;
|
|
}
|
|
|
|
sub fieldset_vars {
|
|
my $fieldset = shift;
|
|
return {
|
|
name => $fieldset->name,
|
|
label => $fieldset->label,
|
|
legend => $fieldset->legend,
|
|
isFieldset => 1,
|
|
%{object_vars( $fieldset )},
|
|
};
|
|
}
|
|
|
|
sub tabset_vars {
|
|
my $tabset = shift;
|
|
my $var = {
|
|
name => $tabset->name,
|
|
isTabset => 1,
|
|
tabs => [ map { { %{object_vars( $_ )}, name => $_->name, label => $_->label } } @{$tabset->tabs} ],
|
|
};
|
|
for my $tab ( @{ $var->{tabs} } ) {
|
|
my $name = $tab->{name};
|
|
$var->{ "tabs_${name}" } = ignore(); # Ignore html for tabs, just as long as it's there
|
|
for my $key ( keys %$tab ) {
|
|
$var->{ "tabs_${name}_${key}" } = $tab->{ $key };
|
|
}
|
|
}
|
|
return $var;
|
|
}
|
|
|
|
sub object_vars {
|
|
my $f = shift;
|
|
my $var = {};
|
|
|
|
# Stream of objects
|
|
for my $obj ( @{$f->objects} ) {
|
|
use Scalar::Util qw(blessed);
|
|
given ( blessed $obj ) {
|
|
when ( undef ) {
|
|
push @{$var->{objects}}, $obj;
|
|
}
|
|
when ( $_->isa( 'WebGUI::FormBuilder::Tabset' ) ) {
|
|
my $props = tabset_vars( $obj );
|
|
my $name = $props->{name};
|
|
for my $key ( keys %$props ) {
|
|
$var->{ "tabset_${name}_${key}" } = $props->{$key};
|
|
}
|
|
push @{ $var->{tabsetloop} }, $props;
|
|
push @{$var->{objects}}, $props;
|
|
}
|
|
when ( $_->isa( 'WebGUI::FormBuilder::Fieldset' ) ) {
|
|
my $props = fieldset_vars( $obj );
|
|
my $name = $props->{name};
|
|
for my $key ( keys %$props ) {
|
|
$var->{ "fieldset_${name}_${key}" } = $props->{$key};
|
|
}
|
|
push @{ $var->{fieldsetloop} }, $props;
|
|
push @{$var->{objects}}, $props;
|
|
}
|
|
when ( $_->isa( 'WebGUI::Form::Control' ) ) {
|
|
my $props = field_vars( $obj );
|
|
my $name = $props->{name};
|
|
for my $key ( keys %$props ) {
|
|
$var->{ "field_${name}_${key}" } = $props->{$key};
|
|
}
|
|
push @{$var->{ "field_${name}_loop" }}, $props;
|
|
push @{ $var->{fieldloop} }, $props;
|
|
$var->{ "field_${name}" } = $props->{field};
|
|
push @{$var->{objects}}, $props;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $var;
|
|
}
|
|
|
|
#vim:ft=perl
|
|
|
|
|