Bug 17600: Standardize our EXPORT_OK
[srvgit] / t / db_dependent / AuthoritiesMarc.t
index 9c8c1fd..f72b0c3 100755 (executable)
@@ -3,20 +3,26 @@
 # This Koha test module is a stub!  
 # Add more tests here!!!
 
-use strict;
-use warnings;
+use Modern::Perl;
 
-use Test::More tests => 5;
+use Test::More tests => 12;
 use Test::MockModule;
+use Test::Warn;
+use MARC::Field;
 use MARC::Record;
 
+use t::lib::Mocks;
+use t::lib::TestBuilder;
+use Koha::Database;
+use Koha::Authority::Types;
+
 BEGIN {
-        use_ok('C4::AuthoritiesMarc');
+        use_ok('C4::AuthoritiesMarc', qw( GetHeaderAuthority AddAuthority AddAuthorityTrees GetAuthority BuildAuthHierarchies GenerateHierarchy BuildSummary DelAuthority CompareFieldWithAuthority ModAuthority merge ));
 }
 
 # We are now going to be testing the authorities hierarchy code, and
 # therefore need to pretend that we have consistent data in our database
-my $module = new Test::MockModule('C4::AuthoritiesMarc');
+my $module = Test::MockModule->new('C4::AuthoritiesMarc');
 $module->mock('GetHeaderAuthority', sub {
     return {'authtrees' => ''};
 });
@@ -49,12 +55,29 @@ $module->mock('GetAuthority', sub {
             [ '151', ' ', ' ', a => 'New York (City)' ],
             [ '551', ' ', ' ', a => 'New York (State)', w => 'g' ]
             );
+    } elsif ($authid eq '5') {
+        $record->add_fields(
+            [ '001', '5' ],
+            [ '100', ' ', ' ', a => 'Lastname, Firstname', b => 'b', c => 'c', i => 'i' ]
+            );
     } else {
         undef $record;
     }
     return $record;
 });
 
