@@ -, +, @@ --- t/db_dependent/selenium/regressions.t | 42 +--- t/db_dependent/selenium/remove_from_cart.t | 117 +++++++++ t/db_dependent/www/search_utf8.t | 262 ++++----------------- t/lib/Mocks/Zebra.pm | 206 ++++++++++++++++ 4 files changed, 374 insertions(+), 253 deletions(-) create mode 100644 t/db_dependent/selenium/remove_from_cart.t create mode 100644 t/lib/Mocks/Zebra.pm --- a/t/db_dependent/selenium/regressions.t +++ a/t/db_dependent/selenium/regressions.t @@ -20,7 +20,7 @@ use utf8; use C4::Context; -use Test::More tests => 7; +use Test::More tests => 6; use Test::MockModule; use C4::Context; @@ -89,46 +89,6 @@ subtest 'OPAC - Bibliographic record detail page must contain the data-biblionum $biblionumber, "#catalogue_detail_biblio contains data-biblionumber" ); push @cleanup, $biblio; - }; - -subtest 'OPAC - Remove from cart' => sub { - plan tests => 4; - - # We need to prevent scrolling to prevent the floating toolbar from overlapping buttons we are testing - my $window_size = $driver->get_window_size(); - $driver->set_window_size(1920,10800); - - $driver->get( $opac_base_url . "opac-search.pl?q=d" ); - - # A better way to do that would be to modify the way we display the basket count - # We should show/hide the count instead or recreate the node - my @basket_count_elts = $driver->find_elements('//span[@id="basketcount"]/span'); - is( scalar(@basket_count_elts), 0, 'Basket should be empty'); - - # This will fail if nothing is indexed, but at this point we should have everything setup correctly - my @checkboxes = $driver->find_elements('//input[@type="checkbox"][@name="biblionumber"]'); - my $biblionumber1 = $checkboxes[0]->get_value(); - my $biblionumber3 = $checkboxes[2]->get_value(); - my $biblionumber5 = $checkboxes[4]->get_value(); - - $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber1.'"]')->click; - my $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); - is( $basket_count_elt->get_text(), - 1, 'One element should have been added to the cart' ); - - $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber3.'"]')->click; - $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber5.'"]')->click; - $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); - is( $basket_count_elt->get_text(), - 3, '3 elements should have been added to the cart' ); - - $driver->find_element('//a[@class="btn btn-link btn-sm remove cartRemove cartR'.$biblionumber3.'"]')->click; - $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); - is( $basket_count_elt->get_text(), - 2, '1 element should have been removed from the cart' ); - - # Reset window size - $driver->set_window_size($window_size->{'height'}, $window_size->{'width'}); }; subtest 'Play sound on the circulation page' => sub { --- a/t/db_dependent/selenium/remove_from_cart.t +++ a/t/db_dependent/selenium/remove_from_cart.t @@ -0,0 +1,117 @@ +#!/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 . + +use Modern::Perl; +use File::Basename qw(dirname ); + +use Test::WWW::Mechanize; +use Test::More tests => 1; +use Test::MockModule; + +use C4::Context; +use t::lib::Mocks; +use t::lib::Selenium; +use t::lib::TestBuilder; +use t::lib::Mocks; +use t::lib::Mocks::Zebra; + +eval { require Selenium::Remote::Driver; }; +skip "Selenium::Remote::Driver is needed for selenium tests.", 1 if $@; + +my $s = t::lib::Selenium->new; + +my $driver = $s->driver; +my $opac_base_url = $s->opac_base_url; +my $base_url = $s->base_url; +my $builder = t::lib::TestBuilder->new; + +my $SearchEngine_value = C4::Context->preference('SearchEngine'); +C4::Context->set_preference('SearchEngine', 'Zebra'); + +my $mock_zebra = t::lib::Mocks::Zebra->new( + { + koha_conf => $ENV{KOHA_CONF}, + user => $ENV{KOHA_USER}, + password => $ENV{KOHA_PASS}, + intranet => $ENV{KOHA_INTRANET_URL}, + opac => $ENV{KOHA_OPAC_URL}, + } +); + +subtest 'OPAC - Remove from cart' => sub { + plan tests => 22; + + #-------------------------------- Test with greek and corean chars; + # launch the zebra saerch process + $mock_zebra->launch_zebra; + # launch the zebra index process + $mock_zebra->launch_indexer; + + my $marcflavour = C4::Context->preference('marcflavour') || 'MARC21'; + + my $testdir = File::Spec->rel2abs( dirname(__FILE__) . '/../www/'); + my $file = + $marcflavour eq 'UNIMARC' + ? "$testdir/data/unimarcutf8record.mrc" + : "$testdir/data/marc21utf8record.mrc"; + + my $batch_id = $mock_zebra->load_records($file); + + # We need to prevent scrolling to prevent the floating toolbar from overlapping buttons we are testing + my $window_size = $driver->get_window_size(); + $driver->set_window_size(1920,10800); + + $driver->get( $opac_base_url . "opac-search.pl?q=d" ); + + # A better way to do that would be to modify the way we display the basket count + # We should show/hide the count instead or recreate the node + my @basket_count_elts = $driver->find_elements('//span[@id="basketcount"]/span'); + is( scalar(@basket_count_elts), 0, 'Basket should be empty'); + + # This will fail if nothing is indexed, but at this point we should have everything setup correctly + my @checkboxes = $driver->find_elements('//input[@type="checkbox"][@name="biblionumber"]'); + my $biblionumber1 = $checkboxes[0]->get_value(); + my $biblionumber3 = $checkboxes[2]->get_value(); + my $biblionumber5 = $checkboxes[4]->get_value(); + + $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber1.'"]')->click; + my $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); + is( $basket_count_elt->get_text(), + 1, 'One element should have been added to the cart' ); + + $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber3.'"]')->click; + $driver->find_element('//a[@class="btn btn-link btn-sm addtocart cart cart'.$biblionumber5.'"]')->click; + $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); + is( $basket_count_elt->get_text(), + 3, '3 elements should have been added to the cart' ); + + $driver->find_element('//a[@class="btn btn-link btn-sm remove cartRemove cartR'.$biblionumber3.'"]')->click; + $basket_count_elt = $driver->find_element('//span[@id="basketcount"]/span'); + is( $basket_count_elt->get_text(), + 2, '1 element should have been removed from the cart' ); + + # Reset window size + $driver->set_window_size($window_size->{'height'}, $window_size->{'width'}); + + $mock_zebra->clean_records($batch_id); + $mock_zebra->cleanup; +}; + +END { + C4::Context->set_preference('SearchEngine', $SearchEngine_value); + $mock_zebra->cleanup; +}; --- a/t/db_dependent/www/search_utf8.t +++ a/t/db_dependent/www/search_utf8.t @@ -22,22 +22,17 @@ use Test::More; #See plan tests => \d+ below use Test::WWW::Mechanize; use Data::Dumper; use XML::Simple; -use JSON; -use File::Basename; -use File::Path; -use File::Spec; -use File::Temp qw/ tempdir /; +use File::Basename qw(dirname ); use POSIX; use Encode; use URI::Escape; use C4::Context; +use t::lib::Mocks::Zebra; + my $testdir = File::Spec->rel2abs( dirname(__FILE__) ); # global variables that will be used when forking -our $zebra_pid; -our $indexer_pid; -our $datadir = tempdir();; my $koha_conf = $ENV{KOHA_CONF}; my $xml = XMLin($koha_conf); @@ -61,9 +56,8 @@ my $file3 = my $user = $ENV{KOHA_USER} || $xml->{config}->{user}; my $password = $ENV{KOHA_PASS} || $xml->{config}->{pass}; -my $intranet = $ENV{KOHA_INTRANET_URL}; -my $opac = $ENV{KOHA_OPAC_URL}; - +our $intranet = $ENV{KOHA_INTRANET_URL}; +our $opac = $ENV{KOHA_OPAC_URL}; # test KOHA_INTRANET_URL is set if ( not $intranet ) { @@ -74,181 +68,83 @@ elsif ( not $opac ) { plan skip_all => "Tests skip. You must set env. variable KOHA_OPAC_URL to do tests\n"; } else { - plan tests => 87; + plan tests => 89; } $intranet =~ s#/$##; $opac =~ s#/$##; +my $mock_zebra = t::lib::Mocks::Zebra->new( + { + koha_conf => $koha_conf, + user => $user, + password => $password, + intranet => $intranet, + opac => $opac + } +); + #-------------------------------- Test with greek and corean chars; # launch the zebra saerch process -launch_zebra( $datadir, $koha_conf ); -if ( not defined $zebra_pid ) { +$mock_zebra->launch_zebra; +if ( not defined $mock_zebra->{zebra_pid} ) { plan skip_all => "Tests skip. Error starting Zebra Server to do those tests\n"; } # launch the zebra index process -launch_indexer( ); -if ( not defined $indexer_pid ) { +$mock_zebra->launch_indexer; +if ( not defined $mock_zebra->{indexer_pid} ) { plan skip_all => "Tests skip. Error starting the indexer daemon to do those tests\n"; } -my $utf8_reg1 = qr/学協会. μμ/; -test_search($file1,'Αθήνα', 'deuteros', $utf8_reg1); +our $agent = Test::WWW::Mechanize->new( autocheck => 1 ); +$agent->get_ok( "$intranet/cgi-bin/koha/mainpage.pl", 'connect to intranet' ); +$agent->form_name('loginform'); +$agent->field( 'password', $password ); +$agent->field( 'userid', $user ); +$agent->field( 'branch', '' ); +$agent->click_ok( '', 'login to staff interface' ); +my $batch_id = $mock_zebra->load_records($file1); +my $utf8_reg1 = qr/学協会. μμ/; +test_search('Αθήνα', 'deuteros', $utf8_reg1); +$mock_zebra->clean_records($batch_id); +$mock_zebra->cleanup; #--------------------------------- Test with only utf-8 chars in the latin-1 range; -launch_zebra( $datadir, $koha_conf ); -if ( not defined $zebra_pid ) { +$mock_zebra->launch_zebra; +if ( not defined $mock_zebra->{zebra_pid} ) { plan skip_all => "Tests skip. Error starting Zebra Server to do those tests\n"; } -launch_indexer( ); -if ( not defined $indexer_pid ) { +$mock_zebra->launch_indexer; +if ( not defined $mock_zebra->{indexer_pid} ) { plan skip_all => "Tests skip. Error starting the indexer daemon to do those tests\n"; } +$batch_id = $mock_zebra->load_records($file2); my $utf8_reg2 = qr/Tòmas/; -test_search($file2,'Ramòn', 'Tòmas',$utf8_reg2); +test_search('Ramòn', 'Tòmas',$utf8_reg2); +$mock_zebra->clean_records($batch_id); +$mock_zebra->cleanup; #--------------------------------- Test with supplementary utf-8 chars; -launch_zebra( $datadir, $koha_conf ); -if ( not defined $zebra_pid ) { +$mock_zebra->launch_zebra; +if ( not defined $mock_zebra->{zebra_pid} ) { plan skip_all => "Tests skip. Error starting Zebra Server to do those tests\n"; } -launch_indexer( ); -if ( not defined $indexer_pid ) { +$mock_zebra->launch_indexer; +if ( not defined $mock_zebra->{indexer_pid} ) { plan skip_all => "Tests skip. Error starting the indexer daemon to do those tests\n"; } +$batch_id = $mock_zebra->load_records($file3); my $utf8_reg3 = qr/😀/; -test_search($file3, "𠻺tomasito𠻺", 'A tiny record', $utf8_reg3); +test_search("𠻺tomasito𠻺", 'A tiny record', $utf8_reg3); +$mock_zebra->clean_records($batch_id); +$mock_zebra->cleanup; sub test_search{ - #Params - my $file = $_[0]; - my $publisher = $_[1]; - my $search_key = $_[2]; - my $utf8_reg = $_[3]; - - my $agent = Test::WWW::Mechanize->new( autocheck => 1 ); - my $jsonresponse; - - # -------------------------------------------------- LOAD RECORD - - $agent->get_ok( "$intranet/cgi-bin/koha/mainpage.pl", 'connect to intranet' ); - $agent->form_name('loginform'); - $agent->field( 'password', $password ); - $agent->field( 'userid', $user ); - $agent->field( 'branch', '' ); - $agent->click_ok( '', 'login to staff interface' ); - - $agent->get_ok( "$intranet/cgi-bin/koha/mainpage.pl", 'load main page' ); - - $agent->follow_link_ok( { url_regex => qr/tools-home/i }, 'open tools module' ); - $agent->follow_link_ok( { text => 'Stage MARC records for import' }, - 'go to stage MARC' ); - - $agent->post( - "$intranet/cgi-bin/koha/tools/upload-file.pl?temp=1", - [ 'fileToUpload' => [$file], ], - 'Content_Type' => 'form-data', - ); - ok( $agent->success, 'uploaded file' ); - - $jsonresponse = decode_json $agent->content(); - is( $jsonresponse->{'status'}, 'done', 'upload succeeded' ); - my $fileid = $jsonresponse->{'fileid'}; - - $agent->get_ok( "$intranet/cgi-bin/koha/tools/stage-marc-import.pl", - 'reopen stage MARC page' ); - $agent->submit_form_ok( - { - form_number => 5, - fields => { - 'uploadedfileid' => $fileid, - 'nomatch_action' => 'create_new', - 'overlay_action' => 'replace', - 'item_action' => 'always_add', - 'matcher' => '', - 'comments' => '', - 'encoding' => 'utf8', - 'parse_items' => '1', - 'runinbackground' => '1', - 'record_type' => 'biblio' - } - }, - 'stage MARC' - ); - - $jsonresponse = decode_json $agent->content(); - my $jobID = $jsonresponse->{'jobID'}; - ok( $jobID, 'have job ID' ); - - my $completed = 0; - - # if we haven't completed the batch in two minutes, it's not happening - for my $counter ( 1 .. 24 ) { - $agent->get( - "$intranet/cgi-bin/koha/tools/background-job-progress.pl?jobID=$jobID" - ); # get job progress - $jsonresponse = decode_json $agent->content(); - if ( $jsonresponse->{'job_status'} eq 'completed' ) { - $completed = 1; - last; - } - warn( - ( - $jsonresponse->{'job_size'} - ? floor( - 100 * $jsonresponse->{'progress'} / $jsonresponse->{'job_size'} - ) - : '100' - ) - . "% completed" - ); - sleep 5; - } - is( $jsonresponse->{'job_status'}, 'completed', 'job was completed' ); - - $agent->get_ok( - "$intranet/cgi-bin/koha/tools/stage-marc-import.pl", - 'reopen stage MARC page at end of upload' - ); - $agent->submit_form_ok( - { - form_number => 5, - fields => { - 'uploadedfileid' => $fileid, - 'nomatch_action' => 'create_new', - 'overlay_action' => 'replace', - 'item_action' => 'always_add', - 'matcher' => '1', - 'comments' => '', - 'encoding' => 'utf8', - 'parse_items' => '1', - 'runinbackground' => '1', - 'completedJobID' => $jobID, - 'record_type' => 'biblio' - } - }, - 'stage MARC' - ); - - $agent->follow_link_ok( { text => 'Manage staged records' }, 'view batch' ); - - - $agent->form_number(6); - $agent->field( 'framework', '' ); - $agent->click_ok( 'mainformsubmit', "imported records into catalog" ); - my $webpage = $agent->{content}; - - $webpage =~ /(.*.*?)(\d{1,})(.*<\/title>)/sx; - my $id_batch = $2; - my $id_bib_number = GetBiblionumberFromImport($id_batch); - - # wait enough time for the indexer - sleep 10; + my ( $publisher, $search_key, $utf8_reg ) = @_; # --------------------------------- TEST INTRANET SEARCH - $agent->get_ok( "$intranet/cgi-bin/koha/catalogue/search.pl" , "got search on intranet"); $agent->form_number(5); $agent->field('idx', 'kw'); @@ -290,70 +186,12 @@ sub test_search{ # in the previous regex $agent->base_unlike( qr|idx=\w+|, 'Base does not contain an idx' ); - ok ( ( length(Encode::encode('UTF-8', $opac_text)) != length($opac_text) ) , 'UTF-8 are multi-byte. Good') ; ok ($opac_text =~ $utf8_reg, 'UTF-8 chars are correctly present. Good'); - #-------------------------------------------------- REVERT - - $agent->get_ok( "$intranet/cgi-bin/koha/tools/manage-marc-import.pl", 'view and clean batch' ); - $agent->form_name('clean_batch_'.$id_batch); - $agent->click(); - $agent->get_ok( "$intranet/cgi-bin/koha/catalogue/detail.pl?biblionumber=$id_bib_number", 'biblio on intranet' ); - $agent->get_ok( "$intranet/cgi-bin/koha/cataloguing/addbiblio.pl?op=delete&biblionumber=$id_bib_number", 'biblio deleted' ); - - # clean - cleanup(); -} - - -# function that launches the zebra daemon -sub launch_zebra { - - my ( $datadir, $koha_conf ) = @_; - - $zebra_pid = fork(); - if ( $zebra_pid == 0 ) { - exec("zebrasrv -f $koha_conf -v none,request -l $datadir/zebra.log"); - exit; - } - sleep( 1 ); -} - -sub launch_indexer { - - my $rootdir = dirname(__FILE__) . '/../../../'; - my $rebuild_zebra = "$rootdir/misc/migration_tools/rebuild_zebra.pl"; - - $indexer_pid = fork(); - - if ( $indexer_pid == 0 ) { - exec("$rebuild_zebra -daemon -sleep 5"); - exit; - } - sleep( 1 ); -} - -sub cleanup { - - kill 9, $zebra_pid if defined $zebra_pid; - kill 9, $indexer_pid if defined $indexer_pid; - # Clean up the Zebra files since the child process was just shot - rmtree $datadir; - -} - -sub GetBiblionumberFromImport{ - my ( $batch_id) = @_; - use C4::ImportBatch; - my $data = C4::ImportBatch::GetImportRecordsRange($batch_id, '', '', undef, - { order_by => 'import_record_id', order_by_direction => 'DESC' }); - my $biblionumber = $data->[0]->{'matched_biblionumber'}; - - return $biblionumber; } END { - cleanup(); + $mock_zebra->cleanup; }; --- a/t/lib/Mocks/Zebra.pm +++ a/t/lib/Mocks/Zebra.pm @@ -0,0 +1,206 @@ +package t::lib::Mocks::Zebra; + +use Modern::Perl; +use Test::More; +use File::Basename qw(dirname ); +use File::Temp qw( tempdir ); +use File::Path qw( rmtree ); +use JSON qw( decode_json ); +use C4::ImportBatch; + +sub new { + my ( $class, $params ) = @_; + + my $datadir = tempdir();; + my $self = { + datadir => $datadir, + koha_conf => $params->{koha_conf}, + user => $params->{user}, + password => $params->{password}, + intranet => $params->{intranet}, + opac => $params->{opac} + }; + return bless $self, $class; +} + +# function that launches the zebra daemon +sub launch_zebra { + my ( $self ) = @_; + + my $datadir = $self->{datadir}; + my $koha_conf = $self->{koha_conf}; + + my $zebra_pid = fork(); + if ( $zebra_pid == 0 ) { + exec("zebrasrv -f $koha_conf -v none,request -l $datadir/zebra.log"); + exit; + } + sleep( 1 ); + $self->{zebra_pid} = $zebra_pid; +} + +sub launch_indexer { + my ($self) = @_; + my $rootdir = dirname(__FILE__) . '/../../../'; + my $rebuild_zebra = "$rootdir/misc/migration_tools/rebuild_zebra.pl"; + + my $indexer_pid = fork(); + + if ( $indexer_pid == 0 ) { + exec("$rebuild_zebra -daemon -sleep 5"); + exit; + } + sleep( 1 ); + $self->{indexer_pid} = $indexer_pid; +} + +sub load_records { + my ( $self, $file ) = @_; + my $jsonresponse; + my $cgi_root = $self->{intranet} . '/cgi-bin/koha'; + + our $agent = Test::WWW::Mechanize->new( autocheck => 1 ); + $agent->get_ok( "$cgi_root/mainpage.pl", 'connect to intranet' ); + $agent->form_name('loginform'); + $agent->field( 'password', $self->{password} ); + $agent->field( 'userid', $self->{user} ); + $agent->field( 'branch', '' ); + $agent->click_ok( '', 'login to staff interface' ); + + $agent->get_ok( "$cgi_root/mainpage.pl", 'load main page' ); + + $agent->follow_link_ok( { url_regex => qr/tools-home/i }, 'open tools module' ); + $agent->follow_link_ok( { text => 'Stage MARC records for import' }, + 'go to stage MARC' ); + + $agent->post( + "$cgi_root/tools/upload-file.pl?temp=1", + [ 'fileToUpload' => [$file], ], + 'Content_Type' => 'form-data', + ); + ok( $agent->success, 'uploaded file' ); + + $jsonresponse = decode_json $agent->content(); + is( $jsonresponse->{'status'}, 'done', 'upload succeeded' ); + my $fileid = $jsonresponse->{'fileid'}; + + $agent->get_ok( "$cgi_root/tools/stage-marc-import.pl", + 'reopen stage MARC page' ); + $agent->submit_form_ok( + { + form_number => 5, + fields => { + 'uploadedfileid' => $fileid, + 'nomatch_action' => 'create_new', + 'overlay_action' => 'replace', + 'item_action' => 'always_add', + 'matcher' => '', + 'comments' => '', + 'encoding' => 'utf8', + 'parse_items' => '1', + 'runinbackground' => '1', + 'record_type' => 'biblio' + } + }, + 'stage MARC' + ); + + $jsonresponse = decode_json $agent->content(); + my $jobID = $jsonresponse->{'jobID'}; + ok( $jobID, 'have job ID' ); + + my $completed = 0; + + # if we haven't completed the batch in two minutes, it's not happening + for my $counter ( 1 .. 24 ) { + $agent->get( + "$cgi_root/tools/background-job-progress.pl?jobID=$jobID" + ); # get job progress + $jsonresponse = decode_json $agent->content(); + if ( $jsonresponse->{'job_status'} eq 'completed' ) { + $completed = 1; + last; + } + warn( + ( + $jsonresponse->{'job_size'} + ? floor( + 100 * $jsonresponse->{'progress'} / $jsonresponse->{'job_size'} + ) + : '100' + ) + . "% completed" + ); + sleep 5; + } + is( $jsonresponse->{'job_status'}, 'completed', 'job was completed' ); + + $agent->get_ok( + "$cgi_root/tools/stage-marc-import.pl", + 'reopen stage MARC page at end of upload' + ); + $agent->submit_form_ok( + { + form_number => 5, + fields => { + 'uploadedfileid' => $fileid, + 'nomatch_action' => 'create_new', + 'overlay_action' => 'replace', + 'item_action' => 'always_add', + 'matcher' => '1', + 'comments' => '', + 'encoding' => 'utf8', + 'parse_items' => '1', + 'runinbackground' => '1', + 'completedJobID' => $jobID, + 'record_type' => 'biblio' + } + }, + 'stage MARC' + ); + + $agent->follow_link_ok( { text => 'Manage staged records' }, 'view batch' ); + + + $agent->form_number(6); + $agent->field( 'framework', '' ); + $agent->click_ok( 'mainformsubmit', "imported records into catalog" ); + my $webpage = $agent->{content}; + + $webpage =~ /(.*<title>.*?)(\d{1,})(.*<\/title>)/sx; + my $batch_id = $2; + + # wait enough time for the indexer + sleep 10; + + return $batch_id; + +} + +sub clean_records { + my ( $self, $batch_id ) = @_; + + my $agent = Test::WWW::Mechanize->new( autocheck => 1 ); + my $cgi_root = $self->{intranet} . '/cgi-bin/koha'; + + my $data = C4::ImportBatch::GetImportRecordsRange($batch_id, '', '', undef, + { order_by => 'import_record_id', order_by_direction => 'DESC' }); + my $biblionumber = $data->[0]->{'matched_biblionumber'}; + + $agent->get_ok( "$cgi_root/tools/manage-marc-import.pl", 'view and clean batch' ); + $agent->form_name('clean_batch_'.$batch_id); + $agent->click(); + $agent->get_ok( "$cgi_root/catalogue/detail.pl?biblionumber=$biblionumber", 'biblio on intranet' ); + $agent->get_ok( "$cgi_root/cataloguing/addbiblio.pl?op=delete&biblionumber=$biblionumber", 'biblio deleted' ); + +} + +sub cleanup { + my ( $self ) = @_; + kill 9, $self->{zebra_pid} if defined $self->{zebra_pid}; + kill 9, $self->{indexer_pid} if defined $self->{indexer_pid}; + # Clean up the Zebra files since the child process was just shot + rmtree $self->{datadir}; +} + +1; --