From: <chr...@us...> - 2006-04-21 00:20:38
|
Revision: 846 Author: chromatic Date: 2006-04-20 17:20:21 -0700 (Thu, 20 Apr 2006) ViewCVS: http://svn.sourceforge.net/everydevel/?rev=846&view=rev Log Message: ----------- r15990@windwheel: chromatic | 2006-04-20 17:20:09 -0700 Ported user node tests to Test::Class. Updated Build.PL with new dependencies on SUPER and Test::MockObject::Extends. Modified Paths: -------------- trunk/ebase/Build.PL trunk/ebase/MANIFEST trunk/ebase/lib/Everything/Node/Test/node.pm trunk/ebase/lib/Everything/Node/user.pm trunk/ebase/t/Node/user.t Added Paths: ----------- trunk/ebase/lib/Everything/Node/Test/user.pm Property Changed: ---------------- trunk/ebase/ Property changes on: trunk/ebase ___________________________________________________________________ Name: svk:merge - a6810612-c0f9-0310-9d3e-a9e4af8c5745:/ebase/offline:15762 + a6810612-c0f9-0310-9d3e-a9e4af8c5745:/ebase/offline:15990 Modified: trunk/ebase/Build.PL =================================================================== --- trunk/ebase/Build.PL 2006-04-15 00:44:59 UTC (rev 845) +++ trunk/ebase/Build.PL 2006-04-21 00:20:21 UTC (rev 846) @@ -35,11 +35,12 @@ 'Mail::Address' => 1.53, 'Mail::Sender' => 0, 'Scalar::Util' => 1.01, + 'SUPER' => 1.12, }, build_requires => { 'Test::Class' => 0.11, - 'Test::MockObject' => 0.11, + 'Test::MockObject' => 1.05, 'Test::Exception' => 0.13, 'Test::Simple' => 0.47, }, Modified: trunk/ebase/MANIFEST =================================================================== --- trunk/ebase/MANIFEST 2006-04-15 00:44:59 UTC (rev 845) +++ trunk/ebase/MANIFEST 2006-04-21 00:20:21 UTC (rev 846) @@ -89,6 +89,7 @@ lib/Everything/Node/workspace.pm lib/Everything/Node/Test/node.pm lib/Everything/Node/Test/nodetype.pm +lib/Everything/Node/Test/user.pm lib/Everything/Nodeball.pm lib/Everything/NodeBase.pm lib/Everything/NodeBase/mysql.pm Modified: trunk/ebase/lib/Everything/Node/Test/node.pm =================================================================== --- trunk/ebase/lib/Everything/Node/Test/node.pm 2006-04-15 00:44:59 UTC (rev 845) +++ trunk/ebase/lib/Everything/Node/Test/node.pm 2006-04-21 00:20:21 UTC (rev 846) @@ -11,9 +11,10 @@ use Scalar::Util 'reftype'; +local *Everything::Node::SUPER = \&UNIVERSAL::SUPER; sub node_class { 'Everything::Node::node' } -sub startup :Test( startup => 4 ) +sub startup :Test( startup => 3 ) { my $self = shift; $self->{errors} = []; @@ -38,14 +39,20 @@ use_ok( $module ) or exit; - ok( $module->isa( 'Everything::Node' ), - "$module should extend Everything::Node" ); - # now test that C<new()> works can_ok( $module, 'new' ); isa_ok( $module->new(), $module ); } +sub test_extends :Test( 1 ) +{ + my $self = shift; + my $module = $self->node_class(); + + ok( $module->isa( 'Everything::Node' ), + "$module should extend Everything::Node" ); +} + sub test_dbtables :Test( 2 ) { my $self = shift; Added: trunk/ebase/lib/Everything/Node/Test/user.pm =================================================================== --- trunk/ebase/lib/Everything/Node/Test/user.pm (rev 0) +++ trunk/ebase/lib/Everything/Node/Test/user.pm 2006-04-21 00:20:21 UTC (rev 846) @@ -0,0 +1,226 @@ +package Everything::Node::Test::user; + +use strict; +use warnings; + +use SUPER; +use Scalar::Util 'reftype'; + +use Test::More; + +*Everything::Node::user::SUPER = \&UNIVERSAL::SUPER; + +use base 'Everything::Node::Test::node'; + +sub node_class { 'Everything::Node::user' } + +sub test_extends :Test( +1 ) +{ + my $self = shift; + my $module = $self->node_class(); + ok( $module->isa( 'Everything::Node::setting' ), + "$module should extend setting node" ); + $self->SUPER(); +} + +sub test_dbtables :Test( 2 ) +{ + my $self = shift; + my $node = $self->{node}; + my @result = $node->dbtables(); + is( $result[0], 'user', 'dbtables() should return array of user...' ); + is( $result[1], 'document', '... and document as first tables' ); +} + +sub test_insert :Test( 5 ) +{ + my $self = shift; + my $node = $self->{node}; + + $node->set_series( -SUPER => 0, 10, 10 ) + ->set_true( 'update' ); + + $node->{title} = 'foo'; + + ok( ! $node->insert( 'user' ), + 'insert() should return false if SUPER call fails' ); + + is( $node->insert( 'user' ), 10, + '... should return inserted node_id on success' ); + + my ( $method, $args ) = $node->next_call(); + is( $method, 'update', '... then calling update()' ); + is( $args->[1], 'user', '... with the user' ); + is( $node->{author_user}, 10, + '... and seting "author_user" to inserted node_id' ); +} + +sub test_insert_restrict_dupes :Test( +0 ) +{ + my $self = shift; + my $node = $self->{node}; + $node->set_true( -update ); + $self->SUPER(); +} + +sub test_insert_restrictions :Test( +0 ) +{ + my $self = shift; + my $node = $self->{node}; + $node->set_true( -update ); + $self->SUPER(); +} + +sub test_is_god :Test( 3 ) +{ + my $self = shift; + my $node = $self->{node}; + my $db = $self->{mock_db}; + + $db->set_series( getNode => 0, ($node) x 2 ); + $node->set_always( inGroup => 'inGroup' ) + ->set_always( inGroupFast => 'inGroupFast' ); + + ok( ! $node->isGod(), + 'isGod() should return false unless it can find gods usergroup' ); + + is( $node->isGod(), 'inGroupFast', + '... should call inGroupFast() without recurse flag' ); + is( $node->isGod( 1 ), 'inGroup', '... and inGroup() with it' ); +} + +sub test_is_guest :Test( 4 ) +{ + my $self = shift; + my $node = $self->{node}; + my $db = $self->{mock_db}; + + my @newnodes = + ( + bless( { guest_user => 0 }, 'FakeNode' ), + bless( { guest_user => 1 }, 'FakeNode' ) + ); + + $db->set_series( getNode => 0, ($node) x 2 ); + $node->set_series( getVars => undef, @newnodes ); + + ok( $node->isGuest(), + 'isGuest() should return true unless it can get system settings node' ); + + ok( $node->isGuest(), + '... should return true unless it can get system settings node' ); + + $node->{node_id} = 1; + + ok( ! $node->isGuest(), '... should return false unless node_ids match' ); + ok( $node->isGuest(), '... and true if they do' ); +} + +sub test_get_node_keys :Test( +5 ) +{ + my $self = shift; + my $node = $self->{node}; + my %keys = map { $_ => 1 } qw( passwd lasttime title foo_id ); + + $node->set_always( getNodeDatabaseHash => \%keys ); + + my $keys = $node->getNodeKeys(); + is( reftype($keys), 'HASH', 'getNodeKeys() should return a hash' ); + is( $keys->{passwd}, 1, '... not deleting password if not exporting' ); + is( $keys->{lasttime}, 1, '... nor time of most recent activity' ); + + $keys = $node->getNodeKeys( 1 ); + ok( !exists $keys->{passwd}, '... but should delete "passwd"' ); + ok( !exists $keys->{lasttime}, '... and "lasttime" if exporting' ); + $self->SUPER(); +} + +sub test_verify_field_update :Test( 5 ) +{ + my $self = shift; + my $node = $self->{node}; + + for my $field (qw( title karma lasttime )) + { + ok( ! $node->verifyFieldUpdate( $field ), + "verifyFieldUpdate should return false for '$field' field" ); + } + + $node->set_series( SUPER => 1, 0 ); + + ok( $node->verifyFieldUpdate( 'absent' ), + '... should return false if SUPER() call does' ); + + ok( !$node->verifyFieldUpdate( 'title' ), + '... and false if field is restricted here, but not in parent' ); +} + +sub test_conflicts_with :Test( 1 ) +{ + my $self = shift; + my $node = $self->{node}; + ok( ! $node->conflictsWith(), 'conflictsWith() should return false' ); +} + +sub test_update_from_import :Test( 1 ) +{ + my $self = shift; + my $node = $self->{node}; + ok( ! $node->updateFromImport(), 'updateFromImport() should return false' ); +} + +sub test_restrict_title :Test( 3 ) +{ + my $self = shift; + my $node = $self->{node}; + + ok( ! $node->restrictTitle(), + 'restrictTitle() should return false with no title' ); + + $node->{title} = 'foo|'; + ok( ! $node->restrictTitle(), '... or false with bad chars in title' ); + + $node->{title} = 'some user_name'; + ok( $node->restrictTitle(), '... or true if it has only good chars' ); +} + +sub test_get_nodelets :Test( 3 ) +{ + my $self = shift; + my $node = $self->{node}; + my $db = $self->{mock_db}; + my $nodelets = { nodelets => '1,2,4' }; + + $node->set_always( getVars => $nodelets ); + is_deeply( $node->getNodelets(), [ 1, 2, 4 ], + 'getNodelets() should return existing nodelets vars in array ref' ); + + delete $nodelets->{nodelets}; + $db->set_always( getNode => $node ); + $node->set_series( isOfType => 1, 0 ); + + $nodelets->{nodelet_group} = $node; + $node->{group} = [ 4, 2, 1 ]; + is_deeply( $node->getNodelets(), [ 4, 2, 1 ], + '... or from user nodelet group, if specified' ); + + delete $nodelets->{nodelet_group}; + + $node->{group} = [ 8, 6, 1 ]; + + is_deeply( $node->getNodelets( 'default' ), [ 8, 6, 1 ], + '... or from default group' ); +} + +# XXX - delete me soon +sub test_has_vars :Test( 1 ) +{ + my $self = shift; + my $node = $self->{node}; + ok( $node->hasVars(), 'user node should have vars' ); +} + +# XXX - delete soon +sub test_xml_tag :Test(+0) {} + +1; Property changes on: trunk/ebase/lib/Everything/Node/Test/user.pm ___________________________________________________________________ Name: svn:mime-type + text/plain; charset=UTF-8 Name: svn:eol-style + native Modified: trunk/ebase/lib/Everything/Node/user.pm =================================================================== --- trunk/ebase/lib/Everything/Node/user.pm 2006-04-15 00:44:59 UTC (rev 845) +++ trunk/ebase/lib/Everything/Node/user.pm 2006-04-21 00:20:21 UTC (rev 846) @@ -23,7 +23,7 @@ sub dbtables { my $self = shift; - return qw( user document ), $self->SUPER::dbtables(); + return qw( user document ), $self->SUPER(); } =head2 C<insert> @@ -36,7 +36,7 @@ { my ( $this, $USER ) = @_; - my $id = $this->SUPER() or return; + return 0 unless my $id = $this->SUPER(); # Make all new users default to owning themselves. $this->{author_user} = $id; @@ -99,7 +99,7 @@ sub getNodeKeys { my ( $this, $forExport ) = @_; - my $keys = $this->SUPER(); + my $keys = $this->SUPER( $forExport ); # Remove these fields if we are exporting user nodes. delete @$keys{qw( passwd lasttime )} if $forExport; @@ -117,7 +117,8 @@ { my ( $this, $field ) = @_; - my $restrictedFields = { + my $restrictedFields = + { title => 1, karma => 1, lasttime => 1, Modified: trunk/ebase/t/Node/user.t =================================================================== --- trunk/ebase/t/Node/user.t 2006-04-15 00:44:59 UTC (rev 845) +++ trunk/ebase/t/Node/user.t 2006-04-21 00:20:21 UTC (rev 846) @@ -1,184 +1,7 @@ -#!/usr/bin/perl +#! perl use strict; use warnings; -BEGIN -{ - chdir 't' if -d 't'; - use lib 'lib'; -} - -use vars '$AUTOLOAD'; - -use Test::MockObject; -use Test::More tests => 41; - -my $module = 'Everything::Node::user'; -use_ok( $module ) or exit; - -ok( $module->isa( 'Everything::Node::setting' ), 'user should extend setting' ); - -can_ok( $module, 'dbtables' ); -SKIP: -{ - skip( 'SUPER not appropriate yet', 1 ); - my @tables = $module->dbtables(); - is_deeply( \@tables, [qw( user document setting node )], - 'dbtables() should return node tables' ); -} - -sub AUTOLOAD -{ - return if $AUTOLOAD =~ /DESTROY$/; - - no strict 'refs'; - $AUTOLOAD =~ s/^main:://; - - my $sub = "${module}::$AUTOLOAD"; - if ( defined &{$sub} ) - { - *{$AUTOLOAD} = \&{$sub}; - goto &{$sub}; - } -} - -my $mock = Test::MockObject->new(); -my ( $method, $args, $result ); - -# $mock->fake_module( 'Everything', import => sub { $result = caller() } ); - -ok( $INC{'Everything.pm'}, '... should use Everything module' ); - -$mock->{DB} = $mock; - -# insert() -$mock->set_series( SUPER => 0, 10, 10 )->set_true('update'); - -$mock->{title} = 'foo'; - -ok( !insert( $mock, 'user' ), - 'insert() should return false if SUPER call fails' ); -is( $mock->next_call(), 'SUPER', '... and should call SUPER()' ); - -is( insert( $mock, 'user' ), - 10, '... should return inserted node_id on success' ); -( $method, $args ) = $mock->next_call(2); -is( $method, 'update', '... then calling update()' ); -is( $args->[1], 'user', '... with the user' ); -is( $mock->{author_user}, 10, '... and set "author_user" to inserted node_id' ); - -# isGod() -$mock->set_series( getNode => 0, ($mock) x 2 ) - ->set_always( inGroup => 'inGroup' ) - ->set_always( inGroupFast => 'inGroupFast' )->clear(); - -ok( !isGod($mock), - 'isGod() should return false unless it can find gods usergroup' ); -( $method, $args ) = $mock->next_call(); -is( $method, 'getNode', '... and should call getNode() to find it' ); -is( join( '-', @$args ), "$mock-gods-usergroup", '... for gods usergroup' ); - -is( isGod($mock), 'inGroupFast', - '... should call inGroupFast() without recurse flag' ); -is( isGod( $mock, 1 ), 'inGroup', '... and inGroup() with it' ); - -# isGuest() -my @newnodes = ( - bless( { guest_user => 0 }, 'FakeNode' ), - bless( { guest_user => 1 }, 'FakeNode' ) -); -$mock->{_calls} = []; -$mock->set_series( getNode => 0, ($mock) x 2 ) - ->set_series( getVars => undef, @newnodes )->clear(); - -ok( isGuest($mock), - 'isGuest() should return true unless it can get system settings node' ); -( $method, $args ) = $mock->next_call(); -is( $method, 'getNode', '... so it should fetch a node' ); -is( - join( '-', @$args ), - "$mock-system settings-setting", - '... the system settings' -); -ok( isGuest($mock), - '... should return true unless it can get system settings node' ); - -$mock->{node_id} = 1; - -ok( !isGuest($mock), '... should return false if node_ids do not match' ); -ok( isGuest($mock), '... and true if they do' ); - -# getNodeKeys() -my $hash_ref = { passwd => 1, lasttime => 1, title => 1 }; -$mock->set_always( SUPER => ($hash_ref) x 2 )->clear(); - -my $keys = getNodeKeys($mock); -isa_ok( $keys, 'HASH', 'getNodeKeys() should return a hash' ); -is( scalar keys %$keys, 3, '... but should delete nothing if not exporting' ); - -$keys = getNodeKeys( $mock, 1 ); -ok( !exists $keys->{passwd}, '... should delete "passwd" if exporting' ); -ok( !exists $keys->{lasttime}, '... should delete "lasttime" if exporting' ); - -# verifyFieldUpdate() - -foreach my $field (qw( title karma lasttime )) -{ - ok( !verifyFieldUpdate( $mock, $field ), - "verifyFieldUpdate should return false for '$field' field" ); -} -$mock->set_series( SUPER => 1, 0 ); -ok( - verifyFieldUpdate( $mock, 'absent' ), - '... should return false if SUPER() call does' -); -ok( !verifyFieldUpdate( $mock, 'title' ), - '... and false if field is restricted here, but not in parent' ); - -ok( !conflictsWith(), 'conflictsWith() should return false' ); - -ok( !updateFromImport(), 'updateFromImport() should return false' ); - -ok( !restrictTitle( {} ), 'restrictTitle() should return false with no title' ); -ok( - !restrictTitle( { title => 'foo|' } ), - '... or false with bad chars in title' -); -ok( - restrictTitle( { title => 'some user_name' } ), - '... or true if it has only good chars' -); - -can_ok( $module, 'getNodelets' ); -my $nodelets = { nodelets => '1,2,4' }; -$mock->set_always( getVars => $nodelets ); -is_deeply( - getNodelets($mock), - [ 1, 2, 4 ], - 'getNodelets() should return nodelets vars in array ref, if they exist' -); - -delete $nodelets->{nodelets}; -$mock->set_always( getNode => $mock )->set_series( isOfType => 1, 0 ); - -$nodelets->{nodelet_group} = $mock; -$mock->{group} = [ 4, 2, 1 ]; -is_deeply( - getNodelets($mock), - [ 4, 2, 1 ], - '... or from user nodelet group, if specified' -); - -delete $nodelets->{nodelet_group}; - -$mock->{group} = [ 8, 6, 1 ]; -$mock->clear(); - -is_deeply( - getNodelets( $mock, 'default' ), - [ 8, 6, 1 ], - '... or from default group' -); -( $method, $args ) = $mock->next_call(2); -is( $args->[1], 'default', '... so should fetch default group' ); +use Everything::Node::Test::user; +Everything::Node::Test::user->runtests(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |