Bug 18936: Fix some more tests
[srvgit] / t / db_dependent / XSLT_Handler.t
index 8bdfdef..349d637 100644 (file)
 use Modern::Perl;
 
 use FindBin;
-use Test::More tests => 24;
+use File::Slurp;
+use Test::More tests => 35;
+use Test::Warn;
 
 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('');
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_1, 'Engine returns error on no file' );
 
 $engine->transform( '', 'thisfileshouldnotexist.%$#@' );
-is( $engine->err, 2, 'Engine returns error on bad file' );
-
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_2, 'Engine returns error on bad file' );
 is( $engine->refresh( 'asdjhaskjh'), 0, 'Test on invalid refresh' );
 
 #check first test xsl
@@ -43,14 +44,28 @@ 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' );
+my $output;
+
+# Undefined text tests
+$output = $engine->transform( undef, $xsltfile_1 );
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_7, 'Engine returns error on undefined text' );
+
+# Empty string tests
+$output = $engine->transform( '', $xsltfile_1 );
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_5, 'Engine returns error on empty string' );
+
+# Non-XML tests
+$engine->print_warns(1);
+warning_like { $output = $engine->transform( 'abcdef', $xsltfile_1 ) }
+    qr{parser error : Start tag expected, '<' not found},
+    "Non-XML warning correctly displayed";
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_5, 'Engine returns error on non-xml' );
+
+# Malformed XML tests
+warning_like { $output = $engine->transform( '<a></b>', $xsltfile_1 ) }
+    qr{parser error : Opening and ending tag mismatch: a line 1 and b},
+    "Malformed XML warning correctly displayed";
+is( $engine->err, Koha::XSLT_Handler::XSLTH_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
@@ -59,13 +74,20 @@ my $secondengine=Koha::XSLT_Handler->new( {
     some_unknown_attrib  => 'just_for_fun',
 });
 $engine->do_not_return_source(1);
-$output= $engine->transform( '<a></b>', $xsltfile_1 );
+warning_like { $output = $engine->transform( '<a></b>', $xsltfile_1 ) }
+    qr{parser error : Opening and ending tag mismatch: a line 1 and b},
+    "Malformed XML warning correctly displayed";
 is( defined $output? 1: 0, 0, 'Engine respects do_not_return_source==1');
-$output= $secondengine->transform( '<a></b>', $xsltfile_1 );
+$secondengine->print_warns(1);
+warning_like { $output = $secondengine->transform( '<a></b>', $xsltfile_1 ) }
+    qr{parser error : Opening and ending tag mismatch: a line 1 and b},
+    "Malformed XML warning correctly displayed";
 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 );
+warning_like { $output = $engine->transform( '<a></b>', $xsltfile_1 ) }
+    qr{parser error : Opening and ending tag mismatch: a line 1 and b},
+    "Malformed XML warning correctly displayed";
 is( defined $output? 1: 0, 1, 'Engine respects do_not_return_source==0');
 
 #Testing valid refresh now
@@ -96,6 +118,21 @@ $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
+#Test alternative parameter passing
+my $output2;
+$output2 = $engine->transform( { file => $xsltfile_1, xml => $xml_2 } );
+is( $output, $output2, 'Try hash parameter file');
+my $code = read_file( $xsltfile_1 );
+$output2 = $engine->transform( { code => $code, xml => $xml_2 } );
+is( $output, $output2, 'Try hash parameter code');
+#Check rerun on last code
+$output2 = $engine->transform( $xml_2 );
+is( $output, $output2, 'Rerun on previous passed code');
+#Check format xmldoc
+is( ref $engine->transform({
+    file => $xsltfile_1, xml => $xml_2, format => 'xmldoc',
+}), 'XML::LibXML::Document',
+'Format parameter returns a xml document object' );
 
 #The second test xsl contains bad code
 my $xsltfile_2 = 'test02.xsl';
@@ -103,9 +140,9 @@ 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');
+$engine->print_warns(0);
+$output = $engine->transform( $xml_2, $xsltfile_2 );
+is( $engine->err, Koha::XSLT_Handler::XSLTH_ERR_4, 'Engine returned error for parsing bad xsl' );
 
 #The third test xsl is okay again; main use is clearing two items from cache
 my $xsltfile_3 = 'test03.xsl';
@@ -114,6 +151,29 @@ 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' );
-
+is( $engine->refresh, 3, 'Final test on clearing cache' );
+
+my $xsltfile_4 = 'test04.xsl';
+is( -e $path.$xsltfile_4, 1, "Found my test stylesheet $xsltfile_4" );
+exit if !-e $path.$xsltfile_4;
+$xsltfile_4 = $path.$xsltfile_4;
+
+my $parameters = { injected_variable => "'this is a test'",};
+$output = $engine->transform({
+            xml => $xml_1,
+            file => $xsltfile_4,
+            parameters => $parameters,
+        });
+require XML::LibXML;
+my $dom = XML::LibXML->load_xml(string => $output);
+my $result = $dom->find( '/just_a_tagname' );
+is ( $result->to_literal(), 'this is a test', "Successfully injected string into XSLT parameter/variable");
+
+$output = $engine->transform({
+            xml => $xml_1,
+            file => $xsltfile_4,
+        });
+$dom = XML::LibXML->load_xml(string => $output);
+$result = $dom->find( '/just_a_tagname' );
+is ( $result->to_literal(), '', "As expected, no XSLT parameters/variables were added");
 #End of tests