Koha/t/db_dependent/Biblio/TransformMarcToKoha.t
Marcel de Rooy 661702e669
Bug 21800: Add tests for repeatable subfields
Test plan:
Do not apply the second patch [note 1].
Run t/db_dependent/Biblio/TransformKohaToMarc.t
Run t/db_dependent/Biblio/TransformMarcToKoha.t
Apply the second patch and run them again. Both tests should pass now.

Note 1: The TransformKohaToMarc test should fail with something like:
    #   Failed test 'Check 260e'
    #   at t/db_dependent/Biblio/TransformKohaToMarc.t line 60.
    #          got: 'A'
    #     expected: 'A | B'

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Ere Maijala <ere.maijala@helsinki.fi>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2020-03-24 10:54:46 +00:00

130 lines
6.1 KiB
Perl

#!/usr/bin/perl
# Tests for C4::Biblio::TransformMarcToKoha, TransformMarcToKohaOneField
# Copyright 2017 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, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use Test::More tests => 4;
use MARC::Record;
use t::lib::Mocks;
use t::lib::TestBuilder;
use Koha::Database;
use Koha::Caches;
use Koha::MarcSubfieldStructures;
use C4::Biblio;
my $schema = Koha::Database->new->schema;
$schema->storage->txn_begin;
# Create a few mappings
# Note: TransformMarcToKoha wants a table name (biblio, biblioitems or items)
Koha::MarcSubfieldStructures->search({ frameworkcode => '', tagfield => [ '300', '500' ] })->delete;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '300', tagsubfield => 'a', kohafield => 'biblio.field1' })->store;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '300', tagsubfield => 'b', kohafield => 'biblio.field2' })->store;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '500', tagsubfield => 'a', kohafield => 'biblio.field3' })->store;
Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
subtest 'Test a few mappings' => sub {
plan tests => 7;
my $marc = MARC::Record->new;
$marc->append_fields(
MARC::Field->new( '300', '', '', a => 'a1', b => 'b1' ),
MARC::Field->new( '300', '', '', a => 'a2', b => 'b2' ),
MARC::Field->new( '500', '', '', a => 'note1', a => 'note2' ),
);
my $result = C4::Biblio::TransformMarcToKoha( $marc );
# Note: TransformMarcToKoha stripped the table prefix biblio.
is( keys %{$result}, 3, 'Found all three mappings' );
is( $result->{field1}, 'a1 | a2', 'Check field1 results' );
is( $result->{field2}, 'b1 | b2', 'Check field2 results' );
is( $result->{field3}, 'note1 | note2', 'Check field3 results' );
is( C4::Biblio::TransformMarcToKohaOneField( 'biblio.field1', $marc ),
$result->{field1}, 'TransformMarcToKohaOneField returns biblio.field1');
is( C4::Biblio::TransformMarcToKohaOneField( 'field4', $marc ),
undef, 'TransformMarcToKohaOneField returns undef' );
# Bug 19096 Default is authoritative now
# Test passing another framework
# CAUTION: This parameter of TransformMarcToKoha will be removed later
my $new_fw = t::lib::TestBuilder->new->build({source => 'BiblioFramework'});
$result = C4::Biblio::TransformMarcToKoha($marc, $new_fw->{frameworkcode});
is( keys %{$result}, 3, 'Still found all three mappings' );
};
subtest 'Multiple mappings for one kohafield' => sub {
plan tests => 4;
# Add another mapping to field1
Koha::MarcSubfieldStructures->search({ frameworkcode => '', tagfield => '510' })->delete;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '510', tagsubfield => 'a', kohafield => 'biblio.field1' })->store;
Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
my $marc = MARC::Record->new;
$marc->append_fields( MARC::Field->new( '300', '', '', a => '3a' ) );
my $result = C4::Biblio::TransformMarcToKoha( $marc );
is_deeply( $result, { field1 => '3a' }, 'Simple start' );
$marc->append_fields( MARC::Field->new( '510', '', '', a => '' ) );
$result = C4::Biblio::TransformMarcToKoha( $marc );
is_deeply( $result, { field1 => '3a' }, 'An empty 510a makes no difference' );
$marc->append_fields( MARC::Field->new( '510', '', '', a => '51' ) );
$result = C4::Biblio::TransformMarcToKoha( $marc );
is_deeply( $result, { field1 => '3a | 51' }, 'Got 300a and 510a' );
is( C4::Biblio::TransformMarcToKohaOneField( 'biblio.field1', $marc ),
'3a | 51', 'TransformMarcToKohaOneField returns biblio.field1' );
};
subtest 'Testing _adjust_pubyear' => sub {
plan tests => 10;
is( C4::Biblio::_adjust_pubyear('2004 c2000 2007'), 2000, 'First cYEAR' );
is( C4::Biblio::_adjust_pubyear('2004 2000 2007'), 2004, 'First year' );
is( C4::Biblio::_adjust_pubyear('18xx 1900'), 1900, '1900 has priority over 18xx' );
is( C4::Biblio::_adjust_pubyear('18xx'), 1800, '18xx on its own' );
is( C4::Biblio::_adjust_pubyear('197X'), 1970, '197X on its own' );
is( C4::Biblio::_adjust_pubyear('1...'), 1000, '1... on its own' );
is( C4::Biblio::_adjust_pubyear('12?? 13xx'), 1200, '12?? first' );
is( C4::Biblio::_adjust_pubyear('12? 1x'), '12? 1x', 'Too short' );
is( C4::Biblio::_adjust_pubyear('198-'), '198-', 'Missing question mark' );
is( C4::Biblio::_adjust_pubyear('198-?'), '1980', '198-?' );
};
subtest 'Test repeatable subfields' => sub {
plan tests => 2;
# Make 510x repeatable and 510y not
Koha::MarcSubfieldStructures->search({ frameworkcode => '', tagfield => '510' })->delete;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '510', tagsubfield => 'x', kohafield => 'items.test', repeatable => 1 })->store;
Koha::MarcSubfieldStructure->new({ frameworkcode => '', tagfield => '510', tagsubfield => 'y', kohafield => 'items.norepeat', repeatable => 0 })->store;
Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
my $marc = MARC::Record->new;
$marc->append_fields( MARC::Field->new( '510', '', '', x => '1', x => '2', y => '3 | 4', y => '5' ) ); # actually, we should only have one $y (BZ 24652)
my $result = C4::Biblio::TransformMarcToKoha( $marc );
is( $result->{test}, '1 | 2', 'Check 510x for two values' );
is( $result->{norepeat}, '3 | 4 | 5', 'Check 510y too' );
};
# Cleanup
Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
$schema->storage->txn_rollback;