From 6a725bde1e8a78f96d88213ae350155f60cbedfb Mon Sep 17 00:00:00 2001 From: Emmanuele Somma Date: Sat, 22 Nov 2014 21:34:23 +0100 Subject: [PATCH 07/11] Bug 13264: Additional test for search in intranet calatogue The utf-8 test do: insert a biblio record with tool, search the record in intranet, delete batch upload and biblio records. To test: prove intranet_search_utf8.t Signed-off-by: Jonathan Druart --- t/db_dependent/www/intranet_search_utf8.t | 272 +++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 t/db_dependent/www/intranet_search_utf8.t diff --git a/t/db_dependent/www/intranet_search_utf8.t b/t/db_dependent/www/intranet_search_utf8.t new file mode 100644 index 0000000..1fdfa66 --- /dev/null +++ b/t/db_dependent/www/intranet_search_utf8.t @@ -0,0 +1,272 @@ +#!/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 utf8; +use Test::More; +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 POSIX; +use Encode; + +use C4::Context; + +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); + +my $marcflavour = C4::Context->preference('marcflavour') || 'MARC21'; + +# For the purpose of this test, we can reasonably take MARC21 and NORMARC to be the same +my $file = + $marcflavour eq 'UNIMARC' + ? "$testdir/data/unimarcutf8record.mrc" + : "$testdir/data/marc21utf8record.mrc"; + +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}; + +# launch the zebra process +launch_zebra( $datadir, $koha_conf ); +if ( not defined $zebra_pid ) { + plan skip_all => "Tests skip. Error starting Zebra Server to do those tests\n"; +} +# launch the zebra process +launch_indexer( ); +if ( not defined $indexer_pid ) { + plan skip_all => "Tests skip. Error starting the indexer daemon to do those tests\n"; +} +# test KOHA_INTRANET_URL is set +if ( not defined $intranet ) { + plan skip_all => "Tests skip. You must set env. variable KOHA_INTRANET_URL to do tests\n"; +} +# test KOHA_OPAC_URL is set +if ( not defined $opac ) { + plan skip_all => "Tests skip. You must set env. variable KOHA_OPAC_URL to do tests\n"; +} + +$intranet =~ s#/$##; +$opac =~ s#/$##; + +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 client' ); + +$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", + [ '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', + } + }, + '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, + } + }, + 'stage MARC' +); + +$agent->follow_link_ok( { text => 'Manage staged records' }, 'view batch' ); + + +$agent->form_number(5); +$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; + +# --------------------------------- TEST INTRANET SEARCH + +$agent->get_ok( "$intranet/cgi-bin/koha/catalogue/search.pl" , "got search on intranet"); +$agent->form_number(1); +$agent->field('idx', 'kw'); +$agent->field('q', 'deuteros'); +$agent->click(); + +my $text = $agent->text() ; + +#Tests on UTF-8 + +ok ( ( length(Encode::encode_utf8($text)) != length($text) ) , 'UTF-8 are multi-byte. Goog') ; +ok ($text =~ m/学協会. μμ/, '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(); + +done_testing(); + +# 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; +} +1; -- 1.7.10.4