From e710a3cae044573b3375d7674d3ca888791ac16a Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Tue, 3 May 2022 11:20:46 -0300 Subject: [PATCH] Bug 30663: Add x-koha-override options to /suggestions This patch adds the x-koha-override header parameter to the route that is used to create suggestions, POST /suggestions. The idea is that adding suggestions will be rejected under certain conditions unless x-koha-override is passed with appropriate values. The added overrides are: * any * max_total * max_pending Tests are added for the expected behavior. Signed-off-by: Tomas Cohen Arazi --- api/v1/swagger/paths/suggestions.yaml | 18 ++++++++++- t/db_dependent/api/v1/suggestions.t | 46 ++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/api/v1/swagger/paths/suggestions.yaml b/api/v1/swagger/paths/suggestions.yaml index ecf46837d0..43084bd35b 100644 --- a/api/v1/swagger/paths/suggestions.yaml +++ b/api/v1/swagger/paths/suggestions.yaml @@ -57,6 +57,18 @@ required: true schema: $ref: "../swagger.yaml#/definitions/suggestion" + - name: x-koha-override + in: header + required: false + description: Overrides list sent as a request header + type: array + items: + type: string + enum: + - any + - max_total + - max_pending + collectionFormat: csv produces: - application/json responses: @@ -65,7 +77,11 @@ schema: $ref: "../swagger.yaml#/definitions/suggestion" "400": - description: Bad request + description: | + Bad request. Possible `error_code` attribute values: + + * `max_total_reached` + * `max_pending_reached` schema: $ref: "../swagger.yaml#/definitions/error" "403": diff --git a/t/db_dependent/api/v1/suggestions.t b/t/db_dependent/api/v1/suggestions.t index 6ec1010003..9ad51e27bc 100755 --- a/t/db_dependent/api/v1/suggestions.t +++ b/t/db_dependent/api/v1/suggestions.t @@ -149,7 +149,7 @@ subtest 'get() tests' => sub { subtest 'add() tests' => sub { - plan tests => 15; + plan tests => 16; $schema->storage->txn_begin; @@ -237,6 +237,50 @@ subtest 'add() tests' => sub { ] ); + subtest 'x-koha-override tests' => sub { + + plan tests => 14; + + my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); + + t::lib::Mocks::mock_preference( 'MaxTotalSuggestions', 4 ); + t::lib::Mocks::mock_preference( 'MaxOpenSuggestions', 2 ); + t::lib::Mocks::mock_preference( 'NumberOfSuggestionDays', 2 ); + + my $suggestion = $builder->build_object( + { class => 'Koha::Suggestions', + value => { suggestedby => $patron->id, STATUS => 'ACCEPTED' } + } + ); + + my $suggestion_data = $suggestion->to_api; + delete $suggestion_data->{suggestion_id}; + delete $suggestion_data->{status}; + + $t->post_ok( "//$userid:$password@/api/v1/suggestions" => json => $suggestion_data ) + ->status_is( 201, 'First pending suggestion' ); + + $t->post_ok( "//$userid:$password@/api/v1/suggestions" => json => $suggestion_data ) + ->status_is( 201, 'Second pending suggestion' ); + + $t->post_ok( "//$userid:$password@/api/v1/suggestions" => json => $suggestion_data ) + ->status_is(400) + ->json_is( '/error_code' => 'max_pending_reached' ); + + $t->post_ok( "//$userid:$password@/api/v1/suggestions" + => { 'x-koha-override' => 'max_pending' } + => json => $suggestion_data ) + ->status_is( 201, 'max_pending override does the job' ); + + $t->post_ok( "//$userid:$password@/api/v1/suggestions" => json => $suggestion_data ) + ->status_is(400) + ->json_is( '/error_code' => 'max_total_reached' ); + + $t->post_ok( + "//$userid:$password@/api/v1/suggestions" => { 'x-koha-override' => 'any' } => json => $suggestion_data ) + ->status_is( 201, 'any overrides anything' ); + }; + $schema->storage->txn_rollback; }; -- 2.36.0