Bug 22440: Add GET /ill_requests
[koha.git] / t / db_dependent / api / v1 / illrequests.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 => 2;
21
22 use Test::MockModule;
23 use Test::MockObject;
24 use Test::Mojo;
25
26 use JSON qw(encode_json);
27
28 use t::lib::TestBuilder;
29 use t::lib::Mocks;
30
31 use Koha::Illrequests;
32 use Koha::DateUtils qw( format_sqldatetime );
33
34 my $schema  = Koha::Database->new->schema;
35 my $builder = t::lib::TestBuilder->new;
36
37 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
38
39 my $t = Test::Mojo->new('Koha::REST::V1');
40
41 subtest 'list_legacy() tests' => sub {
42
43     plan tests => 30;
44
45     # Mock ILLBackend (as object)
46     my $backend = Test::MockObject->new;
47     $backend->set_isa('Koha::Illbackends::Mock');
48     $backend->set_always('name', 'Mock');
49     $backend->set_always('capabilities', sub { return 'bar'; } );
50     $backend->mock(
51         'metadata',
52         sub {
53             my ( $self, $rq ) = @_;
54             return {
55                 ID => $rq->illrequest_id,
56                 Title => $rq->patron->borrowernumber
57             }
58         }
59     );
60     $backend->mock(
61         'status_graph', sub {},
62     );
63
64     # Mock Koha::Illrequest::load_backend (to load Mocked Backend)
65     my $illreqmodule = Test::MockModule->new('Koha::Illrequest');
66     $illreqmodule->mock( 'load_backend',
67         sub { my $self = shift; $self->{_my_backend} = $backend; return $self }
68     );
69
70     $schema->storage->txn_begin;
71
72     Koha::Illrequests->search->delete;
73
74     # create an authorized user
75     my $patron = $builder->build_object({
76         class => 'Koha::Patrons',
77         value => { flags => 2 ** 22 } # 22 => ill
78     });
79     my $password = 'thePassword123';
80     $patron->set_password({ password => $password, skip_validation => 1 });
81     my $userid = $patron->userid;
82
83     ## Authorized user tests
84     # No requests, so empty array should be returned
85     $t->get_ok( "//$userid:$password@/api/v1/illrequests" )
86       ->status_is(200)
87       ->json_is( [] );
88
89     my $library  = $builder->build_object( { class => 'Koha::Libraries' } );
90     my $patron_1 = $builder->build_object( { class => 'Koha::Patrons' } );
91     my $patron_2 = $builder->build_object( { class => 'Koha::Patrons' } );
92
93     # Create an ILL request
94     my $illrequest = $builder->build_object(
95         {
96             class => 'Koha::Illrequests',
97             value => {
98                 backend        => 'Mock',
99                 biblio_id      => undef,
100                 branchcode     => $library->branchcode,
101                 borrowernumber => $patron_1->borrowernumber,
102                 status         => 'STATUS1',
103             }
104         }
105     );
106
107     # The api response is always augmented with the id_prefix
108     my $response = $illrequest->unblessed;
109     $response->{id_prefix} = $illrequest->id_prefix;
110
111     my $req_formatted = add_formatted($response);
112
113     # One illrequest created, should get returned
114     $t->get_ok( "//$userid:$password@/api/v1/illrequests" )
115       ->status_is(200)
116       ->json_is( [ $req_formatted ] );
117
118     # One illrequest created, returned with augmented data
119     $t->get_ok( "//$userid:$password@/api/v1/illrequests?embed=patron,library,capabilities,metadata,requested_partners" )
120       ->status_is(200)
121       ->json_has( '/0/patron', 'patron embedded' )
122       ->json_is( '/0/patron/patron_id', $patron_1->borrowernumber, 'The right patron is embeded')
123       ->json_has( '/0/requested_partners', 'requested_partners embedded' )
124       ->json_has( '/0/capabilities', 'capabilities embedded' )
125       ->json_has( '/0/library', 'library embedded'  )
126       ->json_has( '/0/metadata', 'metadata embedded'  )
127       ->json_hasnt( '/1', 'Only one request was created' );
128
129     # Create another ILL request
130     my $illrequest2 = $builder->build_object(
131         {
132             class => 'Koha::Illrequests',
133             value => {
134                 backend        => 'Mock',
135                 biblio_id      => undef,
136                 branchcode     => $library->branchcode,
137                 borrowernumber => $patron_2->borrowernumber,
138                 status         => 'STATUS2',
139             }
140         }
141     );
142
143     # The api response is always augmented with the id_prefix
144     my $response2 = $illrequest2->unblessed;
145     $response2->{id_prefix} = $illrequest2->id_prefix;
146
147     my $req2_formatted = add_formatted($response2);
148
149     # Two illrequest created, should get returned
150     $t->get_ok( "//$userid:$password@/api/v1/illrequests" )
151       ->status_is(200)
152       ->json_is( [ $req_formatted, $req2_formatted ] );
153
154     # Warn on unsupported query parameter
155     $t->get_ok( "//$userid:$password@/api/v1/illrequests?request_blah=blah" )
156       ->status_is(400)
157       ->json_is(
158         [{ path => '/query/request_blah', message => 'Malformed query string'}]
159     );
160
161     # Test the borrowernumber parameter
162     $t->get_ok( "//$userid:$password@/api/v1/illrequests?borrowernumber=" . $patron_2->borrowernumber )
163       ->status_is(200)
164       ->json_is( [ $response2 ] );
165
166     # Test the ILLHiddenRequestStatuses syspref
167     t::lib::Mocks::mock_preference( 'ILLHiddenRequestStatuses', 'STATUS1' );
168     $t->get_ok( "//$userid:$password@/api/v1/illrequests" )
169       ->status_is(200)
170       ->json_is( [ $req2_formatted ] );
171
172     t::lib::Mocks::mock_preference( 'ILLHiddenRequestStatuses', 'STATUS2' );
173     $t->get_ok( "//$userid:$password@/api/v1/illrequests" )
174       ->status_is(200)
175       ->json_is( [ $req_formatted ] );
176
177     $schema->storage->txn_rollback;
178 };
179
180 subtest 'list() tests' => sub {
181
182     plan tests => 9;
183
184     $schema->storage->txn_begin;
185
186     Koha::Illrequests->search->delete;
187
188     my $librarian = $builder->build_object(
189         {
190             class => 'Koha::Patrons',
191             value => { flags => 2 ** 22 } # 22 => ill
192         }
193     );
194     my $password = 'thePassword123';
195     $librarian->set_password( { password => $password, skip_validation => 1 } );
196     my $userid = $librarian->userid;
197
198     my $patron = $builder->build_object(
199         {
200             class => 'Koha::Patrons',
201             value => { flags => 0 }
202         }
203     );
204
205     $patron->set_password( { password => $password, skip_validation => 1 } );
206     my $unauth_userid = $patron->userid;
207
208     $t->get_ok("//$userid:$password@/api/v1/ill_requests")
209       ->status_is(200)
210       ->json_is( [] );
211
212     my $req_1 = $builder->build_object({ class => 'Koha::Illrequests', value => { biblio_id => undef, status => 'REQ' } });
213     my $req_2 = $builder->build_object({ class => 'Koha::Illrequests', value => { biblio_id => undef, status => 'REQ' } } );
214     my $ret   = $builder->build_object({ class => 'Koha::Illrequests', value => { biblio_id => undef, status => 'RET' } } );
215
216     $t->get_ok("//$userid:$password@/api/v1/ill_requests")
217       ->status_is(200)
218       ->json_is( [ $req_1->to_api, $req_2->to_api, $ret->to_api ]);
219
220     my $query = encode_json({ status => 'REQ' });
221
222     # Filtering works
223     $t->get_ok("//$userid:$password@/api/v1/ill_requests?q=$query" )
224       ->status_is(200)
225       ->json_is( [ $req_1->to_api, $req_2->to_api ]);
226
227     $schema->storage->txn_rollback;
228 };
229
230 sub add_formatted {
231     my $req = shift;
232     my @format_dates = ( 'placed', 'updated', 'completed' );
233     # We need to embellish the request with properties that the API
234     # controller calculates on the fly
235     # Create new "formatted" columns for each date column
236     # that needs formatting
237     foreach my $field(@format_dates) {
238         if (defined $req->{$field}) {
239             $req->{$field . "_formatted"} = format_sqldatetime(
240                 $req->{$field},
241                 undef,
242                 undef,
243                 1
244             );
245         }
246     }
247     return $req;
248 }