Bug 11826: Add unit tests for Koha::XSLT_Handler
authorMarcel de Rooy <m.de.rooy@rijksmuseum.nl>
Fri, 21 Feb 2014 16:21:55 +0000 (17:21 +0100)
committerGalen Charlton <gmc@esilibrary.com>
Mon, 26 May 2014 03:52:45 +0000 (03:52 +0000)
Test plan:
Verify if XSLT_Handler.t passes.
You could also sabotage the test by removing one of the test xsl files.
Or you could 'repair' the bad xsl file (test02). Remove the second line
redefining the xsl variable.
In all those cases the unit test should fail now.. Discard your changes :)

Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com>
Test pass. No koha-qa errors.

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
t/db_dependent/XSLT_Handler.t [new file with mode: 0644]
t/db_dependent/XSLT_Handler/test01.xsl [new file with mode: 0644]
t/db_dependent/XSLT_Handler/test02.xsl [new file with mode: 0644]
t/db_dependent/XSLT_Handler/test03.xsl [new file with mode: 0644]

diff --git a/t/db_dependent/XSLT_Handler.t b/t/db_dependent/XSLT_Handler.t
new file mode 100644 (file)
index 0000000..8bdfdef
--- /dev/null
@@ -0,0 +1,119 @@
+#!/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( '<a></b>', $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( '<a></b>', $xsltfile_1 );
+is( defined $output? 1: 0, 0, 'Engine respects do_not_return_source==1');
+$output= $secondengine->transform( '<a></b>', $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( '<a></b>', $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';
+<just_a_tagname>
+</just_a_tagname>
+EOT
+$output= $engine->transform( $xml_1, $xsltfile_1 );
+is( $engine->err, undef, 'Engine returned no error for xml_1' );
+is( index($output,'<just_a_tagname>')>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';
+<?xml version="1.0" encoding="UTF-8"?>
+<collection>
+<record>
+<controlfield tag="001">1234</controlfield>
+<datafield tag="245" ind1="1" ind2="0"><subfield tag="a">My favorite title</subfield></datafield>
+</record>
+</collection>
+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
diff --git a/t/db_dependent/XSLT_Handler/test01.xsl b/t/db_dependent/XSLT_Handler/test01.xsl
new file mode 100644 (file)
index 0000000..3c2b188
--- /dev/null
@@ -0,0 +1,24 @@
+<xsl:stylesheet version="1.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:marc="http://www.loc.gov/MARC21/slim"
+>
+  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+
+  <xsl:template match="record">
+      <record>
+      <xsl:apply-templates/>
+      <datafield tag="990">
+        <subfield code="a">
+          <xsl:text>I saw you</xsl:text>
+        </subfield>
+      </datafield>
+      </record>
+  </xsl:template>
+
+  <xsl:template match="node()">
+    <xsl:copy select=".">
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/t/db_dependent/XSLT_Handler/test02.xsl b/t/db_dependent/XSLT_Handler/test02.xsl
new file mode 100644 (file)
index 0000000..89f11a5
--- /dev/null
@@ -0,0 +1,13 @@
+<!-- This is BAD coded xslt stylesheet to test XSLT_Handler -->
+<xsl:stylesheet version="1.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:marc="http://www.loc.gov/MARC21/slim"
+>
+  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+
+  <xsl:variable name="redefine" select="0"/>
+  <xsl:variable name="redefine" select="1"/>
+      <!-- Intentional redefine to generate parsing error -->
+  <xsl:template match="record">
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/t/db_dependent/XSLT_Handler/test03.xsl b/t/db_dependent/XSLT_Handler/test03.xsl
new file mode 100644 (file)
index 0000000..6ade551
--- /dev/null
@@ -0,0 +1,17 @@
+<xsl:stylesheet version="1.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:marc="http://www.loc.gov/MARC21/slim"
+>
+  <xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes"/>
+
+  <xsl:template match="/">
+      <xsl:apply-templates/>
+  </xsl:template>
+
+  <xsl:template match="node()">
+    <xsl:copy select=".">
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>