Bug 19181: Selenium test for logging into the Koha intranet and OPAC

This selenium test goes through the process of creating a category and
patron user (as is completed in the basic_workflow.t test) then the
superlibrarian used to create them is logged out and the newly created
patron user authenticates into the OPAC and staff intranet therefore testing the
authenitcation of both.

Test plan (this test plan includes how to install Selenium as well as
how to run this test, for the benefit of people who have not got
Selenium installed on their machines):

1. wget https://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.0.jar

2. vim /etc/apt/sources.list.d/firefox.list

3. Paste into the file:
deb http://packages.linuxmint.com debian import

4. sudo apt-get update

5. sudo apt-get install firefox

6. sudo apt-get install xvfb

7. Set the SELENIUM_PATH vartiable:
SELENIUM_PATH=/home/vagrant/kohaclone/selenium-server-standalone-2.53.0.jar

8. Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null &

9. DISPLAY=:1 java -jar $SELENIUM_PATH

Note: This will start up the selenium server. Everytime you want to shut
down this terminal window and want to restart Selenium just run the step
9 command to restart the Selenium server

10. Open a new terminal window and write in:
git clone https://github.com/gempesaw/Selenium-Remote-Driver --branch
build/master --single-branch --depth 1

11. cd Selenium-Remote-Driver

12. perl Makefile.PL

13. make

14. make test

15. sudo make install

16. Now everything is installed and you can et up for running the selenium tests

17. Create a superlibrarian user with the username koha and password
koha

18. If your usual port configuration for the intranet and OPAC is 8081
and 8080 respectively then set the staffClientBaseURL and OPACBaseURL
system preferences to localhost:8080 and localhost:80 respectively

19. sudo koha-shell <instancename>

20. perl t/db_dependent/selenium/authenticate.t

21. The test should pass.
Note: The time_diff comments in the test output showing what the test is
doing

Note: If you have issues with installing Selenium and
Selenium::Remote::Driver please write a comment on the bug report and I
will be more than happy to create a screencapture video showing all the
steps

Sponsored-By: Catalyst IT

https://bugs.koha-community.org/show_bug.cgi?id=19181

Signed-off-by: Mark Tompsett <mtompset@hotmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Alex Buckley 2017-07-20 10:50:49 +00:00 committed by Jonathan Druart
parent ee82d441c2
commit 837fa4e6f7
1 changed files with 163 additions and 0 deletions

View File

