Bug 28290: (follow-up) Unit test
[srvgit] / t / Matcher.t
index 3d7f6e9..2c7b288 100755 (executable)
@@ -27,20 +27,18 @@ use Module::Load::Conditional qw/check_install/;
 
 BEGIN {
     if ( check_install( module => 'Test::DBIx::Class' ) ) {
-        plan tests => 12;
+        plan tests => 13;
     } else {
         plan skip_all => "Need Test::DBIx::Class"
     }
 }
 
-use_ok('C4::Matcher');
+use Test::DBIx::Class;
 
-use Test::DBIx::Class {
-    schema_class => 'Koha::Schema',
-    connect_info => ['dbi:SQLite:dbname=:memory:','',''],
-    connect_opts => { name_sep => '.', quote_char => '`', },
-    fixture_class => '::Populate',
-}, 'MarcMatcher' ;
+my $db = Test::MockModule->new('Koha::Database');
+$db->mock( _new_schema => sub { return Schema(); } );
+
+use_ok('C4::Matcher', qw( GetMatcherList GetMatcherId ));
 
 fixtures_ok [
     MarcMatcher => [
@@ -50,9 +48,6 @@ fixtures_ok [
     ],
 ], 'add fixtures';
 
-my $db = Test::MockModule->new('Koha::Database');
-$db->mock( _new_schema => sub { return Schema(); } );
-
 my @matchers = C4::Matcher::GetMatcherList();
 
 is( $matchers[0]->{'matcher_id'}, 1, 'First matcher_id value is 1' );
@@ -87,7 +82,7 @@ is( $testmatcher->description(), 'match on ISSN', 'testing code accessor' );
 
 subtest '_get_match_keys() tests' => sub {
 
-    plan tests => 17;
+    plan tests => 21;
 
     my $matchpoint = get_title_matchpoint({
         length => 0,
@@ -97,6 +92,12 @@ subtest '_get_match_keys() tests' => sub {
 
     my $record = MARC::Record->new();
     $record->append_fields(
+        MARC::Field->new('020', '1', ' ',
+                            a => '978-1451697216 (alk. paper)'),
+        MARC::Field->new('020', '1', ' ',
+                            a => '145169721X (alk. paper)'),
+        MARC::Field->new('020', '1', ' ',
+                            a => '1NOTISBN3'),
         MARC::Field->new('100', '1', ' ',
                             a => 'King, Stephen',
                             d => 'd1947-'),
@@ -247,6 +248,44 @@ subtest '_get_match_keys() tests' => sub {
 
     is( $keys[0], '  .; THE T[]:,ALIS(M)/AN\'" STEPHEN KING, PETER STRAUB.',
         'Match key correctly normalized if invalid normalization routine specified' );
+
+    $matchpoint = get_isbn_matchpoint({
+        length => 0,
+        norms  => [ 'ISBN' ],
+        offset => 0
+    });
+    @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+    is( $keys[0], '9781451697216',
+        'Match key correctly calculated as ISBN13 when ISBN normalizer used');
+    is( $keys[1], '9781451697216',
+        'Match key correctly calculated as ISBN13 when ISBN normalizer used');
+    is( $keys[2], '1NOTISBN3',
+        'Match key passed through if not an isbn when ISBN normalizer used');
+
+    $matchpoint = get_title_matchpoint({
+        length => 0,
+        offset => 0
+    });
+    delete $matchpoint->{component}->{subfields};
+    @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+    is( $keys[0], '  .; thE t[]:,aliS(m)/An\'" Stephen King, Peter Straub.', "Match key correctly returns whole field if no subfields specified" )
+};
+
+subtest '_get_match_keys() leader tests' => sub {
+    plan tests => 2;
+    my $record = MARC::Record->new();
+    my $matchpoint = get_leader_matchpoint({
+        length => 1,
+        offset => 6,
+    });
+
+    my @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+    is( $keys[0], ' ', 'Match key correctly calculated as " " from LDR6 when no leader available');
+
+    $record->leader('01344cam a22003014a 4500');
+
+    @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+    is( $keys[0], 'a', 'Match key correctly calculated as "a" from LDR6');
 };
 
 sub get_title_matchpoint {
@@ -316,4 +355,50 @@ sub get_authors_matchpoint {
     return $matchpoint;
 }
 
-1;
+sub get_isbn_matchpoint {
+
+    my $params = shift;
+
+    my $length = $params->{length} // 0;
+    my $norms  = $params->{norms}  // [];
+    my $offset = $params->{offset} // 0;
+
+    my $matchpoint = {
+        components =>  [
+            {
+                length    => $length,
+                norms     => $norms,
+                offset    => $offset,
+                subfields =>
+                    {
+                        a => 1
+                    },
+                tag => '020'
+            },
+        ],
+        index => "isbn",
+        score => 1000
+    };
+
+    return $matchpoint;
+}
+
+sub get_leader_matchpoint {
+    my $params = shift;
+    my $length = $params->{length} // 0;
+    my $norms  = $params->{norms}  // [];
+    my $offset = $params->{offset} // 0;
+
+    my $matchpoint = {
+        components =>  [
+            {
+                length    => $length,
+                norms     => $norms,
+                offset    => $offset,
+                tag => 'LDR'
+            },
+        ],
+    };
+
+    return $matchpoint;
+}