diff --git a/lib/WebGUI/ProfileField.pm b/lib/WebGUI/ProfileField.pm index 9ee3dc6e4..25dcc28c7 100755 --- a/lib/WebGUI/ProfileField.pm +++ b/lib/WebGUI/ProfileField.pm @@ -228,6 +228,10 @@ form. =cut +# FIXME This would be better if it returned an OBJECT not the HTML +# TODO add a toHtml sub to take the place of this sub and a getFormControl +# And refactor to not require all these arguments HERE but rather in the +# constructor or something... sub formField { my $self = shift; my $properties = $self->formProperties(shift); @@ -245,9 +249,8 @@ sub formField { # start with specified (or current) user's data. previous data needed by some form types as well (file). $properties->{value} = $u->profileField($self->getId); # use submitted data if it exists - # FIXME Is $properties->{name} or $self->getId the correct way to get the form name? - if (defined $self->session->form->process($properties->{name}, $self->get("fieldType"))) { - $properties->{value} = $self->session->form->process($self->getId,$self->get("fieldType"), undef, $properties); + if ($self->formProcess($u) != $self->get('dataDefault')) { + $properties->{value} = $self->formProcess($u); } # fall back on default if(!defined $properties->{value}) { @@ -768,6 +771,7 @@ sub setCategory { $self->_reorderFields($categoryId); } + 1; diff --git a/lib/WebGUI/User.pm b/lib/WebGUI/User.pm index b392cced4..b518fb8a0 100644 --- a/lib/WebGUI/User.pm +++ b/lib/WebGUI/User.pm @@ -18,6 +18,7 @@ use strict; use WebGUI::Cache; use WebGUI::Group; use WebGUI::DatabaseLink; +use WebGUI::Exception; use WebGUI::Utility; use WebGUI::Operation::Shared; @@ -61,6 +62,9 @@ These methods are available from this class: =cut #------------------------------------------------------------------- +# TODO This stays like this until we can break API, just in case somebody +# doesn't realize that _ means private. +# After API unfreeze, put this in the WebGUI::User->create routine sub _create { my $session = shift; my $userId = shift || $session->id->generate(); @@ -157,6 +161,31 @@ sub authMethod { #------------------------------------------------------------------- +=head2 create ( session, [userId] ) + +Create a new user. C is an option user ID to give the new user. +Returns the newly created WebGUI::User object. + +=cut + +sub create { + my $class = shift; + my $session = shift; + my $userId = shift; + + if ( !ref $session || !$session->isa( 'WebGUI::Session' ) ) { + WebGUI::Error::InvalidObject->throw( + expected => "WebGUI::Session", + got => (ref $session), + error => q{Must provide a session variable}, + ); + } + + return WebGUI::User->new( $session, "new", $userId ); +} + +#------------------------------------------------------------------- + =head2 cache ( ) Saves the user object into the cache. diff --git a/t/ProfileField.t b/t/ProfileField.t new file mode 100644 index 000000000..9c234c314 --- /dev/null +++ b/t/ProfileField.t @@ -0,0 +1,84 @@ +# vim:syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2008 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 +#------------------------------------------------------------------ + +# This test the WebGUI::ProfileField object +# +# + +use FindBin; +use strict; +use lib "$FindBin::Bin/lib"; +use Test::More; +use WebGUI::Test; # Must use this before any other WebGUI modules +use WebGUI::Session; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; + +my $newUser = WebGUI::User->create( $session ); + +#---------------------------------------------------------------------------- +# Tests + +plan tests => 17; # Increment this number for each test you create + +#---------------------------------------------------------------------------- +# Test the creation of ProfileField +use_ok( 'WebGUI::ProfileField' ); + +is( WebGUI::ProfileField->new( $session ), undef, 'new() returns undef with no id' ); +is( WebGUI::ProfileField->new( $session, 'op'), undef, 'new() returns undef with reserved field ID "op"' ); +is( WebGUI::ProfileField->new( $session, 'func' ), undef, 'new() returns undef with reserved field ID "func"' ); +is( WebGUI::ProfileField->new( $session, 'fjnwsifkmamdiwjen' ), undef, 'new() returns undef with field ID not found' ); +my $aliasField; +ok( $aliasField = WebGUI::ProfileField->new( $session, 'alias' ), 'field "alias" instantiated' ); +isa_ok( $aliasField, 'WebGUI::ProfileField' ); + +my $uilevelField; +ok( $uilevelField = WebGUI::ProfileField->new( $session, 'uiLevel' ), 'field "uiLevel instantiated' ); +isa_ok( $uilevelField, 'WebGUI::ProfileField' ); + +#---------------------------------------------------------------------------- +# Test the formField method + +my $ff = undef; +my $ffvalue = undef; +ok( $ff = $aliasField->formField, 'formField method returns something, alias field, session user' ); +$ffvalue = $session->user->profileField('alias'); +like( $ff, qr/$ffvalue/, 'html returned contains value, alias field, session user' ); + +$ff = undef; +$ffvalue = undef; +ok( $ff = $uilevelField->formField, 'formField method returns something, uiLevel field, session user' ); +$ffvalue = $session->user->profileField('uiLevel'); +like( $ff, qr/value="$ffvalue"[^>]+selected/, 'html returned contains value, uiLevel field, session user' ); + +# Test with a newly created user that has no profile fields filled in +$ff = undef; +$ffvalue = undef; +ok( $ff = $aliasField->formField(undef, undef, $newUser), 'formField method returns something, alias field, defaulted user' ); +my $ffvalue = $newUser->profileField('alias'); +like( $ff, qr/$ffvalue/, 'html returned contains value, alias field, defaulted user' ); + +$ff = undef; +$ffvalue = undef; +ok( $ff = $uilevelField->formField(undef, undef, $newUser), 'formField method returns something, uiLevel field, defaulted user' ); +my $ffvalue = $newUser->profileField('uiLevel'); +like( $ff, qr/$ffvalue/, 'html returned contains value, uiLevel field, defaulted user' ); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $newUser->delete; +} + + diff --git a/t/User.t b/t/User.t index 66f781435..f5e9acd59 100644 --- a/t/User.t +++ b/t/User.t @@ -20,7 +20,7 @@ use WebGUI::Cache; use WebGUI::User; use WebGUI::ProfileField; -use Test::More tests => 140; # increment this value for each test you create +use Test::More tests => 143; # increment this value for each test you create use Test::Deep; my $session = WebGUI::Test->session; @@ -620,8 +620,26 @@ cmp_bag( 'getGroupIdsRecursive returns the correct set of groups, ignoring expire date and not duplicating groups' ); + +#---------------------------------------------------------------------------- +# Test the new create() method +SKIP: { + eval{ require Test::Exception; import Test::Exception }; + skip 1, 'Test::Exception not found' if $@; + + throws_ok( sub{ WebGUI::User->create }, 'WebGUI::Error::InvalidObject', + 'create() throws if no session passed' + ); +}; + +ok( my $newCreateUser = WebGUI::User->create( $session ), + 'create() returns something' +); +isa_ok( $newCreateUser, 'WebGUI::User', 'create() returns a WebGUI::User' ); + + END { - foreach my $account ($user, $dude, $buster, $buster3, $neighbor, $friend, $newFish) { + foreach my $account ($user, $dude, $buster, $buster3, $neighbor, $friend, $newFish, $newCreateUser) { (defined $account and ref $account eq 'WebGUI::User') and $account->delete; }