Bug 27272: Remove GetItemsInfo, GetItemsLocationInfo and GetHostItemsInfo
[koha-ffzg.git] / t / db_dependent / ImportBatch.t
index 1116762..0184a8f 100755 (executable)
@@ -1,7 +1,7 @@
 #!/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/;
@@ -10,6 +10,7 @@ use t::lib::Mocks;
 use t::lib::TestBuilder;
 
 use Koha::Database;
+use Koha::Import::Records;
 
 BEGIN {
     # Mock pluginsdir before loading Plugins module
@@ -17,7 +18,7 @@ BEGIN {
     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
@@ -87,53 +88,84 @@ is_deeply( $importbatch1, $sample_import_batch1,
     "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 );
@@ -175,7 +207,7 @@ my $id_import_batch3 = C4::ImportBatch::AddImportBatch($sample_import_batch3);
 
 # 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
@@ -183,12 +215,58 @@ C4::ImportBatch::DeleteBatch( $id_import_batch3 );
 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
@@ -197,7 +275,8 @@ subtest "RecordsFromMarcPlugin" => sub {
 
 100,a = Another
 245,a = Noise in the library|;
-    close $fh;
+        close $fh;
+    }
 
     t::lib::Mocks::mock_config( 'enable_plugins', 1 );
 
@@ -208,10 +287,45 @@ subtest "RecordsFromMarcPlugin" => sub {
     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 {