Koha/t/Auth_with_shibboleth.t
Olli-Antti Kivilahti 8bf72439c0 Bug 18226 - Remove "use Test::DBIx::Class" instantiations' dangerous code duplication
Is 'instantiations' even a word?

Use a Test::DBIx::Class defaults instead.

Save your keyboard and prevent horrible bugs from emerging from rampant code duplication.

This change doesn't seem to have any impact on the speed of executing those tests.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2017-06-05 17:52:48 -03:00

324 lines
8.9 KiB
Perl

#!/usr/bin/perl
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
$| = 1;
use Module::Load::Conditional qw/check_install/;
use Test::More;
use Test::MockModule;
use Test::Warn;
use CGI;
use C4::Context;
BEGIN {
if ( check_install( module => 'Test::DBIx::Class' ) ) {
plan tests => 11;
} else {
plan skip_all => "Need Test::DBIx::Class"
}
}
use Test::DBIx::Class;
# Mock Variables
my $matchpoint = 'userid';
my $autocreate = 0;
my %mapping = (
'userid' => { 'is' => 'uid' },
'surname' => { 'is' => 'sn' },
'dateexpiry' => { 'is' => 'exp' },
'categorycode' => { 'is' => 'cat' },
'address' => { 'is' => 'add' },
'city' => { 'is' => 'city' },
);
$ENV{'uid'} = "test1234";
$ENV{'sn'} = undef;
$ENV{'exp'} = undef;
$ENV{'cat'} = undef;
$ENV{'add'} = undef;
$ENV{'city'} = undef;
# Setup Mocks
## Mock Context
my $context = new Test::MockModule('C4::Context');
### Mock ->config
$context->mock( 'config', \&mockedConfig );
### Mock ->preference
my $OPACBaseURL = "testopac.com";
$context->mock( 'preference', \&mockedPref );
## Mock Database
my $database = new Test::MockModule('Koha::Database');
### Mock ->schema
$database->mock( 'schema', \&mockedSchema );
# Tests
##############################################################
# Can module load
use C4::Auth_with_shibboleth;
require_ok('C4::Auth_with_shibboleth');
$C4::Auth_with_shibboleth::debug = '0';
# Subroutine tests
## shib_ok
subtest "shib_ok tests" => sub {
plan tests => 5;
my $result;
# correct config, no debug
is( shib_ok(), '1', "good config" );
# bad config, no debug
$matchpoint = undef;
warnings_are { $result = shib_ok() }
[ { carped => 'shibboleth matchpoint not defined' }, ],
"undefined matchpoint = fatal config, warning given";
is( $result, '0', "bad config" );
$matchpoint = 'email';
warnings_are { $result = shib_ok() }
[ { carped => 'shibboleth matchpoint not mapped' }, ],
"unmapped matchpoint = fatal config, warning given";
is( $result, '0', "bad config" );
# add test for undefined shibboleth block
reset_config();
};
## logout_shib
#my $query = CGI->new();
#is(logout_shib($query),"https://".$opac."/Shibboleth.sso/Logout?return="."https://".$opac,"logout_shib");
## login_shib_url
my $query_string = 'language=en-GB';
$ENV{QUERY_STRING} = $query_string;
$ENV{SCRIPT_NAME} = '/cgi-bin/koha/opac-user.pl';
my $query = CGI->new($query_string);
is(
login_shib_url($query),
'https://testopac.com'
. '/Shibboleth.sso/Login?target='
. 'https://testopac.com/cgi-bin/koha/opac-user.pl' . '%3F'
. $query_string,
"login shib url"
);
## get_login_shib
subtest "get_login_shib tests" => sub {
plan tests => 4;
my $login;
# good config
## debug off
$C4::Auth_with_shibboleth::debug = '0';
warnings_are { $login = get_login_shib() }[],
"good config with debug off, no warnings received";
is( $login, "test1234",
"good config with debug off, attribute value returned" );
## debug on
$C4::Auth_with_shibboleth::debug = '1';
warnings_are { $login = get_login_shib() }[
"koha borrower field to match: userid",
"shibboleth attribute to match: uid",
"uid value: test1234"
],
"good config with debug enabled, correct warnings received";
is( $login, "test1234",
"good config with debug enabled, attribute value returned" );
# bad config - with shib_ok implemented, we should never reach this sub with a bad config
};
## checkpw_shib
subtest "checkpw_shib tests" => sub {
plan tests => 18;
my $shib_login;
my ( $retval, $retcard, $retuserid );
# Setup Mock Database Data
fixtures_ok [
'Borrower' => [
[qw/cardnumber userid surname address city/],
[qw/testcardnumber test1234 renvoize myaddress johnston/],
],
'Category' => [ [qw/categorycode default_privacy/], [qw/S never/], ]
],
'Installed some custom fixtures via the Populate fixture class';
# debug off
$C4::Auth_with_shibboleth::debug = '0';
# good user
$shib_login = "test1234";
warnings_are {
( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
}
[], "good user with no debug";
is( $retval, "1", "user authenticated" );
is( $retcard, "testcardnumber", "expected cardnumber returned" );
is( $retuserid, "test1234", "expected userid returned" );
# bad user
$shib_login = 'martin';
warnings_are {
( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
}
[], "bad user with no debug";
is( $retval, "0", "user not authenticated" );
# autocreate user
$autocreate = 1;
$shib_login = 'test4321';
$ENV{'uid'} = 'test4321';
$ENV{'sn'} = "pika";
$ENV{'exp'} = "2017";
$ENV{'cat'} = "S";
$ENV{'add'} = 'Address';
$ENV{'city'} = 'City';
warnings_are {
( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
}
[], "new user added with no debug";
is( $retval, "1", "user authenticated" );
is( $retuserid, "test4321", "expected userid returned" );
ok my $new_user = ResultSet('Borrower')
->search( { 'userid' => 'test4321' }, { rows => 1 } ), "new user found";
is_fields [qw/surname dateexpiry address city/], $new_user->next,
[qw/pika 2017 Address City/],
'Found $new_users surname';
$autocreate = 0;
# debug on
$C4::Auth_with_shibboleth::debug = '1';
# good user
$shib_login = "test1234";
warnings_exist {
( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
}
[
qr/checkpw_shib/,
qr/koha borrower field to match: userid/,
qr/shibboleth attribute to match: uid/,
qr/User Shibboleth-authenticated as:/
],
"good user with debug enabled";
is( $retval, "1", "user authenticated" );
is( $retcard, "testcardnumber", "expected cardnumber returned" );
is( $retuserid, "test1234", "expected userid returned" );
# bad user
$shib_login = "martin";
warnings_exist {
( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
}
[
qr/checkpw_shib/,
qr/koha borrower field to match: userid/,
qr/shibboleth attribute to match: uid/,
qr/User Shibboleth-authenticated as:/,
qr/not a valid Koha user/
],
"bad user with debug enabled";
is( $retval, "0", "user not authenticated" );
};
## _get_uri
$OPACBaseURL = "testopac.com";
is( C4::Auth_with_shibboleth::_get_uri(),
"https://testopac.com", "https opac uri returned" );
$OPACBaseURL = "http://testopac.com";
my $result;
warning_like { $result = C4::Auth_with_shibboleth::_get_uri() }
[qr/Shibboleth requires OPACBaseURL to use the https protocol!/],
"improper protocol - received expected warning";
is( $result, "https://testopac.com", "https opac uri returned" );
$OPACBaseURL = "https://testopac.com";
is( C4::Auth_with_shibboleth::_get_uri(),
"https://testopac.com", "https opac uri returned" );
$OPACBaseURL = undef;
warning_like { $result = C4::Auth_with_shibboleth::_get_uri() }
[qr/OPACBaseURL not set!/],
"undefined OPACBaseURL - received expected warning";
is( $result, "https://", "https opac uri returned" );
## _get_shib_config
# Internal helper function, covered in tests above
sub mockedConfig {
my $param = shift;
my %shibboleth = (
'autocreate' => $autocreate,
'matchpoint' => $matchpoint,
'mapping' => \%mapping
);
return \%shibboleth;
}
sub mockedPref {
my $param = $_[1];
my $return;
if ( $param eq 'OPACBaseURL' ) {
$return = $OPACBaseURL;
}
return $return;
}
sub mockedSchema {
return Schema();
}
## Convenience method to reset config
sub reset_config {
$matchpoint = 'userid';
$autocreate = 0;
%mapping = (
'userid' => { 'is' => 'uid' },
'surname' => { 'is' => 'sn' },
'dateexpiry' => { 'is' => 'exp' },
'categorycode' => { 'is' => 'cat' },
'address' => { 'is' => 'add' },
'city' => { 'is' => 'city' },
);
$ENV{'uid'} = "test1234";
$ENV{'sn'} = undef;
$ENV{'exp'} = undef;
$ENV{'cat'} = undef;
$ENV{'add'} = undef;
$ENV{'city'} = undef;
return 1;
}
1;