Subject: [PATCH 2/3] Bug 12872: Unit tests for ZebraExclude preference

From: Marcel de Rooy <[email-masked]>
Date: Thu, 11 Sep 2014 14:23:41 +0200

Test plan:
Run ZebraExclude.t

Signed-off-by: Paola Rossi <[email-masked]>
---
 t/db_dependent/ZebraExclude.t |  160 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 160 insertions(+)
 create mode 100644 t/db_dependent/ZebraExclude.t

diff --git a/t/db_dependent/ZebraExclude.t b/t/db_dependent/ZebraExclude.t
new file mode 100644
index 0000000..776c754
--- /dev/null
+++ b/t/db_dependent/ZebraExclude.t
@@ -0,0 +1,160 @@
+#!/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 C4::Context;
+use C4::Biblio;
+use misc::migration_tools::ZebraExclude;
+
+use MARC::Record;
+use MARC::File::XML;
+use Test::More tests => 2;
+
+my $dbh = C4::Context->dbh;
+$dbh->{AutoCommit} = 0;
+$dbh->{RaiseError} = 1;
+
+subtest '01parse' => sub {
+    plan tests => 17;
+    test_parsing_pref();
+};
+subtest '02exclude' => sub {
+    plan tests => 12;
+    test_exclude();
+};
+
+$dbh->rollback;
+
+sub test_parsing_pref {
+    my ($excl, @a, @b, $hash, $reg);
+
+    $dbh->do("DELETE FROM systempreferences where variable='ZebraExclude'");
+    is( defined load_zebra_exclude(), '', 'Test without pref');
+
+    C4::Context->set_preference('ZebraExclude', '590,952e');
+    $excl = load_zebra_exclude();
+    @a= @{$excl->{list}};
+    is( @a, 1, 'Expect one parsed line');
+    ($hash, $reg) = @{$a[0]};
+    is( defined $reg, '', 'No regex in first line' );
+    @b= @{$hash->{field}};
+    is( @b, 1, 'Expect one whole field' );
+    is( $b[0], '590', 'Should be 590' );
+    @b= @{$hash->{subfield}};
+    is( @b, 1, 'Expect one subfield' );
+    is( $b[0][0] eq '952' && $b[0][1] eq 'e', 1, 'Should be 952e' );
+
+    C4::Context->set_preference('ZebraExclude', "\n/\// : 590, 8XX, nothing\n");
+    $excl = load_zebra_exclude();
+    @a= @{$excl->{list}};
+    is( @a, 1, 'Expect one parsed line');
+    ($hash, $reg) = @{$a[0]};
+    is( $reg, '/', 'Check regex /' );
+    @b= @{$hash->{field}};
+    is( @b, 1, 'Expect one whole field' );
+    @b= @{$hash->{wildcard}};
+    is( @b, 1, 'Expect one wildcard' );
+
+    C4::Context->set_preference('ZebraExclude', '/Garbage[/: 9XX');
+    $excl = load_zebra_exclude();
+    @a= @{$excl->{list}};
+    ($hash, $reg) = @{$a[0]};
+    is( $reg, undef, 'Wrong regex with only [' );
+
+    C4::Context->set_preference('ZebraExclude',
+        "/_skip_/: XXX\n".
+        "//: 590, 920, 952e\n"
+    );
+    $excl = load_zebra_exclude();
+    @a= @{$excl->{list}};
+    is( @a, 2, 'Expect two parsed lines');
+    ($hash, $reg) = @{$a[0]};
+    is( $reg, '_skip_', 'Check regex _skip_' );
+    ($hash, $reg) = @{$a[1]};
+    @b= @{$hash->{wildcard}};
+    is( @b, 0, 'Expect no wildcard for line 2' );
+    @b= @{$hash->{field}};
+    is( @b, 2, 'Expect two whole fields' );
+    @b= @{$hash->{subfield}};
+    is( @b, 1, 'Expect one subfield' );
+}
+
+sub test_exclude {
+    my ( $marc, $rv, $excl, $c1, $c2, @f );
+
+    C4::Context->set_preference('ZebraExclude', '590,952e');
+    $excl = load_zebra_exclude();
+    $marc= mybiblio();
+    $c1 = scalar $marc->fields;
+    $rv = exclude_fields( $marc, $excl );
+    $c2 = scalar $marc->fields;
+    is( $rv, 1, 'Checked return value' );
+    is( $c1-$c2, 2, 'Expected two fields less' );
+    is( $marc->field('590'), undef, 'No field 590' );
+    @f = $marc->field('952');
+    is( @f, 1, 'One field 952' );
+    is( $marc->subfield('952', 'o'), '123 A 456', 'Checked 952$o' );
+
+    C4::Context->set_preference('ZebraExclude', '/Garbage/:XXX');
+    $excl = load_zebra_exclude();
+    $marc= mybiblio();
+    $rv = exclude_fields( $marc, $excl );
+    is( $rv, undef, 'Checked return value with Garbage' );
+    C4::Context->set_preference('ZebraExclude', '/G@rb@ge/:XXX');
+    $excl = load_zebra_exclude();
+    $marc= mybiblio();
+    $c1 = scalar $marc->fields;
+    $rv = exclude_fields( $marc, $excl );
+    $c2 = scalar $marc->fields;
+    is( $rv, 1, 'Checked return value with G@rb@ge' );
+    is( $c1, $c2, 'Checked number of fields for G@rb@ge' );
+
+    C4::Context->set_preference('ZebraExclude',
+        "/local note/: 590a\n".
+        "/Author2/: 1XX\n".
+        "/Author1/: 245, 3XX, 9XX\n"
+    );
+    $excl = load_zebra_exclude();
+    $marc= mybiblio();
+    $c1 = scalar $marc->fields;
+    $rv = exclude_fields( $marc, $excl );
+    $c2 = scalar $marc->fields;
+    is( $c1-$c2, 5, 'Expected 5 fields less' );
+    is( $marc->field('245'), undef, 'No field 245' );
+    is( $marc->field('952'), undef, 'No fields 952' );
+    is( defined $marc->field('999'), 1, 'Field 999 should still be there' );
+}
+
+sub mybiblio {
+    my $marc= MARC::Record->new;
+    my @fld= (
+        MARC::Field->new('001', 12345),
+        MARC::Field->new('100', '', '', a => 'Author1' ),
+        MARC::Field->new('245', '', '', a => 'Just a title' ),
+        MARC::Field->new('500', '', '', a => 'Just a note' ),
+        MARC::Field->new('590', '', '', a => 'Just a local note' ),
+        MARC::Field->new('920', '', '', a => 'Garbage' ),
+        MARC::Field->new('952', '', '', e => 'acqsource', o => '123 A 456' ),
+        MARC::Field->new('952', '', '', e => 'only sub' ),
+        MARC::Field->new('999', '', '', c => 12345, d => 12345 ),
+    );
+    $marc->append_fields(@fld);
+    return $marc;
+}
-- 
1.7.10.4