From 8f82195af247b4dc810d4b867ff07ff14a22f064 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Thu, 24 Feb 2022 16:51:28 +0100 Subject: [PATCH] Bug 32030: ERM - GET /erm/agreements spec files Signed-off-by: Jonathan Field Signed-off-by: Martin Renvoize Signed-off-by: Kyle M Hall Signed-off-by: Tomas Cohen Arazi --- api/v1/swagger/definitions/erm_agreement.yaml | 47 ++++++++ api/v1/swagger/paths/erm_agreements.yaml | 87 ++++++++++++++ t/db_dependent/api/v1/erm_agreements.t | 106 ++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 api/v1/swagger/definitions/erm_agreement.yaml create mode 100644 api/v1/swagger/paths/erm_agreements.yaml create mode 100644 t/db_dependent/api/v1/erm_agreements.t diff --git a/api/v1/swagger/definitions/erm_agreement.yaml b/api/v1/swagger/definitions/erm_agreement.yaml new file mode 100644 index 0000000000..180d0e99d9 --- /dev/null +++ b/api/v1/swagger/definitions/erm_agreement.yaml @@ -0,0 +1,47 @@ +--- +type: object +properties: + agreement_id: + type: integer + description: internally assigned agreement identifier + readOnly: true + vendor_id: + description: foreign key to aqbooksellers + type: + - integer + - "null" + name: + description: name of the agreement + type: string + description: + description: description of the agreement + type: + - string + - "null" + status: + description: current status of the agreement + type: string + closure_reason: + description: reason of the closure + type: + - string + - "null" + is_perpetual: + description: is the agreement perpetual + type: boolean + renewal_priority: + description: priority of the renewal + type: + - string + - "null" + license_info: + description: info about the license + type: + - string + - "null" +additionalProperties: false +required: + - agreement_id + - name + - status + - is_perpetual diff --git a/api/v1/swagger/paths/erm_agreements.yaml b/api/v1/swagger/paths/erm_agreements.yaml new file mode 100644 index 0000000000..54ff7ee5ad --- /dev/null +++ b/api/v1/swagger/paths/erm_agreements.yaml @@ -0,0 +1,87 @@ +--- +/erm/agreements: + get: + x-mojo-to: ERM::Agreements#list + operationId: listErmAgreements + tags: + - agreement + summary: List erm_agreements + produces: + - application/json + parameters: + - description: Case insensitive search on agreement agreement_id + in: query + name: agreement_id + required: false + type: integer + - description: Case insensitive search on agreement vendor_id + in: query + name: vendor_id + required: false + type: integer + - description: Case insensitive search on agreement name + in: query + name: name + required: false + type: string + - description: Case insensitive search on agreement description + in: query + name: description + required: false + type: string + - description: Case insensitive search on agreement status + in: query + name: status + required: false + type: string + - description: Case insensitive search on agreement closure_reason + in: query + name: closure_reason + required: false + type: string + - description: Case insensitive search on agreement is_perpetual + in: query + name: is_perpetual + required: false + type: boolean + - description: Case insensitive search on agreement renewal_priority + in: query + name: renewal_priority + required: false + type: string + - description: Case insensitive search on agreement license_info + in: query + name: license_info + required: false + type: string + - $ref: ../parameters.yaml#/match + - $ref: ../parameters.yaml#/order_by + - $ref: ../parameters.yaml#/page + - $ref: ../parameters.yaml#/per_page + - $ref: ../parameters.yaml#/q_param + - $ref: ../parameters.yaml#/q_body + - $ref: ../parameters.yaml#/q_header + responses: + 200: + description: A list of agreement + schema: + items: + $ref: ../definitions.yaml#/erm_agreement + type: array + 403: + description: Access forbidden + schema: + $ref: ../definitions.yaml#/error + 500: + description: |- + Internal server error. Possible `error_code` attribute values: + * `internal_server_error` + schema: + $ref: ../definitions.yaml#/error + 503: + description: Under maintenance + schema: + $ref: ../definitions.yaml#/error + x-koha-authorization: + permissions: + erm: 1 diff --git a/t/db_dependent/api/v1/erm_agreements.t b/t/db_dependent/api/v1/erm_agreements.t new file mode 100644 index 0000000000..8d1cfb5bc1 --- /dev/null +++ b/t/db_dependent/api/v1/erm_agreements.t @@ -0,0 +1,106 @@ +#!/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 . + +use Modern::Perl; + +use Test::More tests => 1; +use Test::Mojo; + +use t::lib::TestBuilder; +use t::lib::Mocks; + +use Koha::ERM::Agreements; +use Koha::Database; + +my $schema = Koha::Database->new->schema; +my $builder = t::lib::TestBuilder->new; + +my $t = Test::Mojo->new('Koha::REST::V1'); +t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 ); + +subtest 'list() tests' => sub { + + plan tests => 17; + + $schema->storage->txn_begin; + + Koha::ERM::Agreements->search->delete; + + my $librarian = $builder->build_object( + { + class => 'Koha::Patrons', + value => { flags => 27 ** 2 } + } + ); + my $password = 'thePassword123'; + $librarian->set_password( { password => $password, skip_validation => 1 } ); + my $userid = $librarian->userid; + + my $patron = $builder->build_object( + { + class => 'Koha::Patrons', + value => { flags => 0 } + } + ); + + $patron->set_password( { password => $password, skip_validation => 1 } ); + my $unauth_userid = $patron->userid; + + ## Authorized user tests + # No agreements, so empty array should be returned + $t->get_ok("//$userid:$password@/api/v1/erm/agreements") + ->status_is(200) + ->json_is( [] ); + + my $agreement = $builder->build_object({ class => 'Koha::ERM::Agreements' }); + + # One agreement created, should get returned + $t->get_ok("//$userid:$password@/api/v1/erm/agreements") + ->status_is(200) + ->json_is( [$agreement->to_api] ); + + my $another_agreement = $builder->build_object( + { class => 'Koha::ERM::Agreements', value => { vendor_id => $agreement->vendor_id } } ); + my $agreement_with_another_vendor_id = $builder->build_object({ class => 'Koha::ERM::Agreements' }); + + # Two agreements created, they should both be returned + $t->get_ok("//$userid:$password@/api/v1/erm/agreements") + ->status_is(200) + ->json_is([$agreement->to_api, + $another_agreement->to_api, + $agreement_with_another_vendor_id->to_api + ] ); + + # Filtering works, two agreements sharing vendor_id + $t->get_ok("//$userid:$password@/api/v1/erm/agreements?vendor_id=" . $agreement->vendor_id ) + ->status_is(200) + ->json_is([ $agreement->to_api, + $another_agreement->to_api + ]); + + # Warn on unsupported query parameter + $t->get_ok("//$userid:$password@/api/v1/erm/agreements?blah=blah" ) + ->status_is(400) + ->json_is( [{ path => '/query/blah', message => 'Malformed query string'}] ); + + # Unauthorized access + $t->get_ok("//$unauth_userid:$password@/api/v1/erm/agreements") + ->status_is(403); + + $schema->storage->txn_rollback; +}; + -- 2.20.1