@ -0,0 +1,163 @@
#!/usr/bin/perl
# This file is part of Koha.
#
# Copyright (C) 2017 Catalyst IT
#
# 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>.
#This selenium test is to test authentication, by performing the following: create a category and patron (same as basic_workflow.t). Then the superlibrarian logs out and the created patron must log into the staff intranet and OPAC
#Note: If you are testing this on kohadevbox with selenium installed in kohadevbox then you need to set the staffClientBaseURL to localhost:8080 and the OPACBaseURL to localhost:80
use Modern::Perl;
use Time::HiRes qw(gettimeofday);
use C4::Context;
use C4::Biblio qw( AddBiblio ); # We shouldn't use it
use Test::More tests => 9;
use MARC::Record;
use MARC::Field;
my $dbh = C4::Context->dbh;
my $login = 'koha';
my $password = 'koha';
my $base_url= 'http://'.C4::Context->preference("staffClientBaseURL")."/cgi-bin/koha/";
my $opac_url= C4::Context->preference("OPACBaseURL");
our $sample_data = {
category => {
categorycode => 'test_cat',
description => 'test cat description',
enrolmentperiod => '12',
category_type => 'A'
},
patron => {
surname => 'test_patron_surname',
cardnumber => '4242424242',
userid => 'test_username',
password => 'password',
password2 => 'password'
},
};
my $patronusername="test_username";
my $patronpassword="password";
our ( $borrowernumber, $start, $prev_time, $cleanup_needed );
SKIP: {
eval { require Selenium::Remote::Driver; };
skip "Selenium::Remote::Driver is needed for selenium tests.", 20 if $@;
$cleanup_needed = 1;
open my $fh, '>>', '/tmp/output.txt';
my $driver = Selenium::Remote::Driver->new;
$start = gettimeofday;
$prev_time = $start;
$driver->get($base_url."mainpage.pl");
like( $driver->get_title(), qr(Log in to Koha), );
auth( $driver, $login, $password );
time_diff("main");
$driver->get($base_url.'admin/categories.pl');
like( $driver->get_title(), qr(Patron categories), );
$driver->find_element('//a[@id="newcategory"]')->click;
like( $driver->get_title(), qr(New category), );
fill_form( $driver, $sample_data->{category} );
$driver->find_element('//fieldset[@class="action"]/input[@type="submit"]')->click;
time_diff("add patron category");
$driver->get($base_url.'/members/memberentry.pl?op=add&amp;categorycode='.$sample_data->{category}{categorycode});
like( $driver->get_title(), qr(Add .*$sample_data->{category}{description}), );
fill_form( $driver, $sample_data->{patron} );
$driver->find_element('//button[@id="saverecord"]')->click;
like( $driver->get_title(), qr(Patron details for $sample_data->{patron}{surname}), );
time_diff("add patron");
$driver->get($base_url.'/mainpage.pl?logout.x=1');
like( $driver->get_title(), qr(Log in to Koha), );
time_diff("Logout");
$driver->get($base_url."mainpage.pl");
like( $driver->get_title(), qr(Log in to Koha), );
patron_auth( $driver, $sample_data->{patron} );
time_diff("New patron logs into intranet");
$driver->get($base_url.'/mainpage.pl?logout.x=1');
like( $driver->get_title(), qr(Log in to Koha), );
time_diff("Logout of new patron from staff intranet");
$driver->get($opac_url);
like( $driver->get_title(), qr(Koha online catalog), );
patron_opac_auth( $driver, $sample_data->{patron} );
time_diff("New patron logs into OPAC");
close $fh;
$driver->quit();
};
END {
cleanup() if $cleanup_needed;
};
sub auth {
my ( $driver, $login, $password) = @_;
fill_form( $driver, { userid => 'koha', password => 'koha' } );
my $login_button = $driver->find_element('//input[@id="submit"]');
$login_button->submit();
}
sub patron_auth {
my ( $driver,$patronusername, $patronpassword) = @_;
fill_form( $driver, { userid => $patronusername, password => $patronpassword } );
my $login_button = $driver->find_element('//input[@id="submit"]');
$login_button->submit();
}
sub patron_opac_auth {
my ( $driver,$patronusername, $patronpassword) = @_;
fill_form( $driver, { userid => $patronusername, password => $patronpassword } );
my $login_button = $driver->find_element('//input[@value="Log in"]');
$login_button->submit();
}
sub fill_form {
my ( $driver, $values ) = @_;
while ( my ( $id, $value ) = each %$values ) {
my $element = $driver->find_element('//*[@id="'.$id.'"]');
my $tag = $element->get_tag_name();
if ( $tag eq 'input' ) {
$driver->find_element('//input[@id="'.$id.'"]')->send_keys($value);
} elsif ( $tag eq 'select' ) {
$driver->find_element('//select[@id="'.$id.'"]/option[@value="'.$value.'"]')->click;
}
}
}
sub cleanup {
my $dbh = C4::Context->dbh;
$dbh->do(q|DELETE FROM categories WHERE categorycode = ?|, {}, $sample_data->{category}{categorycode});
$dbh->do(q|DELETE FROM borrowers WHERE userid = ?|, {}, $sample_data->{patron}{userid});
}
sub time_diff {
my $lib = shift;
my $now = gettimeofday;
warn "CP $lib = " . sprintf("%.2f", $now - $prev_time ) . "\n";
$prev_time = $now;
}