Koha/t/db_dependent/selenium/basic_workflow.t
Jonathan Druart 0e9edcd3be Bug 18298: Fix selenium tests
The password has to be better than "password"...

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2017-10-17 12:40:45 -03:00

249 lines
10 KiB
Perl
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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>.
# wget https://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.1.jar # Does not work with 3.4, did not test the ones between
# sudo apt-get install xvfb firefox-esr
# SELENIUM_PATH=/home/vagrant/selenium-server-standalone-2.53.1.jar
# Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null &
# DISPLAY=:1 java -jar $SELENIUM_PATH
#
# Then you can execute the test file.
#
# If you get:
# Wide character in print at /usr/local/share/perl/5.20.2/Test2/Formatter/TAP.pm line 105.
# # 'Koha Patrons Add patron test_patron_surname (Adult)'
# # doesn't match '(?^u:Patron details for test_patron_surname)'
#
# Ignore and retry (FIXME LATER...)
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 => 20;
use MARC::Record;
use MARC::Field;
my $dbh = C4::Context->dbh;
my $login = $ENV{KOHA_USER} || 'koha';
my $password = $ENV{KOHA_PASS} || 'koha';
my $base_url= ( $ENV{KOHA_INTRANET_URL} || C4::Context->preference("staffClientBaseURL") ) . "/cgi-bin/koha/";
my $selenium_addr = $ENV{SELENIUM_ADDR} || 'localhost';
my $selenium_port = $ENV{SELENIUM_PORT} || 4444;
my $number_of_biblios_to_insert = 3;
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 => '1BetterPassword',
password2 => '1BetterPassword'
},
itemtype => {
itemtype => 'IT4TEST',
description => 'Just an itemtype for tests',
rentalcharge => 0,
notforloan => 0,
},
issuingrule => {
categorycode => 'test_cat',
itemtype => 'IT4test',
branchcode => '*',
maxissueqty => '5',
issuelength => '5',
lengthunit => 'days',
renewalperiod => '5',
},
};
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(
port => $selenium_port,
remote_server_addr => $selenium_addr
);
$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}), );
####$driver->get($base_url.'/members/members-home.pl');
####fill_form( $driver, { searchmember => $sample_data->{patron}{cardnumber} } );
####$driver->find_element('//div[@id="header_search"]/div/form/input[@type="submit"]')->click;
####like( $driver->get_title(), qr(Patron details for), );
time_diff("add patron");
$borrowernumber = $dbh->selectcol_arrayref(q|SELECT borrowernumber FROM borrowers WHERE userid=?|, {}, $sample_data->{patron}{userid} )->[0];
my @biblionumbers;
for my $i ( 1 .. $number_of_biblios_to_insert ) {
my $biblio = MARC::Record->new();
my $title = 'test biblio '.$i;
if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
$biblio->append_fields(
MARC::Field->new('200', ' ', ' ', a => 'test biblio '.$i),
MARC::Field->new('200', ' ', ' ', f => 'test author '.$i),
);
} else {
$biblio->append_fields(
MARC::Field->new('245', ' ', ' ', a => 'test biblio '.$i),
MARC::Field->new('100', ' ', ' ', a => 'test author '.$i),
);
}
my ($biblionumber, $biblioitemnumber) = AddBiblio($biblio, '');
push @biblionumbers, $biblionumber;
}
time_diff("add biblio");
my $itemtype = $sample_data->{itemtype};
$dbh->do(q|INSERT INTO itemtypes (itemtype, description, rentalcharge, notforloan) VALUES (?, ?, ?, ?)|, undef, $itemtype->{itemtype}, $itemtype->{description}, $itemtype->{rentalcharge}, $itemtype->{notforloan});
my $issuing_rules = $sample_data->{issuingrule};
$dbh->do(q|INSERT INTO issuingrules (categorycode, itemtype, branchcode, maxissueqty, issuelength, lengthunit, renewalperiod) VALUES (?, ?, ?, ?, ?, ?, ?)|, undef, $issuing_rules->{categorycode}, $issuing_rules->{itemtype}, $issuing_rules->{branchcode}, $issuing_rules->{maxissueqty}, $issuing_rules->{issuelength}, $issuing_rules->{lengthunit}, $issuing_rules->{renewalperiod});
for my $biblionumber ( @biblionumbers ) {
$driver->get($base_url."/cataloguing/additem.pl?biblionumber=$biblionumber");
like( $driver->get_title(), qr(test biblio \d+ by test author), );
my $form = $driver->find_element('//form[@name="f"]');
my $inputs = $driver->find_child_elements($form, '//input[@type="text"]');
for my $input ( @$inputs ) {
next if $input->is_hidden();
my $id = $input->get_attribute('id');
next unless $id =~ m|^tag_952_subfield|;
$input->send_keys('t_value_bib'.$biblionumber);
}
$driver->find_element('//input[@name="add_submit"]')->click;
like( $driver->get_title(), qr($biblionumber.*Items) );
$dbh->do(q|UPDATE items SET notforloan=0 WHERE biblionumber=?|, {}, $biblionumber );
$dbh->do(q|UPDATE biblioitems SET itemtype=? WHERE biblionumber=?|, {}, $itemtype->{itemtype}, $biblionumber);
$dbh->do(q|UPDATE items SET itype=? WHERE biblionumber=?|, {}, $itemtype->{itemtype}, $biblionumber);
}
time_diff("add items");
my $nb_of_checkouts = 0;
for my $biblionumber ( @biblionumbers ) {
$driver->get($base_url."/circ/circulation.pl?borrowernumber=".$borrowernumber);
$driver->find_element('//input[@id="barcode"]')->send_keys('t_value_bib'.$biblionumber);
$driver->find_element('//fieldset[@id="circ_circulation_issue"]/button[@type="submit"]')->click;
$nb_of_checkouts++;
like( $driver->get_title(), qr(Checking out to $sample_data->{patron}{surname}) );
is( $driver->find_element('//a[@href="#checkouts"]')->get_attribute('text'), $nb_of_checkouts.' Checkout(s)', );
}
time_diff("checkout");
for my $biblionumber ( @biblionumbers ) {
$driver->get($base_url."/circ/returns.pl");
$driver->find_element('//input[@id="barcode"]')->send_keys('t_value_bib'.$biblionumber);
$driver->find_element('//form[@id="checkin-form"]/div/fieldset/input[@type="submit"]')->click;
like( $driver->get_title(), qr(Check in test biblio \d+) );
}
time_diff("checkin");
close $fh;
$driver->quit();
};
END {
cleanup() if $cleanup_needed;
};
sub auth {
my ( $driver, $login, $password) = @_;
fill_form( $driver, { userid => $login, password => $password } );
my $login_button = $driver->find_element('//input[@id="submit"]');
$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 issues where borrowernumber=?|, {}, $borrowernumber);
$dbh->do(q|DELETE FROM old_issues where borrowernumber=?|, {}, $borrowernumber);
for my $i ( 1 .. $number_of_biblios_to_insert ) {
$dbh->do(qq|DELETE items, biblio FROM biblio INNER JOIN items ON biblio.biblionumber = items.biblionumber WHERE biblio.title = "test biblio$i"|);
};
$dbh->do(q|DELETE FROM borrowers WHERE userid = ?|, {}, $sample_data->{patron}{userid});
$dbh->do(q|DELETE FROM categories WHERE categorycode = ?|, {}, $sample_data->{category}{categorycode});
for my $i ( 1 .. $number_of_biblios_to_insert ) {
$dbh->do(qq|DELETE FROM biblio WHERE title = "test biblio $i"|);
};
$dbh->do(q|DELETE FROM itemtypes WHERE itemtype=?|, undef, $sample_data->{itemtype}{itemtype});
$dbh->do(q|DELETE FROM issuingrules WHERE categorycode=? AND itemtype=? AND branchcode=?|, undef, $sample_data->{issuingrule}{categorycode}, $sample_data->{issuingrule}{itemtype}, $sample_data->{issuingrule}{branchcode});
}
sub time_diff {
my $lib = shift;
my $now = gettimeofday;
warn "CP $lib = " . sprintf("%.2f", $now - $prev_time ) . "\n";
$prev_time = $now;
}