+my $schema  = Koha::Database->new->schema;
+$schema->storage->txn_begin;
+my $dbh = C4::Context->dbh;
+my $builder = t::lib::TestBuilder->new;
+
+t::lib::Mocks::mock_preference('marcflavour', 'MARC21');
+
+# Authority type GEOGR_NAME is hardcoded here
+if( ! Koha::Authority::Types->find('GEOGR_NAME') ) {
+    $builder->build({ source => 'AuthType', value => { authtypecode => 'GEOGR_NAME' }});
+};
+
 is(BuildAuthHierarchies(3, 1), '1,2,3', "Built linked authtrees hierarchy string");
 
 my $expectedhierarchy = [ [ {
@@ -96,3 +119,191 @@ $expectedhierarchy = [ [ {
     'parents' => []
 } ] ];
 is_deeply(GenerateHierarchy(4), $expectedhierarchy, "Generated hierarchy data structure for unlinked hierarchy");
+
+# set up auth_types for next tests
+$dbh->do('DELETE FROM auth_types');
+$dbh->do(q{
+    INSERT INTO auth_types (authtypecode, authtypetext, auth_tag_to_report, summary)
+    VALUES ('GEOGR_NAME', 'Geographic Name', '151', 'Geographic Name')
+});
+
+t::lib::Mocks::mock_preference('marcflavour', 'MARC21');
+my $expected_marc21_summary = {
+    'authorized' => [
+                      {
+                        'field' => '151',
+                        'heading' => 'New York (State)',
+                        'hemain' => 'New York (State)'
+                      }
+                    ],
+    'authtypecode' => 'GEOGR_NAME',
+    'mainentry' => 'New York (State)',
+    'mainmainentry' => 'New York (State)',
+    'notes' => [],
+    'otherscript' => [],
+    'seealso' => [
+                   {
+                     'authid' => '1',
+                     'field' => '551',
+                     'heading' => 'United States',
+                     'hemain' => 'United States',
+                     'search' => 'United States',
+                     'type' => 'broader'
+                   }
+                 ],
+    'seefrom' => [],
+    'label' => 'Geographic Name',
+    'type' => 'Geographic Name'
+};
+is_deeply(
+    BuildSummary(C4::AuthoritiesMarc::GetAuthority(2), 2, 'GEOGR_NAME'),
+    $expected_marc21_summary,
+    'test BuildSummary for MARC21'
+);
+
+my $marc21_subdiv = MARC::Record->new();
+$marc21_subdiv->add_fields(
+    [ '181', ' ', ' ', x => 'Political aspects' ]
+);
+warning_is { BuildSummary($marc21_subdiv, 99999, 'GEN_SUBDIV') } [],
+    'BuildSummary does not generate warning if main heading subfield not present';
+
+t::lib::Mocks::mock_preference('marcflavour', 'UNIMARC');
+$dbh->do(q{
+    INSERT INTO auth_types (authtypecode, authtypetext, auth_tag_to_report, summary)
+    VALUES ('NP', 'Auteur', '200', '[200a][, 200b][ 200d][ ; 200c][ (200f)]')
+});
+
+my $unimarc_name_auth = MARC::Record->new();
+$unimarc_name_auth->add_fields(
+    ['100', ' ', ' ',  a => '20121025              frey50       '],
+    ['200', ' ', ' ',  a => 'Fossey', b => 'Brigitte' ],
+    ['152', ' ', ' ',  a => 'NP'],
+);
+my $expected_unimarc_name_summary = {
+    'authorized' => [
+                      {
+                        'field' => '200',
+                        'heading' => 'Fossey Brigitte',
+                        'hemain' => 'Fossey'
+                      }
+                    ],
+    'authtypecode' => 'NP',
+    'mainentry' => 'Fossey Brigitte',
+    'mainmainentry' => 'Fossey',
+    'notes' => [],
+    'otherscript' => [],
+    'seealso' => [],
+    'seefrom' => [],
+    'summary' => 'Fossey, Brigitte',
+    'type' => 'Auteur'
+};
+
+is_deeply(
+    BuildSummary($unimarc_name_auth, 99999, 'NP'),
+    $expected_unimarc_name_summary,
+    'test BuildSummary for UNIMARC'
+);
+
+subtest 'AddAuthority should respect AUTO_INCREMENT (BZ 18104)' => sub {
+    plan tests => 3;
+
+    t::lib::Mocks::mock_preference( 'marcflavour', 'MARC21' );
+    my $record = C4::AuthoritiesMarc::GetAuthority(1);
+    my $id1 = AddAuthority( $record, undef, 'GEOGR_NAME' );
+    DelAuthority({ authid => $id1 });
+    my $id2 = AddAuthority( $record, undef, 'GEOGR_NAME' );
+    isnt( $id1, $id2, 'Do not return the same id again' );
+    t::lib::Mocks::mock_preference( 'marcflavour', 'UNIMARC' );
+    my $id3 = AddAuthority( $record, undef, 'GEOGR_NAME' );
+    ok( $id3 > 0, 'Tested AddAuthority with UNIMARC' );
+    is( $record->field('001')->data, $id3, 'Check updated 001' );
+};
+
+subtest 'CompareFieldWithAuthority tests' => sub {
+    plan tests => 3;
+
+    t::lib::Mocks::mock_preference('marcflavour', 'MARC21');
+
+    $builder->build({ source => 'AuthType', value => { authtypecode => 'PERSO_NAME' }});
+
+    my $field = MARC::Field->new('100', 0, 0, a => 'Lastname, Firstname', b => 'b', c => 'c');
+
+    ok(C4::AuthoritiesMarc::CompareFieldWithAuthority({'field' => $field, 'authid' => 5}), 'Authority matches');
+
+    $field->add_subfields(i => 'X');
+
+    ok(C4::AuthoritiesMarc::CompareFieldWithAuthority({'field' => $field, 'authid' => 5}), 'Compare ignores unlisted subfields');
+
+    $field->add_subfields(d => 'd');
+
+    ok(!C4::AuthoritiesMarc::CompareFieldWithAuthority({'field' => $field, 'authid' => 5}), 'Authority does not match');
+};
+
+$schema->storage->txn_rollback;
+
+$module->unmock('GetAuthority');
+
+subtest 'ModAuthority() tests' => sub {
+
+    plan tests => 2;
+
+    $schema->storage->txn_begin;
+
+    my $auth_type = 'GEOGR_NAME';
+    my $record  = MARC::Record->new;
+    $record->add_fields(
+            [ '001', '1' ],
+            [ '151', ' ', ' ', a => 'United States' ]
+            );
+;
+    my $auth_id = AddAuthority( $record, undef, $auth_type );
+
+    my $mocked_authorities_marc = Test::MockModule->new('C4::AuthoritiesMarc');
+    $mocked_authorities_marc->mock( 'merge', sub { warn 'merge called'; } );
+
+    warning_is
+        { ModAuthority( $auth_id, $record, $auth_type ); }
+        'merge called',
+        'No param, merge called';
+
+    warning_is
+        { ModAuthority( $auth_id, $record, $auth_type, { skip_merge => 1 } ); }
+        undef,
+        'skip_merge passed, merge not called';
+
+    $schema->storage->txn_rollback;
+};
+
+subtest 'DelAuthority() tests' => sub {
+
+    plan tests => 2;
+
+    $schema->storage->txn_begin;
+
+    my $auth_type = 'GEOGR_NAME';
+    my $record  = MARC::Record->new;
+    $record->add_fields(
+            [ '001', '1' ],
+            [ '151', ' ', ' ', a => 'United States' ]
+            );
+;
+    my $auth_id = AddAuthority( $record, undef, $auth_type );
+
+    my $mocked_authorities_marc = Test::MockModule->new('C4::AuthoritiesMarc');
+    $mocked_authorities_marc->mock( 'merge', sub { warn 'merge called'; } );
+
+    warning_is
+        { DelAuthority({ authid => $auth_id }); }
+        'merge called',
+        'No param, merge called';
+
+    $auth_id = AddAuthority( $record, undef, $auth_type );
+
+    warning_is
+        { DelAuthority({ authid => $auth_id, skip_merge => 1 }); }
+        undef,
+        'skip_merge passed, merge not called';
+
+    $schema->storage->txn_rollback;
+};