diff --git a/lib/WebGUI/Definition/Asset.pm b/lib/WebGUI/Definition/Asset.pm index 1f532aec1..86aa0dedf 100644 --- a/lib/WebGUI/Definition/Asset.pm +++ b/lib/WebGUI/Definition/Asset.pm @@ -18,7 +18,9 @@ use strict; use warnings; use 5.010; use base qw(WebGUI::Definition); + use WebGUI::International; +use WebGUI::Exception; our $VERSION = '0.0.1'; @@ -28,10 +30,23 @@ sub import { return; } my $definition = (@_ == 1 && ref $_[0]) ? $_[0] : { @_ }; + + my $table = $definition->{tableName} + || WebGUI::Error::InvalidParam->throw(param => 'tableName'); + if ( my $properties = $definition->{properties} ) { - my $table = $definition->{tableName}; - for ( my $i = 1; $i < @{ $properties }; $i += 2) { - $properties->[$i]{tableName} ||= $table; + for ( my $i = 0; $i < $#{ $properties }; $i += 2) { + my ($name, $value) = @{ $properties }[$i, $i + 1]; + $value->{tableName} ||= $table; + if ( ! $value->{tableName}|| ref $value->{tableName}) { + WebGUI::Error::InvalidParam->throw(param => 'tableName'); + } + elsif ( ! $value->{fieldType} || ref $value->{fieldType}) { + WebGUI::Error::InvalidParam->throw(param => 'fieldType'); + } + elsif ( ( ! $value->{noFormPost} || ref $value->{noFormPost} ) && ! $value->{label}) { + WebGUI::Error::InvalidParam->throw(param => 'label'); + } } } diff --git a/t/Definition/Asset.t b/t/Definition/Asset.t index c61dcf528..cbe8637da 100644 --- a/t/Definition/Asset.t +++ b/t/Definition/Asset.t @@ -16,6 +16,7 @@ use FindBin; use lib "$FindBin::Bin/../lib"; use Test::More 'no_plan'; #tests => 1; +use Test::Exception; use WebGUI::Test; { @@ -25,13 +26,16 @@ use WebGUI::Test; tableName => 'mytable', properties => [ showInForms => { + fieldType => 'Text', label => ['show in forms'], }, confirmChange => { + fieldType => 'Text', label => ['confirm change', 'Asset'], tableName => 'othertable', }, noTrans => { + fieldType => 'Text', label => 'this label will not be translated', }, ], @@ -56,3 +60,64 @@ is $object->getProperty('confirmChange')->{label}, 'Are you sure?', is $object->getProperty('noTrans')->{label}, 'this label will not be translated', q{getProperty doesn't internationalize plain scalars}; +{ + package WGT::Class2; + use Test::Exception; + throws_ok { WebGUI::Definition::Asset->import( + properties => [], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when no tableName specified'; + throws_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + label => 'label', + }, + ], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when no fieldType specified'; + throws_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + fieldType => sub { return 'Text' }, + label => 'label', + }, + ], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when dynamic fieldType specified'; + throws_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + tableName => sub { return 'othertable' }, + fieldType => 'Text', + label => 'label', + }, + ], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when dynamic tableName specified'; + throws_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + fieldType => 'Text', + }, + ], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when no label specified'; + throws_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + fieldType => 'Text', + noFormPost => sub { 1 }, + }, + ], + ) } 'WebGUI::Error::InvalidParam', 'Exception thrown when no label and noFormPost is dynamic'; + lives_ok { WebGUI::Definition::Asset->import( + tableName => 'mytable', + properties => [ + 'property1' => { + fieldType => 'Text', + noFormPost => 1, + }, + ], + ) } 'Allows no label when noFormPost specified'; +} +