#!/usr/bin/perl
use Modern::Perl;
-use Test::More tests => 17;
+use Test::More tests => 18;
use utf8;
use File::Basename;
use File::Temp qw/tempfile/;
use t::lib::TestBuilder;
use Koha::Database;
+use Koha::Import::Records;
BEGIN {
# Mock pluginsdir before loading Plugins module
t::lib::Mocks::mock_config( 'pluginsdir', $path );
use_ok('Koha::Plugins');
- use_ok('C4::ImportBatch', qw( AddImportBatch GetImportBatch AddBiblioToBatch AddItemsToImportBiblio GetRecordFromImportBiblio SetMatchedBiblionumber GetImportBiblios GetItemNumbersFromImportBatch CleanBatch DeleteBatch RecordsFromMarcPlugin ));
+ use_ok('C4::ImportBatch', qw( AddImportBatch GetImportBatch AddBiblioToBatch AddItemsToImportBiblio SetMatchedBiblionumber GetImportBiblios GetItemNumbersFromImportBatch CleanBatch DeleteBatch RecordsFromMarcPlugin ));
}
# Start transaction
"GetImportBatch returns the right informations about $sample_import_batch1" );
my $record = MARC::Record->new;
-# FIXME Create another MARC::Record which won't be modified
-# AddItemsToImportBiblio will remove the items field from the record passed in parameter.
my $original_record = MARC::Record->new;
$record->leader('03174nam a2200445 a 4500');
$original_record->leader('03174nam a2200445 a 4500');
my ($item_tag, $item_subfield) = C4::Biblio::GetMarcFromKohaField( 'items.itemnumber' );
-my @fields = (
- MARC::Field->new(
- 100, '1', ' ',
- a => 'Knuth, Donald Ervin',
- d => '1938',
- ),
- MARC::Field->new(
- 245, '1', '4',
- a => 'The art of computer programming',
- c => 'Donald E. Knuth.',
- ),
- MARC::Field->new(
- 650, ' ', '0',
- a => 'Computer programming.',
- 9 => '462',
- ),
- MARC::Field->new(
- $item_tag, ' ', ' ',
- e => 'my edition ❤',
- i => 'my item part',
- ),
- MARC::Field->new(
- $item_tag, ' ', ' ',
- e => 'my edition 2',
- i => 'my item part 2',
- ),
-);
+my @fields;
+if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ @fields = (
+ MARC::Field->new(
+ 100, ' ', ' ',
+ a => '20220520d u||y0frey50 ba',
+ ),
+ MARC::Field->new(
+ 700, ' ', ' ',
+ a => 'Knuth, Donald Ervin',
+ f => '1938',
+ ),
+ MARC::Field->new(
+ 200, ' ', ' ',
+ a => 'The art of computer programming',
+ f => 'Donald E. Knuth.',
+ ),
+ MARC::Field->new(
+ 650, ' ', '0',
+ a => 'Computer programming.',
+ 9 => '462',
+ ),
+ MARC::Field->new(
+ $item_tag, ' ', ' ',
+ e => 'my edition ❤',
+ i => 'my item part',
+ ),
+ MARC::Field->new(
+ $item_tag, ' ', ' ',
+ e => 'my edition 2',
+ i => 'my item part 2',
+ ),
+ );
+} else {
+ @fields = (
+ MARC::Field->new(
+ 100, '1', ' ',
+ a => 'Knuth, Donald Ervin',
+ d => '1938',
+ ),
+ MARC::Field->new(
+ 245, '1', '4',
+ a => 'The art of computer programming',
+ c => 'Donald E. Knuth.',
+ ),
+ MARC::Field->new(
+ 650, ' ', '0',
+ a => 'Computer programming.',
+ 9 => '462',
+ ),
+ MARC::Field->new(
+ $item_tag, ' ', ' ',
+ e => 'my edition ❤',
+ i => 'my item part',
+ ),
+ MARC::Field->new(
+ $item_tag, ' ', ' ',
+ e => 'my edition 2',
+ i => 'my item part 2',
+ ),
+ );
+}
$record->append_fields(@fields);
$original_record->append_fields(@fields);
-my $import_record_id = AddBiblioToBatch( $id_import_batch1, 0, $record, 'utf8', int(rand(99999)), 0 );
+my $import_record_id = AddBiblioToBatch( $id_import_batch1, 0, $record, 'utf8', 0 );
AddItemsToImportBiblio( $id_import_batch1, $import_record_id, $record, 0 );
-my $record_from_import_biblio_with_items = C4::ImportBatch::GetRecordFromImportBiblio( $import_record_id, 'embed_items' );
-$original_record->leader($record_from_import_biblio_with_items->leader());
-is_deeply( $record_from_import_biblio_with_items, $original_record, 'GetRecordFromImportBiblio should return the record with items if specified' );
-my $utf8_field = $record_from_import_biblio_with_items->subfield($item_tag, 'e');
+my $import_record = Koha::Import::Records->find($import_record_id);
+my $record_from_import_biblio = $import_record->get_marc_record();
+
+$original_record->leader($record_from_import_biblio->leader());
+is_deeply( $record_from_import_biblio, $original_record, 'Koha::Import::Record::get_marc_record should return the record in original state' );
+my $utf8_field = $record_from_import_biblio->subfield($item_tag, 'e');
is($utf8_field, 'my edition ❤');
-$original_record->delete_fields($original_record->field($item_tag)); #Remove items fields
-my $record_from_import_biblio_without_items = C4::ImportBatch::GetRecordFromImportBiblio( $import_record_id );
-$original_record->leader($record_from_import_biblio_without_items->leader());
-is_deeply( $record_from_import_biblio_without_items, $original_record, 'GetRecordFromImportBiblio should return the record without items by default' );
my $another_biblio = $builder->build_sample_biblio;
C4::ImportBatch::SetMatchedBiblionumber( $import_record_id, $another_biblio->biblionumber );
# Test CleanBatch
C4::ImportBatch::CleanBatch( $id_import_batch3 );
-my $import_record = get_import_record( $id_import_batch3 );
+$import_record = get_import_record( $id_import_batch3 );
is( $import_record, "0E0", "Batch 3 has been cleaned" );
# Test DeleteBatch
my $import_batch = C4::ImportBatch::GetImportBatch( $id_import_batch3 );
is( $import_batch, undef, "Batch 3 has been deleted");
+subtest "_batchCommitItems" => sub {
+ plan tests => 3;
+
+ my $exist_item = $builder->build_sample_item;
+ my $import_item = $builder->build_object({ class => 'Koha::Import::Record::Items', value => {
+ marcxml => q{<?xml version="1.0" encoding="UTF-8"?>
+<collection
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
+ xmlns="http://www.loc.gov/MARC21/slim">
+
+<record>
+ <leader>00000 a </leader>
+ <datafield tag="952" ind1=" " ind2=" ">
+ <subfield code="a">CPL</subfield>
+ <subfield code="b">CPL</subfield>
+ <subfield code="c">GEN</subfield>
+ <subfield code="p">}.$exist_item->barcode.q{</subfield>
+ <subfield code="y">BK</subfield>
+ </datafield>
+</record>
+</collection>
+ },
+ }});
+
+ my ( $num_items_added, $num_items_replaced, $num_items_errored ) =
+ C4::ImportBatch::_batchCommitItems( $import_item->import_record_id, 32, 'always_add',64 );
+ is( $num_items_errored, 1, "Item with duplicate barcode fails when action always_add" );
+ $import_item->discard_changes();
+ is( $import_item->status, 'error', "Import item marked as error when duplicate barcode and action always_add");
+ is( $import_item->import_error, 'duplicate item barcode', 'Error correctly set when import item has duplicate barcode and action always_add' );
+};
+
subtest "RecordsFromMarcPlugin" => sub {
plan tests => 5;
# Create a test file
my ( $fh, $name ) = tempfile();
- print $fh q|
+ if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ print $fh q{
+003 = NLAmRIJ
+100,a = 20220520d u||y0frey50 ba
+700,a = Author
+200,ind2 = 0
+200,a = Silence in the library
+500 , a= Some note
+
+700,a = Another
+245,a = Noise in the library};
+ close $fh;
+ } else {
+ print $fh q|
003 = NLAmRIJ
100,a = Author
245,ind2 = 0
100,a = Another
245,a = Noise in the library|;
- close $fh;
+ close $fh;
+ }
t::lib::Mocks::mock_config( 'enable_plugins', 1 );
my $records = C4::ImportBatch::RecordsFromMarcPlugin( $name, ref $plugin, 'UTF-8' );
is( @$records, 2, 'Two results returned' );
is( ref $records->[0], 'MARC::Record', 'Returned MARC::Record object' );
- is( $records->[0]->subfield('245', 'a'), 'Silence in the library',
- 'Checked one field in first record' );
- is( $records->[1]->subfield('100', 'a'), 'Another',
- 'Checked one field in second record' );
+ if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ is( $records->[0]->subfield('200', 'a'), 'Silence in the library',
+ 'Checked one field in first record' );
+ is( $records->[1]->subfield('700', 'a'), 'Another',
+ 'Checked one field in second record' );
+ } else {
+ is( $records->[0]->subfield('245', 'a'), 'Silence in the library',
+ 'Checked one field in first record' );
+ is( $records->[1]->subfield('100', 'a'), 'Another',
+ 'Checked one field in second record' );
+ }
+};
+
+subtest "_get_commit_action" => sub {
+ plan tests => 24;
+ my $mock_import = Test::MockModule->new("C4::ImportBatch");
+
+ $mock_import->mock( GetBestRecordMatch => sub { return 5; } );
+ foreach my $record_type ( ('biblio','authority') ){
+ foreach my $match_action ( ('replace','create_new','ignore') ){
+ foreach my $no_match_action ( ('create_new','ignore') ){
+ my ($result, $match, $item_result) =
+ C4::ImportBatch::_get_commit_action($match_action, $no_match_action, 'always_add', 'auto_match', 42, $record_type);
+ is( $result, $match_action, "When match found amd chosen we return the match_action for $record_type records with match action $match_action and no match action $no_match_action");
+ }
+ }
+ }
+
+ $mock_import->mock( GetBestRecordMatch => sub { my $matches = undef; return $matches; } );
+ foreach my $record_type ( ('biblio','authority') ){
+ foreach my $match_action ( ('replace','create_new','ignore') ){
+ foreach my $no_match_action ( ('create_new','ignore') ){
+ my ($result, $match, $item_result) =
+ C4::ImportBatch::_get_commit_action($match_action, $no_match_action, 'always_add', 'auto_match', 42, $record_type);
+ is( $result, $no_match_action, "When no match found or chosen we return the match_action for $record_type records with match action $match_action and no match action $no_match_action");
+ }
+ }
+ }
+
};
sub get_import_record {