Koha/t/db_dependent/Biblio/TransformMarcToKoha.t
Nick Clemens e1400890ec Bug 26516: Don't accept incorrect values for copyrightdate/publicationyear
The previous patch rejects incorrect values when saving to the db specifically for copyrightdate
An error is thrown for the int conversion when it fails

Rather than catching things when saving we can fix the value when generated, simply returning null when parsing
the record

To test:
1 - Add a new record to Koha making sure data is valid except 260$c:
    198-
2 - Save the record
3 - It fails
4 - Apply this patch
5 - Restart all the thigns
6 - Repeat
7 - Success!

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2020-11-16 14:25:21 +01:00

132 lines
6.4 KiB
Perl
Executable file

#!/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 => 12;
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'), undef, 'Too short return nothing as data must be int' );
is( C4::Biblio::_adjust_pubyear('198-'), undef, 'Missing question mark, nothing is returned as data must be int' );
is( C4::Biblio::_adjust_pubyear('198-?'), '1980', '198-?' );
is( C4::Biblio::_adjust_pubyear('1981-'), '1981', 'Date range returns first date' );
is( C4::Biblio::_adjust_pubyear('broken'), undef, 'Non-matchign data returns nothing as the field must be int' );
};
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;