# -*- indent-tabs-mode: nil; tab-width: 4; -*- # vim:ft=perl:et:sw=4 # $Id$ use strict; use warnings; use Test::More; use FindBin qw($Bin); use DateTime; require "$Bin/common.pl"; eval "require '$Bin/config.pl'"; if ($@) { plan skip_all => 'no config found' if ($@); } elsif (!$LA::T::SQLBASE) { plan skip_all => 'No SQL base defined'; } else { plan tests => 102; # Number of test } use_ok('LATMOS::Accounts'); use_ok('LATMOS::Accounts::Bases::Sql'); ok(my $la = LATMOS::Accounts->new(undef, noacl => 1), "Can get LATMOS::Accounts"); ok(my $base = $la->base($LA::T::SQLBASE), "can get SQL base $LA::T::SQLBASE"); { # test: user my $oid = genid(); use_ok('LATMOS::Accounts::Bases::Sql::User'); ok($base->create_c_object('user', $oid, sn => "snUser", givenName => "givenNameUser", expire => undef, ), "Can create user $oid"); ok(my $obj = $base->get_object('user', $oid), "user $oid is actually deleted"); is($obj->get_attributes('sn'), "snUser"); my $passwd = genid(); ok($obj->set_password($passwd), "Can set password"); ok($base->authenticate_user($oid, $passwd), "can authenticate user"); ok(!$base->authenticate_user($oid, '----'), "don't authenticate with invalid password"); ok($base->delete_object('user', $oid), "Can delete user $oid"); ok(!$base->get_object('user', $oid), "user $oid is actually deleted"); } $base->rollback; { # test alias my $oid = genid(); ok($base->create_c_object('user', $oid, sn => "snUser", givenName => "givenNameUser", expire => undef, ), "Can create user $oid"); ok(my $realobj = $base->get_object('user', $oid), "user $oid is actually created"); my $aliasoid = genid(); ok($base->CreateAlias('user', $aliasoid, $oid), "Can create alias object"); ok(my $obj = $base->get_object('user', $aliasoid), "Can get object trought alias"); is($obj->get_attributes('sn'), 'snUser'); ok(my $aobj = $base->GetAlias('user', $aliasoid), "Can get alias object"); is($aobj->get_attributes('oalias'), $oid); is($aobj->get_attributes('oaliascache'), $oid); my $oidsub = genid(); ok($base->create_c_object('user', $oidsub, sn => "snUserSub", givenName => "givenNameSub", expire => undef, ), "Can create user $oid"); ok(my $subobj = $base->get_object('user', $oidsub), "user $oidsub is actually created"); $subobj->set_c_fields( managerContact => $aliasoid, ); is($subobj->get_c_field('manager'), $aliasoid, "Can get ref manager"); is($subobj->GetAttributeValue('manager'), $oid, "Can get ref manager via GetAttributeValue"); ok(eq_set( [ $base->search_objects('user', 'sn=snUser') ], [ $oid, $aliasoid ] ), 'Search retrieve alias'); ok(eq_set( [ $base->search_objects('user', 'sn=snUser', 'oalias=NULL') ], [ $oid ] ), 'Search with oalias=NULL don\'t retrieve alias'); ok(eq_set( [ $base->search_objects('user', 'sn=XXXXXXXXX') ], [ ] ), 'Search with no result don\'t retrieve alias'); ok($base->RemoveAlias('user', $aliasoid), "Removing Alias"); ok(!$base->GetAlias('user', $aliasoid), "Cannot get removed alias object"); $subobj->set_c_fields( managerContact => $oid, ); ok($base->CreateAlias('user', $aliasoid, "user.$oidsub.managerContact"), "Can create alias object"); ok($aobj = $base->GetAlias('user', $aliasoid), "Can get alias object"); is($aobj->get_attributes('oalias'), "user.$oidsub.managerContact"); is($aobj->get_attributes('oaliascache'), $oid); ok($aobj->set_c_fields(oalias => $oidsub)); is($aobj->get_attributes('oalias'), $oidsub); is($aobj->get_attributes('oaliascache'), $oidsub); ok($aobj->set_c_fields(oalias => "user.$oidsub.managerContact")); is($aobj->get_attributes('oalias'), "user.$oidsub.managerContact"); is($aobj->get_attributes('oaliascache'), $oid); } $base->rollback; { # test: group my $oid = genid(); use_ok('LATMOS::Accounts::Bases::Sql::Group'); ok($base->create_c_object('group', $oid, description => 'Group Test' ), "Can create group $oid"); ok(my $obj = $base->get_object('group', $oid), "group $oid is actually deleted"); is($obj->get_attributes('description'), "Group Test"); ok($base->delete_object('group', $oid), "Can delete group $oid"); ok(!$base->get_object('group', $oid), "group $oid is actually deleted"); } $base->rollback; { # test: nethost my $oid = genid(); use_ok('LATMOS::Accounts::Bases::Sql::Nethost'); ok($base->create_c_object('nethost', $oid, description => 'Nethost Test', ip => '255.255.255.255', # widely improbable to conflict with existing one ), "Can create nethost $oid"); ok(my $obj = $base->get_object('nethost', $oid), "nethost $oid is actually deleted"); is($obj->get_attributes('description'), "Nethost Test"); my ($ip) = $obj->get_attributes('ip'); is($ip, '255.255.255.255'); ok($base->delete_object('nethost', $oid), "Can delete nethost $oid"); ok(!$base->get_object('nethost', $oid), "nethost $oid is actually deleted"); } $base->rollback; { # test: netzone my $oid = genid(); use_ok('LATMOS::Accounts::Bases::Sql::Netzone'); ok($base->create_c_object('netzone', $oid, description => 'Netzone Test', type => 'dhcp', ), "Can create netzone $oid"); ok(my $obj = $base->get_object('netzone', $oid), "netzone $oid is actually deleted"); is($obj->get_attributes('description'), "Netzone Test"); ok($base->delete_object('netzone', $oid), "Can delete netzone $oid"); ok(!$base->get_object('netzone', $oid), "netzone $oid is actually deleted"); } $base->rollback; { # test employment use_ok('LATMOS::Accounts::Bases::Sql::Employment'); my $baseEmp = genid(); my $empUser = genid(); my $baseEmpStart = DateTime->now->subtract(days => 60); my $baseEmpEnd = DateTime->now->add(days => 60); ok($base->create_c_object('user', $empUser, sn => "snUser", givenName => "givenNameUser", ), "Can create user $empUser"); ok($base->create_c_object('employment', $baseEmp, user => $empUser, firstday => $baseEmpStart->dmy('/'), lastday => $baseEmpEnd->dmy('/'), ), "Can create current employment"); { my $Emp = genid(); my $EmpStart = DateTime->now->add(days => 61); my $EmpEnd = DateTime->now->add(days => 120); ok($base->create_c_object('employment', $Emp, user => $empUser, firstday => $EmpStart->dmy('/'), lastday => $EmpEnd->dmy('/'), ), "Can create employment after"); ok($base->delete_object('employment', $Emp), "Deleting Emp $Emp"); } { my $Emp = genid(); my $EmpStart = DateTime->now->subtract(days => 40); my $EmpEnd = DateTime->now->subtract(days => 20); ok(!$base->create_c_object('employment', $Emp, user => $empUser, firstday => $EmpStart->dmy('/'), lastday => $EmpEnd->dmy('/'), ), "Cannot create employment overlaping start"); ok(!$base->delete_object('employment', $Emp), "Deleting Emp $Emp"); } { my $Emp = genid(); my $EmpStart = DateTime->now->add(days => 30); my $EmpEnd = DateTime->now->add(days => 90); ok(!$base->create_c_object('employment', $Emp, user => $empUser, firstday => $EmpStart->dmy('/'), lastday => $EmpEnd->dmy('/'), ), "Cannot create employment overlapping end"); ok(!$base->delete_object('employment', $Emp), "Deleting Emp $Emp"); } { my $Emp = genid(); my $EmpStart = DateTime->now->subtract(days => 90); my $EmpEnd = DateTime->now->add(days => 90); ok(!$base->create_c_object('employment', $Emp, user => $empUser, firstday => $EmpStart->dmy('/'), lastday => $EmpEnd->dmy('/'), ), "Cannot create employment overlapping another"); ok(!$base->delete_object('employment', $Emp), "Deleting Emp $Emp"); } ok($base->delete_object('employment', $baseEmp), "Deleting Emp BaseEmp $baseEmp"); { $base->{_options}{allow_pasted_employment} = 1; my $Emp = genid(); my $EmpStart = DateTime->now->subtract(days => 90); ok($base->create_c_object('employment', $Emp, user => $empUser, firstday => $EmpStart->dmy('/'), lastday => undef, ), "Can create unlimited employment"); ok(my $ouser = $base->get_object('user', $empUser), "Getting user object"); ok(!$ouser->get_attributes('expire'), 'User don t expire'); my $EmpOld = genid(); ok($base->create_c_object('employment', $EmpOld, user => $empUser, firstday => '1/1/2012', lastday => '31/12/2012', ), "Cannot create pasted employement"); ok($ouser = $base->get_object('user', $empUser), "Getting user object"); ok(!$ouser->get_attributes('expire'), 'User still don t expire'); ok($base->delete_object('employment', $Emp), "Deleting Emp $Emp"); ok($base->delete_object('employment', $EmpOld), "Deleting Emp $EmpOld"); $base->{_options}{allow_pasted_employment} = undef; } ok($base->delete_object('user', $empUser), "Deleting user $empUser"); } $base->rollback; { diag('Testing search'); ok($base->create_c_object('user', 'searchuaa', sn => "Lastnamea", givenName => "Firstnamea", ), "Can create user searchuaa"); ok($base->create_c_object('user', 'searchuna', sn => "Lastnamea", ), "Can create user searchuna"); ok($base->create_c_object('user', 'searchuab', sn => "Lastnamea", givenName => "Firstnameb", ), "Can create user searchuab"); ok($base->create_c_object('user', 'searchuba', sn => "Lastnameb", givenName => "Firstnamea", ), "Can create user searchuba"); ok($base->create_c_object('user', 'searchubb', sn => "Lastnameb", givenName => "Firstnameb", ), "Can create user searchubb"); ok($base->create_c_object('group', 'searchga', member => [ 'searchuaa', 'searchuba' ], ), "Can create group searchga"); ok($base->create_c_object('group', 'searchgb', member => [ 'searchuab', 'searchuba' ], ), "Can create group searchgb"); ok(eq_set( [ $base->search_objects('user', 'givenName=Firstnamea') ], [ 'searchuaa', 'searchuba' ] ), 'Can search on single attribute'); ok(eq_set( [ $base->search_objects('user', 'givenName=Firstnamea', 'givenName=Firstnameb') ], [ 'searchuaa', 'searchuab', 'searchuba', 'searchubb' ] ), 'Can search on single attribute with 2 values'); ok(eq_set( [ $base->search_objects('user', 'givenName=Firstnamea||Firstnameb') ], [ 'searchuaa', 'searchuba', 'searchuab', 'searchubb' ] ), 'Can search on single attribute with 2 values using ||'); ok(eq_set( [ $base->search_objects('user', 'givenName=Firstnamea', 'sn=Lastnamea') ], [ 'searchuaa' ] ), 'Can search on 2 attributes'); ok(! $base->search_objects('user', 'givenName=Firstnamea', 'sn=NoName'), 'Can search on 2 attributes, one return nothing'); ok($base->search_objects('user'), 'No filter return something'); ok(eq_set( [ $base->search_objects('user', 'givenName=NULL', 'sn=Lastnamea') ], [ 'searchuna' ] ), 'Can search on NULL attributes'); ok(eq_set( [ $base->search_objects('user', 'memberOf=searchga&&searchgb') ], [ 'searchuba' ], ), "Search using && with two values"); ok(eq_set( [ $base->search_objects('group', 'member.givenName=Firstnameb') ], [ 'searchgb' ], ), "Search using recursive search"); ok(eq_set( [ $base->search_objects('user', 'givenName~nameb') ], [ 'searchuab', 'searchubb' ] ), 'Can search using ~ operator'); ok($base->delete_object('user', 'searchuaa'), "deleting user searchuaa"); ok($base->delete_object('user', 'searchuna'), "deleting user searchuna"); ok($base->delete_object('user', 'searchuba'), "deleting user searchuba"); ok($base->delete_object('user', 'searchuab'), "deleting user searchuab"); ok($base->delete_object('user', 'searchubb'), "deleting user searchubb"); } $base->rollback;