Bug 30220: Purchase suggestion defaults to first library
[koha-ffzg.git] / t / SimpleMARC.t
old mode 100644 (file)
new mode 100755 (executable)
index 5958508..04e9a7e
@@ -1,16 +1,19 @@
 use Modern::Perl;
 
-use Test::More tests => 10;
+use Test::More tests => 11;
 
 use_ok("MARC::Field");
 use_ok("MARC::Record");
-use_ok("Koha::SimpleMARC");
+use_ok("Koha::SimpleMARC", qw( field_exists read_field update_field copy_field copy_and_replace_field move_field delete_field field_equals ));
 
 sub new_record {
     my $record = MARC::Record->new;
     $record->leader('03174nam a2200445 a 4500');
     my @fields = (
         MARC::Field->new(
+            '008', '120829t20132012nyu bk 001 0ceng',
+        ),
+        MARC::Field->new(
             100, '1', ' ',
             a => 'Knuth, Donald Ervin',
             d => '1938',
@@ -71,13 +74,17 @@ subtest 'field_exists' => sub {
 subtest 'read_field' => sub {
     plan tests              => 2;
     subtest 'read subfield' => sub {
-        plan tests => 5;
+        plan tests => 6;
         my $record = new_record;
         $record->append_fields(
             MARC::Field->new(
                 650, ' ', '0',
                 a => 'Computer algorithms.',
                 9 => '463',
+            ),
+            MARC::Field->new(
+                600, ' ', '0',
+                0 => '123456',
             )
         );
 
@@ -127,6 +134,20 @@ subtest 'read_field' => sub {
             [],
             'There is no 3 650$a'
         );
+        is_deeply(
+            [
+                read_field(
+                    {
+                        record        => $record,
+                        field         => '600',
+                        subfield      => '0',
+                        field_numbers => [1]
+                    }
+                )
+            ],
+            ['123456'],
+            'first 600$0'
+        );
     };
     subtest 'read field' => sub {
         plan tests => 4;
@@ -188,7 +209,7 @@ subtest 'read_field' => sub {
 subtest 'update_field' => sub {
     plan tests                => 1;
     subtest 'update subfield' => sub {
-        plan tests => 5;
+        plan tests => 6;
         my $record = new_record;
 
         update_field(
@@ -247,6 +268,7 @@ subtest 'update_field' => sub {
                 952, ' ', ' ',
                 p => '3010023917',
                 y => 'BK',
+                0 => '123456',
             ),
         );
         update_field(
@@ -280,6 +302,23 @@ subtest 'update_field' => sub {
             [ '3010023917', '3010023918' ],
             'update all subfields 952$p with the different values'
         );
+
+        update_field(
+            {
+                record   => $record,
+                field    => '952',
+                subfield => '0',
+                values   => [ '654321' ]
+            }
+        );
+        my @fields_9520 =
+          read_field( { record => $record, field => '952', subfield => '0' } );
+        is_deeply(
+            \@fields_9520,
+            [ '654321', '654321' ],
+            'update all subfields 952$0 with the same value'
+        );
+
     };
 };
 
@@ -287,7 +326,7 @@ subtest 'update_field' => sub {
 subtest 'copy_field' => sub {
     plan tests              => 2;
     subtest 'copy subfield' => sub {
-        plan tests => 20;
+        plan tests => 21;
         my $record = new_record;
         $record->append_fields(
             MARC::Field->new(
@@ -638,6 +677,27 @@ subtest 'copy_field' => sub {
             {
                 record        => $record,
                 from_field    => 245,
+                from_subfield => 'a',
+                to_field      => 245,
+                to_subfield   => 'a',
+                regex         => { search => '(art)', replace => 'sm$1 $1' }
+            }
+        );
+        is_deeply(
+            [
+                read_field(
+                    { record => $record, field => '245', subfield => 'a' }
+                )
+            ],
+            ['The art of computer programming', 'The smart art of computer programming'],
+            'Update a subfield: use capture groups'
+        );
+
+        $record = new_record;
+        copy_field(
+            {
+                record        => $record,
+                from_field    => 245,
                 from_subfield => 'c',
                 to_field      => 650,
                 to_subfield   => 'c',
@@ -861,7 +921,7 @@ subtest 'copy_field' => sub {
 subtest 'copy_and_replace_field' => sub {
     plan tests              => 2;
     subtest 'copy and replace subfield' => sub {
-        plan tests => 19;
+        plan tests => 20;
         my $record = new_record;
         $record->append_fields(
             MARC::Field->new(
@@ -1212,6 +1272,28 @@ subtest 'copy_and_replace_field' => sub {
             {
                 record        => $record,
                 from_field    => 245,
+                from_subfield => 'a',
+                to_field      => 245,
+                to_subfield   => 'a',
+                regex         => { search => '(art)', replace => 'sm$1 $1' }
+            }
+        );
+        # This is the same as update the subfield
+        is_deeply(
+            [
+                read_field(
+                    { record => $record, field => '245', subfield => 'a' }
+                )
+            ],
+            ['The smart art of computer programming'],
+            'Copy and replace - Update a subfield: use capture groups'
+        );
+
+        $record = new_record;
+        copy_and_replace_field(
+            {
+                record        => $record,
+                from_field    => 245,
                 from_subfield => 'c',
                 to_field      => 650,
                 to_subfield   => 'c',
@@ -1637,7 +1719,7 @@ subtest 'move_field' => sub {
 subtest 'delete_field' => sub {
     plan tests                => 2;
     subtest 'delete subfield' => sub {
-        plan tests => 2;
+        plan tests => 3;
         my $record = new_record;
         $record->append_fields(
             MARC::Field->new(
@@ -1671,6 +1753,18 @@ subtest 'delete_field' => sub {
         @fields_952p =
           read_field( { record => $record, field => '952', subfield => 'p' } );
         is_deeply( \@fields_952p, [], 'Delete all 952$p' );
+
+        $record = new_record;
+        $record->append_fields(
+            MARC::Field->new(
+                600, ' ', ' ',
+                a => 'Murakami, Haruki',
+                0 => 'https://id.loc.gov/authorities/names/n81152393.html',
+            ),
+        );
+        delete_field( { record => $record, field => '600', subfield => '0' } );
+        my @fields_600 = read_field( { record => $record, field => '600' } );
+        is_deeply( \@fields_600, ['Murakami, Haruki'], 'Delete all 600$0, only subfield 0 deleted' );
     };
 
     subtest 'delete field' => sub {
@@ -1693,3 +1787,47 @@ subtest 'delete_field' => sub {
         is_deeply( \@fields_952, [], 'Delete all 952, 2 deleted' );
     };
 };
+
+subtest 'field_equals' => sub {
+    plan tests => 2;
+    my $record = new_record;
+    subtest 'standard MARC fields' => sub {
+        plan tests => 2;
+        my $match = Koha::SimpleMARC::field_equals({
+                record => $record,
+                value => 'Donald',
+                field => '100',
+                subfield => 'a',
+            });
+        is_deeply( $match, [], '100$a not equal to "Donald"' );
+
+        $match = Koha::SimpleMARC::field_equals({
+                record => $record,
+                value => 'Donald',
+                field => '100',
+                subfield => 'a',
+                is_regex => 1,
+            });
+        is_deeply( $match, [1], 'first 100$a matches "Donald"');
+    };
+
+    subtest 'control fields' => sub {
+        plan tests => 2;
+        my $match = Koha::SimpleMARC::field_equals({
+                record => $record,
+                value => 'eng',
+                field => '008',
+                subfield => '',
+            });
+        is_deeply( $match, [], '008 control field not equal to "eng"' );
+
+        $match = Koha::SimpleMARC::field_equals({
+                record => $record,
+                value => 'eng',
+                field => '008',
+                subfield => '',
+                is_regex => 1,
+            });
+        is_deeply( $match, [1], 'first 008 control field matches "eng"' );
+    };
+};