From b83758212671a0196c330e3e151850f5b3fa10fa Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Wed, 14 Sep 2016 16:00:19 -0300 Subject: [PATCH] Bug 17304: Introduce C4::Matcher::_get_match_keys unit tests This function is used in several places, but it's behaviour is not covered by tests, thus trying to patch it can be problematic without introducing regressions. This patch introduces unit tests for it, in the t/Matcher.t file. To test: - Apply the patch - Run: $ prove t/Matcher.t => SUCCESS: Tests pass - Sign off :-D --- t/Matcher.t | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 1 deletion(-) diff --git a/t/Matcher.t b/t/Matcher.t index 652f061..aac83b0 100755 --- a/t/Matcher.t +++ b/t/Matcher.t @@ -20,11 +20,13 @@ use Modern::Perl; use Test::More; use Test::MockModule; +use MARC::Record; + use Module::Load::Conditional qw/check_install/; BEGIN { if ( check_install( module => 'Test::DBIx::Class' ) ) { - plan tests => 11; + plan tests => 12; } else { plan skip_all => "Need Test::DBIx::Class" } @@ -82,4 +84,163 @@ $testmatcher->description('match on ISSN'); is( $testmatcher->description(), 'match on ISSN', 'testing code accessor' ); +subtest '_get_match_keys() tests' => sub { + + plan tests => 8; + + my $matchpoint = get_title_matchpoint({ + length => 0, + norms => [], + offset => 0 + }); + + my $record = MARC::Record->new(); + $record->append_fields( + MARC::Field->new('100', '1', ' ', + a => 'King, Stephen', + d => 'd1947-'), + MARC::Field->new('245', ' ', ' ', + a => ' .; thE t[]:,aliS(m)/An\'"', + c => 'Stephen King, Peter Straub.' ), + MARC::Field->new('700', ' ', ' ', + a => 'Straub, Peter', + d => '1943-') + ); + + my @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + + is( $keys[0], 'THE TALISMAN STEPHEN KING PETER STRAUB', + 'Match key correctly calculated with no $norms'); + + $matchpoint = get_title_matchpoint({ + length => 9, + norms => [], + offset => 0 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'THE', + 'Match key correctly calculated with length 9'); + + $matchpoint = get_title_matchpoint({ + length => 9, + norms => [], + offset => 1 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'THE', + 'Match key correctly calculated with length 9 and offset 1'); + + $matchpoint = get_title_matchpoint({ + length => 9, + norms => [], + offset => 2 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'THE T', + 'Match key correctly calculated with length 9 and offset 2, should not remove space'); + + $matchpoint = get_authors_matchpoint({ + length => 0, + norms => [], + offset => 0 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'STRAUB PETER KING STEPHEN', + 'Match key correctly calculated with multiple components'); + + $matchpoint = get_authors_matchpoint({ + length => 9, + norms => [], + offset => 0 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'STRAUB KING ST', + 'Match key correctly calculated with multiple components, length 9'); + + $matchpoint = get_authors_matchpoint({ + length => 10, + norms => [], + offset => 0 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'STRAUB P KING STE', + 'Match key correctly calculated with multiple components, length 10'); + + $matchpoint = get_authors_matchpoint({ + length => 10, + norms => [], + offset => 2 + }); + @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ); + is( $keys[0], 'TRAUB PET ING STEPH', + 'Match key correctly calculated with multiple components, length 10, offset 1'); +}; + +sub get_title_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, + c => 1 + }, + tag => '245' + } + ], + index => "title", + score => 1000 + }; + + return $matchpoint; +} + +sub get_authors_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 => '700' + }, + { + length => $length, + norms => $norms, + offset => $offset, + subfields => + { + a => 1 + }, + tag => '100' + } + ], + index => "author", + score => 1000 + }; + + return $matchpoint; +} + 1; -- 2.10.0