From 7e380967bca9d42b23c7401f240930b796dc2f79 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 Content-Type: text/plain; charset=utf-8 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 Signed-off-by: Marcel de Rooy --- 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; -- 1.7.10.4