Bug 28586: (follow-up) updated_by should be set
[koha.git] / t / db_dependent / api / v1 / return_claims.t
1 #!/usr/bin/env perl
2
3 # This file is part of Koha.
4 #
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.
9 #
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.
14 #
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>.
17
18 use Modern::Perl;
19
20 use Test::More tests => 4;
21
22 use Test::Mojo;
23 use Test::Warn;
24 use t::lib::Mocks;
25 use t::lib::TestBuilder;
26
27 use C4::Circulation qw(AddIssue);
28
29 use Koha::Checkouts::ReturnClaims;
30 use Koha::Database;
31 use Koha::DateUtils qw(dt_from_string);
32
33 my $schema  = Koha::Database->schema;
34 my $builder = t::lib::TestBuilder->new;
35
36 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
37 my $t = Test::Mojo->new('Koha::REST::V1');
38
39 subtest 'claim_returned() tests' => sub {
40
41     plan tests => 9;
42
43     $schema->storage->txn_begin;
44
45     my $librarian = $builder->build_object(
46         {
47             class => 'Koha::Patrons',
48             value => { flags => 1 }
49         }
50     );
51     my $password = 'thePassword123';
52     $librarian->set_password( { password => $password, skip_validation => 1 } );
53     my $userid = $librarian->userid;
54
55     my $patron = $builder->build_object(
56         {
57             class => 'Koha::Patrons',
58             value => { flags => 0 }
59         }
60     );
61
62     t::lib::Mocks::mock_userenv({ branchcode => $librarian->branchcode });
63
64     my $item  = $builder->build_sample_item;
65     my $issue = AddIssue( $patron->unblessed, $item->barcode, dt_from_string->add( weeks => 2 ) );
66
67     t::lib::Mocks::mock_preference( 'ClaimReturnedChargeFee', 'ask' );
68     t::lib::Mocks::mock_preference( 'ClaimReturnedLostValue', '99' );
69
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."
77         }
78     )->status_is(201)->header_like(
79         Location => qr|^\/api\/v1\/return_claims/\d*|,
80         'SWAGGER3.4.1'
81     );
82
83     my $claim_id = $t->tx->res->json->{claim_id};
84
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."
93             }
94         )->status_is(409)
95     }
96     qr/DBD::mysql::st execute failed: Duplicate entry/;
97
98     $issue->delete;
99
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."
106         }
107     )->status_is(404)
108      ->json_is( '/error' => 'Checkout not found' );
109
110     $schema->storage->txn_rollback;
111 };
112
113 subtest 'update_notes() tests' => sub {
114
115     plan tests => 8;
116
117     $schema->storage->txn_begin;
118
119     my $librarian = $builder->build_object(
120         {
121             class => 'Koha::Patrons',
122             value => { flags => 1 }
123         }
124     );
125     my $password = 'thePassword123';
126     $librarian->set_password( { password => $password, skip_validation => 1 } );
127     my $userid = $librarian->userid;
128
129     my $item = $builder->build_sample_item;
130
131     t::lib::Mocks::mock_userenv( { branchcode => $item->homebranch } )
132       ;    # needed by AddIssue
133
134     my $issue = AddIssue( $librarian->unblessed, $item->barcode,
135         dt_from_string->add( weeks => 2 ) );
136
137     my $claim = $issue->claim_returned(
138         {
139             created_by => $librarian->borrowernumber,
140             notes      => 'Dummy notes'
141         }
142     );
143
144     my $claim_id = $claim->id;
145
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,
152         }
153     )->status_is(200);
154
155     $claim->discard_changes;
156
157     is( $claim->notes,      "This is a different test note." );
158     is( $claim->updated_by, $librarian->id );
159     ok( $claim->updated_on );
160
161     # Make sure the claim doesn't exist on the DB anymore
162     $claim->delete;
163
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,
169         }
170     )->status_is(404)
171      ->json_is( '/error' => 'Claim not found' );
172
173     $schema->storage->txn_rollback;
174 };
175
176 subtest 'resolve_claim() tests' => sub {
177
178     plan tests => 9;
179
180     $schema->storage->txn_begin;
181
182     my $librarian = $builder->build_object(
183         {
184             class => 'Koha::Patrons',
185             value => { flags => 1 }
186         }
187     );
188     my $password = 'thePassword123';
189     $librarian->set_password( { password => $password, skip_validation => 1 } );
190     my $userid = $librarian->userid;
191
192     my $item = $builder->build_sample_item;
193
194     t::lib::Mocks::mock_userenv( { branchcode => $item->homebranch } ); # needed by AddIssue
195
196     my $issue = AddIssue( $librarian->unblessed, $item->barcode, dt_from_string->add( weeks => 2 ) );
197
198     my $claim = $issue->claim_returned(
199         {
200             created_by => $librarian->borrowernumber,
201             notes      => 'Dummy notes'
202         }
203     );
204
205     my $claim_id = $claim->id;
206
207     $claim->set(
208         {
209             created_by => undef,
210             updated_by => undef,
211         }
212     )->store; # resolve the claim must work even if the created_by patron has been removed
213
214     # Resolve a claim
215     $t->put_ok(
216         "//$userid:$password@/api/v1/return_claims/$claim_id/resolve" => json => {
217             resolved_by => $librarian->id,
218             resolution  => "FOUNDINLIB",
219         }
220     )->status_is(200);
221
222     $claim->discard_changes;
223     is( $claim->resolution, "FOUNDINLIB" );
224     is( $claim->resolved_by, $librarian->id );
225     is( $claim->updated_by, $librarian->id );
226     ok( $claim->resolved_on );
227
228     # Make sure the claim doesn't exist on the DB anymore
229     $claim->delete;
230
231     ## Invalid claim id
232     $t->put_ok(
233         "//$userid:$password@/api/v1/return_claims/$claim_id/resolve" => json =>
234         {
235             resolved_by => $librarian->id,
236             resolution  => "FOUNDINLIB",
237         }
238     )->status_is(404)
239      ->json_is( '/error' => 'Claim not found' );
240
241     $schema->storage->txn_rollback;
242 };
243
244 subtest 'delete() tests' => sub {
245
246     plan tests => 7;
247
248     $schema->storage->txn_begin;
249
250     my $librarian = $builder->build_object(
251         {
252             class => 'Koha::Patrons',
253             value => { flags => 1 }
254         }
255     );
256     my $password = 'thePassword123';
257     $librarian->set_password( { password => $password, skip_validation => 1 } );
258     my $userid = $librarian->userid;
259
260     my $item = $builder->build_sample_item;
261
262     t::lib::Mocks::mock_userenv({ branchcode => $item->homebranch });
263
264     my $issue = C4::Circulation::AddIssue( $librarian->unblessed,
265         $item->barcode, dt_from_string->add( weeks => 2 ) );
266
267     my $claim = $issue->claim_returned(
268         {
269             created_by => $librarian->borrowernumber,
270             notes      => 'Dummy notes'
271         }
272     );
273
274     # Test deleting a return claim
275     $t->delete_ok("//$userid:$password@/api/v1/return_claims/" . $claim->id)
276       ->status_is( 204, 'SWAGGER3.2.4' )
277       ->content_is( '', 'SWAGGER3.3.4' );
278
279     my $THE_claim = Koha::Checkouts::ReturnClaims->find($claim->id);
280     isnt( $THE_claim, "Return claim was deleted" );
281
282     $t->delete_ok("//$userid:$password@/api/v1/return_claims/" . $claim->id)
283       ->status_is(404)
284       ->json_is( '/error' => 'Claim not found' );
285
286     $schema->storage->txn_rollback;
287 };