Bug 25898: Prohibit indirect object notation
[koha.git] / t / db_dependent / api / v1 / return_claims.t
blobf0d8b1f24fb373a4505cac451ecc18ba8f3dc42f
1 #!/usr/bin/env perl
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
18 use Modern::Perl;
20 use Test::More tests => 4;
22 use Test::Mojo;
23 use Test::Warn;
24 use t::lib::Mocks;
25 use t::lib::TestBuilder;
27 use C4::Circulation qw(AddIssue);
29 use Koha::Checkouts::ReturnClaims;
30 use Koha::Database;
31 use Koha::DateUtils qw(dt_from_string);
33 my $schema = Koha::Database->schema;
34 my $builder = t::lib::TestBuilder->new;
36 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
37 my $t = Test::Mojo->new('Koha::REST::V1');
39 subtest 'claim_returned() tests' => sub {
41 plan tests => 9;
43 $schema->storage->txn_begin;
45 my $librarian = $builder->build_object(
47 class => 'Koha::Patrons',
48 value => { flags => 1 }
51 my $password = 'thePassword123';
52 $librarian->set_password( { password => $password, skip_validation => 1 } );
53 my $userid = $librarian->userid;
55 my $patron = $builder->build_object(
57 class => 'Koha::Patrons',
58 value => { flags => 0 }
62 t::lib::Mocks::mock_userenv({ branchcode => $librarian->branchcode });
64 my $item = $builder->build_sample_item;
65 my $issue = AddIssue( $patron->unblessed, $item->barcode, dt_from_string->add( weeks => 2 ) );
67 t::lib::Mocks::mock_preference( 'ClaimReturnedChargeFee', 'ask' );
68 t::lib::Mocks::mock_preference( 'ClaimReturnedLostValue', '99' );
70 ## Valid id
71 $t->post_ok(
72 "//$userid:$password@/api/v1/return_claims" => json => {
73 item_id => $item->itemnumber,
74 charge_lost_fee => Mojo::JSON->false,
75 created_by => $librarian->id,
76 notes => "This is a test note."
78 )->status_is(201)->header_like(
79 Location => qr|^\/api\/v1\/return_claims/\d*|,
80 'SWAGGER3.4.1'
83 my $claim_id = $t->tx->res->json->{claim_id};
85 ## Duplicate id
86 warning_like {
87 $t->post_ok(
88 "//$userid:$password@/api/v1/return_claims" => json => {
89 item_id => $item->itemnumber,
90 charge_lost_fee => Mojo::JSON->false,
91 created_by => $librarian->id,
92 notes => "This is a test note."
94 )->status_is(409)
96 qr/DBD::mysql::st execute failed: Duplicate entry/;
98 $issue->delete;
100 $t->post_ok(
101 "//$userid:$password@/api/v1/return_claims" => json => {
102 item_id => $item->itemnumber,
103 charge_lost_fee => Mojo::JSON->false,
104 created_by => $librarian->id,
105 notes => "This is a test note."
107 )->status_is(404)
108 ->json_is( '/error' => 'Checkout not found' );
110 $schema->storage->txn_rollback;
113 subtest 'update_notes() tests' => sub {
115 plan tests => 8;
117 $schema->storage->txn_begin;
119 my $librarian = $builder->build_object(
121 class => 'Koha::Patrons',
122 value => { flags => 1 }
125 my $password = 'thePassword123';
126 $librarian->set_password( { password => $password, skip_validation => 1 } );
127 my $userid = $librarian->userid;
129 my $item = $builder->build_sample_item;
131 t::lib::Mocks::mock_userenv( { branchcode => $item->homebranch } )
132 ; # needed by AddIssue
134 my $issue = AddIssue( $librarian->unblessed, $item->barcode,
135 dt_from_string->add( weeks => 2 ) );
137 my $claim = $issue->claim_returned(
139 created_by => $librarian->borrowernumber,
140 notes => 'Dummy notes'
144 my $claim_id = $claim->id;
146 # Test editing a claim note
147 ## Valid claim id
148 $t->put_ok(
149 "//$userid:$password@/api/v1/return_claims/$claim_id/notes" => json => {
150 notes => "This is a different test note.",
151 updated_by => $librarian->id,
153 )->status_is(200);
155 $claim->discard_changes;
157 is( $claim->notes, "This is a different test note." );
158 is( $claim->updated_by, $librarian->id );
159 ok( $claim->updated_on );
161 # Make sure the claim doesn't exist on the DB anymore
162 $claim->delete;
164 ## Bad claim id
165 $t->put_ok(
166 "//$userid:$password@/api/v1/return_claims/$claim_id/notes" => json => {
167 notes => "This is a different test note.",
168 updated_by => $librarian->id,
170 )->status_is(404)
171 ->json_is( '/error' => 'Claim not found' );
173 $schema->storage->txn_rollback;
176 subtest 'resolve_claim() tests' => sub {
178 plan tests => 8;
180 $schema->storage->txn_begin;
182 my $librarian = $builder->build_object(
184 class => 'Koha::Patrons',
185 value => { flags => 1 }
188 my $password = 'thePassword123';
189 $librarian->set_password( { password => $password, skip_validation => 1 } );
190 my $userid = $librarian->userid;
192 my $item = $builder->build_sample_item;
194 t::lib::Mocks::mock_userenv( { branchcode => $item->homebranch } ); # needed by AddIssue
196 my $issue = AddIssue( $librarian->unblessed, $item->barcode, dt_from_string->add( weeks => 2 ) );
198 my $claim = $issue->claim_returned(
200 created_by => $librarian->borrowernumber,
201 notes => 'Dummy notes'
205 my $claim_id = $claim->id;
207 # Resolve a claim
208 $t->put_ok(
209 "//$userid:$password@/api/v1/return_claims/$claim_id/resolve" => json => {
210 resolved_by => $librarian->id,
211 resolution => "FOUNDINLIB",
213 )->status_is(200);
215 $claim->discard_changes;
216 is( $claim->resolution, "FOUNDINLIB" );
217 is( $claim->resolved_by, $librarian->id );
218 ok( $claim->resolved_on );
220 # Make sure the claim doesn't exist on the DB anymore
221 $claim->delete;
223 ## Invalid claim id
224 $t->put_ok(
225 "//$userid:$password@/api/v1/return_claims/$claim_id/resolve" => json =>
227 resolved_by => $librarian->id,
228 resolution => "FOUNDINLIB",
230 )->status_is(404)
231 ->json_is( '/error' => 'Claim not found' );
233 $schema->storage->txn_rollback;
236 subtest 'delete() tests' => sub {
238 plan tests => 7;
240 $schema->storage->txn_begin;
242 my $librarian = $builder->build_object(
244 class => 'Koha::Patrons',
245 value => { flags => 1 }
248 my $password = 'thePassword123';
249 $librarian->set_password( { password => $password, skip_validation => 1 } );
250 my $userid = $librarian->userid;
252 my $item = $builder->build_sample_item;
254 t::lib::Mocks::mock_userenv({ branchcode => $item->homebranch });
256 my $issue = C4::Circulation::AddIssue( $librarian->unblessed,
257 $item->barcode, dt_from_string->add( weeks => 2 ) );
259 my $claim = $issue->claim_returned(
261 created_by => $librarian->borrowernumber,
262 notes => 'Dummy notes'
266 # Test deleting a return claim
267 $t->delete_ok("//$userid:$password@/api/v1/return_claims/" . $claim->id)
268 ->status_is( 204, 'SWAGGER3.2.4' )
269 ->content_is( '', 'SWAGGER3.3.4' );
271 my $THE_claim = Koha::Checkouts::ReturnClaims->find($claim->id);
272 isnt( $THE_claim, "Return claim was deleted" );
274 $t->delete_ok("//$userid:$password@/api/v1/return_claims/" . $claim->id)
275 ->status_is(404)
276 ->json_is( '/error' => 'Claim not found' );
278 $schema->storage->txn_rollback;