Koha/t/db_dependent/api/v1/authorities.t
Tomas Cohen Arazi 3b0fc1fc41
Bug 33996: Add missing authority objects mapping
This patch adds a minimal mapping (i.e. some things get excluded from
the API objects for now). It makes some attributes consistent with the
current API names, and the rest can be added later when they become
needed and we discuss a proper name. But right now is a mess :-/

To test:
1. Apply this patch
2. Run:
   $ ktd --shell
  k$ prove t/db_dependent/api/v1/authorities.t
=> SUCCESS: Tests pass!
3. Sign off :-D

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Sam Lau <samalau@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2023-06-29 11:11:12 -03:00

384 lines
14 KiB
Perl
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env perl
# 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 utf8;
use Encode;
use Test::More tests => 5;
use Test::MockModule;
use Test::Mojo;
use Test::Warn;
use t::lib::Mocks;
use t::lib::TestBuilder;
use Mojo::JSON qw(encode_json);
use C4::Auth;
use Koha::Authorities;
my $schema = Koha::Database->new->schema;
my $builder = t::lib::TestBuilder->new;
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
my $t = Test::Mojo->new('Koha::REST::V1');
subtest 'get() tests' => sub {
plan tests => 20;
$schema->storage->txn_begin;
my $patron = $builder->build_object(
{
class => 'Koha::Patrons',
value => { flags => 0 }
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
$patron->discard_changes;
my $userid = $patron->userid;
my $authority = $builder->build_object({ 'class' => 'Koha::Authorities', value => {
marcxml => q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|
} });
$t->get_ok("//$userid:$password@/api/v1/authorities/" . $authority->id)
->status_is(403);
$patron->flags(4)->store;
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/weird+format' } )
->status_is(400);
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/json' } )
->status_is(200)
->json_is( '/authority_id', $authority->id )
->json_is( '/framework_id', $authority->authtypecode );
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/marcxml+xml' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/marc-in-json' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/marc' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'text/plain' } )
->status_is(200)
->content_is(q|LDR 00079 2200049 4500
001 1001
110 _9102
_aMy Corporation|);
$authority->delete;
$t->get_ok( "//$userid:$password@/api/v1/authorities/" . $authority->id
=> { Accept => 'application/marc' } )
->status_is(404)
->json_is( '/error', 'Object not found.' );
$schema->storage->txn_rollback;
};
subtest 'delete() tests' => sub {
plan tests => 7;
$schema->storage->txn_begin;
my $patron = $builder->build_object(
{
class => 'Koha::Patrons',
value => { flags => 0 } # no permissions
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
my $userid = $patron->userid;
my $authority = $builder->build_object({ 'class' => 'Koha::Authorities', value => {
marcxml => q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|
} });
$t->delete_ok("//$userid:$password@/api/v1/authorities/".$authority->id)
->status_is(403, 'Not enough permissions makes it return the right code');
$patron->flags( 2 ** 14 )->store; # 14 => editauthorities userflag
$t->delete_ok("//$userid:$password@/api/v1/authorities/".$authority->id)
->status_is(204, 'SWAGGER3.2.4')
->content_is('', 'SWAGGER3.3.4');
$t->delete_ok("//$userid:$password@/api/v1/authorities/".$authority->id)
->status_is(404);
$schema->storage->txn_rollback;
};
subtest 'post() tests' => sub {
plan tests => 19;
$schema->storage->txn_begin;
my $authorities_mock = Test::MockModule->new('C4::AuthoritiesMarc');
$authorities_mock->mock( 'FindDuplicateAuthority', sub { return 1234; } );
my $patron = $builder->build_object(
{
class => 'Koha::Patrons',
value => { flags => 0 } # no permissions
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
my $userid = $patron->userid;
my $marcxml = q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|;
my $mij = '{"fields":[{"001":"1001"},{"110":{"subfields":[{"9":"102"},{"a":"My Corporation"}],"ind1":" ","ind2":" "}}],"leader":" "}';
my $marc = '00079 2200049 45000010005000001100024000051001 9102aMy Corporation';
my $json = {
authtypecode => "CORPO_NAME",
marcxml => $marcxml
};
$t->post_ok("//$userid:$password@/api/v1/authorities")
->status_is(403, 'Not enough permissions makes it return the right code');
# Add permissions
$patron->flags( 2 ** 14 )->store; # 14 => editauthorities userflag
# x-koha-override passed to make sure it goes through
$t->post_ok("//$userid:$password@/api/v1/authorities" => {'Content-Type' => 'application/marcxml+xml', 'x-authority-type' => 'CORPO_NAME', 'x-koha-override' => 'any' } => $marcxml)
->status_is(201)
->json_is(q{})
->header_like(
Location => qr|^\/api\/v1\/authorities/\d*|,
'SWAGGER3.4.1'
);
# x-koha-override not passed to force block because duplicate
$t->post_ok("//$userid:$password@/api/v1/authorities" => {'Content-Type' => 'application/marc-in-json', 'x-authority-type' => 'CORPO_NAME' } => $mij)
->status_is(409)
->header_exists_not( 'Location', 'Location header is only set when the new resource is created' )
->json_like( '/error' => qr/Duplicate record (\d*)/ )
->json_is( '/error_code' => q{duplicate} );
$t->post_ok("//$userid:$password@/api/v1/authorities" => {'Content-Type' => 'application/marc-in-json', 'x-authority-type' => 'CORPO_NAME', 'x-koha-override' => 'duplicate' } => $mij)
->status_is(201)
->json_is(q{})
->header_like(
Location => qr|^\/api\/v1\/authorities/\d*|,
'SWAGGER3.4.1'
);
$t->post_ok("//$userid:$password@/api/v1/authorities" => {'Content-Type' => 'application/marc', 'x-authority-type' => 'CORPO_NAME', 'x-koha-override' => 'duplicate' } => $marc)
->status_is(201)
->json_is(q{})
->header_like(
Location => qr|^\/api\/v1\/authorities/\d*|,
'SWAGGER3.4.1'
);
$schema->storage->txn_rollback;
};
subtest 'put() tests' => sub {
plan tests => 14;
$schema->storage->txn_begin;
Koha::Authorities->delete;
my $record;
my $subfield_a;
my $patron = $builder->build_object(
{
class => 'Koha::Patrons',
value => { flags => 0 } # no permissions
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
my $userid = $patron->userid;
my $authority = $builder->build_object({ 'class' => 'Koha::Authorities', value => {
marcxml => q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|
} });
my $authid = $authority->id;
my $authtypecode = $authority->authtypecode;
my $marcxml = q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">MARCXML</subfield>
</datafield>
</record>|;
my $mij = '{"fields":[{"001":"1001"},{"110":{"subfields":[{"9":"102"},{"a":"MIJ"}],"ind1":" ","ind2":" "}}],"leader":" "}';
my $marc = '00079 2200049 45000010005000001100024000051001 9102aUSMARCFormated';
$t->put_ok("//$userid:$password@/api/v1/authorities/$authid")
->status_is(403, 'Not enough permissions makes it return the right code');
# Add permissions
$patron->flags( 2 ** 14 )->store; # 14 => editauthorities userflag
$t->put_ok("//$userid:$password@/api/v1/authorities/$authid" => {'Content-Type' => 'application/marcxml+xml', 'x-authority-type' => $authtypecode} => $marcxml)
->status_is(200)
->json_has('/id');
$authority = Koha::Authorities->find($authid);
$record = $authority->record;
$subfield_a = $record->subfield('110', 'a');
is($subfield_a, 'MARCXML');
$t->put_ok("//$userid:$password@/api/v1/authorities/$authid" => {'Content-Type' => 'application/marc-in-json', 'x-authority-type' => $authtypecode} => $mij)
->status_is(200)
->json_has('/id');
$authority = Koha::Authorities->find($authid);
$record = $authority->record;
$subfield_a = $record->subfield('110', 'a');
is($subfield_a, 'MIJ');
$t->put_ok("//$userid:$password@/api/v1/authorities/$authid" => {'Content-Type' => 'application/marc', 'x-authority-type' => $authtypecode} => $marc)
->status_is(200)
->json_has('/id');
$authority = Koha::Authorities->find($authid);
$record = $authority->record;
$subfield_a = $record->subfield('110', 'a');
is($subfield_a, 'USMARCFormated');
$schema->storage->txn_rollback;
};
subtest 'list() tests' => sub {
plan tests => 14;
$schema->storage->txn_begin;
my $patron = $builder->build_object(
{
class => 'Koha::Patrons',
value => { flags => 0 }
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
$patron->discard_changes;
my $userid = $patron->userid;
my $auth_id_1 = $builder->build_object({ 'class' => 'Koha::Authorities', value => {
marcxml => q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|
} })->authid;
my $auth_id_2 = $builder->build_object({ 'class' => 'Koha::Authorities', value => {
marcxml => q|<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<controlfield tag="001">1001</controlfield>
<datafield tag="110" ind1=" " ind2=" ">
<subfield code="9">102</subfield>
<subfield code="a">My Corporation</subfield>
</datafield>
</record>|
} })->authid;
my $query = encode_json( [ { authority_id => $auth_id_1 }, { authority_id => $auth_id_2 } ] );
$t->get_ok("//$userid:$password@/api/v1/authorities?q=$query")->status_is(403);
$patron->flags(4)->store;
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'application/weird+format' } )
->status_is(400);
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'application/json' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'application/marcxml+xml' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'application/marc-in-json' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'application/marc' } )
->status_is(200);
$t->get_ok( "//$userid:$password@/api/v1/authorities?q=$query" => { Accept => 'text/plain' } )->status_is(200);
$schema->storage->txn_rollback;
};