#!/usr/bin/perl
# Copyright 2014 Rijksmuseum
#
# 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use FindBin;
use Test::More tests => 24;
use Koha::XSLT_Handler;
my $engine=Koha::XSLT_Handler->new;
is( ref $engine, 'Koha::XSLT_Handler', 'Testing creation of handler object' );
$engine->transform(''); #we passed no file at first time
is( $engine->err, 1, 'Engine returns error on no file' );
$engine->transform( '', 'thisfileshouldnotexist.%$#@' );
is( $engine->err, 2, 'Engine returns error on bad file' );
is( $engine->refresh( 'asdjhaskjh'), 0, 'Test on invalid refresh' );
#check first test xsl
my $path= $FindBin::Bin.'/XSLT_Handler/';
my $xsltfile_1 = 'test01.xsl';
is( -e $path.$xsltfile_1, 1, "Found my test stylesheet $xsltfile_1" );
exit if !-e $path.$xsltfile_1;
$xsltfile_1= $path.$xsltfile_1;
#Testing not-xml strings (undef, empty, some text, malformed xml
my $output= $engine->transform( undef, $xsltfile_1 );
is( $engine->err, 7, 'Engine returns error on undefined text' );
$output= $engine->transform( '', $xsltfile_1 );
is( $engine->err, 5, 'Engine returns error on empty string' );
$output= $engine->transform( 'abcdef', $xsltfile_1 );
is( $engine->err, 5, 'Engine returns error on non-xml' );
$output= $engine->transform( '', $xsltfile_1 );
is( $engine->err, 5, 'Engine returns error on malformed xml' );
#Test not returning source on failure when asked for
#Include passing do_not_return via constructor on second engine
my $secondengine=Koha::XSLT_Handler->new( {
do_not_return_source => 'very_true',
some_unknown_attrib => 'just_for_fun',
});
$engine->do_not_return_source(1);
$output= $engine->transform( '', $xsltfile_1 );
is( defined $output? 1: 0, 0, 'Engine respects do_not_return_source==1');
$output= $secondengine->transform( '', $xsltfile_1 );
is( defined $output? 1: 0, 0, 'Second engine respects it too');
undef $secondengine; #bye
$engine->do_not_return_source(0);
$output= $engine->transform( '', $xsltfile_1 );
is( defined $output? 1: 0, 1, 'Engine respects do_not_return_source==0');
#Testing valid refresh now
is( $engine->refresh($xsltfile_1), 1, 'Test on valid refresh' );
#A second time (for all) should return 0 now
is( $engine->refresh, 0, 'Test on repeated refresh' );
#Testing a string that should not change too much
my $xml_1=<<'EOT';
EOT
$output= $engine->transform( $xml_1, $xsltfile_1 );
is( $engine->err, undef, 'Engine returned no error for xml_1' );
is( index($output,'')>0, 1, 'No real change expected for xml_1' ); #Just very simple check if the tag was still there
#Test of adding a new datafield to rudimentary 'marc record'
my $xml_2=<<'EOT';
1234
My favorite title
EOT
$output= $engine->transform( $xml_2 );
#note: second parameter (file) not passed again
is( $engine->err, undef, 'Engine returned no error for xml_2' );
is( index($output,'I saw you')>0, 1, 'Saw the expected change for xml_2' ); #Just very simple check if new datafield was added
#The second test xsl contains bad code
my $xsltfile_2 = 'test02.xsl';
is( -e $path.$xsltfile_2, 1, "Found my test stylesheet $xsltfile_2" );
exit if !-e $path.$xsltfile_2;
$xsltfile_2= $path.$xsltfile_2;
$output= $engine->transform( $xml_2, $xsltfile_2 );
is( $engine->err, 4, 'Engine returned error for parsing bad xsl' );
is( defined($engine->errstr), 1, 'Error string contains text');
#The third test xsl is okay again; main use is clearing two items from cache
my $xsltfile_3 = 'test03.xsl';
is( -e $path.$xsltfile_3, 1, "Found my test stylesheet $xsltfile_3" );
exit if !-e $path.$xsltfile_3;
$xsltfile_3= $path.$xsltfile_3;
$output= $engine->transform( $xml_2, $xsltfile_3 );
is( $engine->err, undef, 'Unexpected error on transform with third xsl' );
is( $engine->refresh, 2, 'Final test on clearing cache' );
#End of tests