Bug 26633: Add REST API for managing transfer limits
[koha.git] / t / db_dependent / api / v1 / transfer_limits.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 use Test::Mojo;
22 use Test::Warn;
23
24 use t::lib::TestBuilder;
25 use t::lib::Mocks;
26
27 use List::Util qw(min);
28
29 use Koha::Item::Transfer::Limits;
30 use Koha::Database;
31
32 my $schema  = Koha::Database->new->schema;
33 my $builder = t::lib::TestBuilder->new;
34
35 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
36
37 my $t = Test::Mojo->new('Koha::REST::V1');
38
39 subtest 'list() tests' => sub {
40     plan tests => 3;
41
42     $schema->storage->txn_begin;
43
44     Koha::Item::Transfer::Limits->delete;
45
46     my $patron = $builder->build_object({
47         class => 'Koha::Patrons',
48         value => { flags => 1 }
49     });
50     my $password = 'thePassword123';
51     $patron->set_password({ password => $password, skip_validation => 1 });
52     my $userid = $patron->userid;
53
54     my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
55
56     $t->get_ok( "//$userid:$password@/api/v1/transfer_limits" )
57       ->status_is( 200, 'SWAGGER3.2.2' )
58       ->json_is( [$limit->to_api] );
59
60     $schema->storage->txn_rollback;
61 };
62
63 subtest 'add() tests' => sub {
64
65     plan tests => 8;
66
67     $schema->storage->txn_begin;
68
69     my $authorized_patron = $builder->build_object({
70         class => 'Koha::Patrons',
71         value => { flags => 1 }
72     });
73     my $password = 'thePassword123';
74     $authorized_patron->set_password({ password => $password, skip_validation => 1 });
75     my $auth_userid = $authorized_patron->userid;
76
77     my $unauthorized_patron = $builder->build_object({
78         class => 'Koha::Patrons',
79         value => { flags => 4 }
80     });
81     $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
82     my $unauth_userid = $unauthorized_patron->userid;
83
84     my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
85     my $limit_hashref = $limit->to_api;
86     delete $limit_hashref->{limit_id};
87     $limit->delete;
88
89     # Unauthorized attempt to write
90     $t->post_ok( "//$unauth_userid:$password@/api/v1/transfer_limits" => json => $limit_hashref )
91       ->status_is(403);
92
93     # Authorized attempt to write invalid data
94     my $limit_with_invalid_field = {'invalid' => 'invalid'};
95
96     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits" => json => $limit_with_invalid_field )
97       ->status_is(400)
98       ->json_is(
99         "/errors" => [
100             {
101                 message => "Properties not allowed: invalid.",
102                 path    => "/body"
103             }
104         ]
105     );
106
107     # Authorized attempt to write
108     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits" => json => $limit_hashref )
109       ->status_is( 201, 'SWAGGER3.2.1' )
110       ->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
111
112     $schema->storage->txn_rollback;
113 };
114
115 subtest 'delete() tests' => sub {
116     plan tests => 7;
117
118     $schema->storage->txn_begin;
119
120     my $authorized_patron = $builder->build_object({
121         class => 'Koha::Patrons',
122         value => { flags => 1 }
123     });
124     my $password = 'thePassword123';
125     $authorized_patron->set_password({ password => $password, skip_validation => 1 });
126     my $auth_userid = $authorized_patron->userid;
127
128     my $unauthorized_patron = $builder->build_object({
129         class => 'Koha::Patrons',
130         value => { flags => 4 }
131     });
132     $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
133     my $unauth_userid = $unauthorized_patron->userid;
134
135     my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
136     my $limit_id = $limit->id;
137
138     # Unauthorized attempt to delete
139     $t->delete_ok( "//$unauth_userid:$password@/api/v1/transfer_limits/$limit_id" )
140       ->status_is(403);
141
142     $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/$limit_id" )
143       ->status_is(204, 'SWAGGER3.2.4')
144       ->content_is('', 'SWAGGER3.3.4');
145
146     $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/$limit_id" )
147       ->status_is(404);
148
149     $schema->storage->txn_rollback;
150 };
151
152 subtest 'batch_add() and batch_delete() tests' => sub {
153     plan tests => 26;
154
155     $schema->storage->txn_begin;
156
157     Koha::Item::Transfer::Limits->delete;
158
159     #my $library = $builder->build_object({ class => 'Koha::Libraries' });
160
161     my $library = Koha::Libraries->search->next;
162     my $itemtype = Koha::ItemTypes->search->next;
163
164     my $authorized_patron = $builder->build_object({
165         class => 'Koha::Patrons',
166         value => { flags => 1 }
167     });
168     my $password = 'thePassword123';
169     $authorized_patron->set_password({ password => $password, skip_validation => 1 });
170     my $auth_userid = $authorized_patron->userid;
171
172     my $unauthorized_patron = $builder->build_object({
173         class => 'Koha::Patrons',
174         value => { flags => 4 }
175     });
176     $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
177     my $unauth_userid = $unauthorized_patron->userid;
178
179     my $limit_hashref = {
180         item_type => $itemtype->id
181     };
182
183     # Unauthorized attempt to write
184     $t->post_ok( "//$unauth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
185         ->status_is(403);
186
187     # Authorized attempt to write invalid data
188     my $limit_with_invalid_field = {'invalid' => 'invalid'};
189
190     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_with_invalid_field )
191         ->status_is(400)
192         ->json_is(
193         "/errors" => [
194             {
195                 message => "Properties not allowed: invalid.",
196                 path    => "/body"
197             }
198         ]
199     );
200
201     # Create all combinations of to/from libraries
202     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
203         ->status_is( 201, 'SWAGGER3.2.1' )
204         ->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
205
206     my $limits = Koha::Item::Transfer::Limits->search;
207
208     my $libraries_count = Koha::Libraries->search->count;
209     is( $limits->count, $libraries_count * ($libraries_count - 1 ), "Created the correct number of limits" );
210
211     # Delete all combinations of to/from libraries
212     $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
213         ->status_is( 204, 'SWAGGER3.2.1' );
214
215     $limits = Koha::Item::Transfer::Limits->search;
216
217     is( $limits->count, 0, "Deleted the correct number of limits" );
218
219     # Create all combinations of 'to' libraries
220     $limit_hashref->{to_library_id} = $library->id;
221     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
222         ->status_is( 201, 'SWAGGER3.2.1' )
223         ->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
224
225     $limits = Koha::Item::Transfer::Limits->search;
226
227     is( $limits->count, $libraries_count - 1 , "Created the correct number of limits" );
228
229     # Delete all combinations of 'to' libraries
230     $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
231         ->status_is( 204, 'SWAGGER3.2.1' );
232
233     $limits = Koha::Item::Transfer::Limits->search;
234
235     is( $limits->count, 0, "Deleted the correct number of limits" );
236
237     # Create all combinations of 'from' libraries
238     Koha::Item::Transfer::Limits->search->delete;
239
240     delete $limit_hashref->{to_library_id};
241     $limit_hashref->{from_library_id} = $library->id;
242     $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
243         ->status_is( 201, 'SWAGGER3.2.1' )
244         ->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
245
246     $limits = Koha::Item::Transfer::Limits->search;
247
248     $libraries_count = Koha::Libraries->search->count;
249     is( $limits->count, $libraries_count - 1 , "Created the correct number of limits" );
250
251     # Delete all combinations of 'from' libraries
252     $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
253         ->status_is( 204, 'SWAGGER3.2.1' );
254
255     $limits = Koha::Item::Transfer::Limits->search;
256
257     $libraries_count = Koha::Libraries->search->count;
258     is( $limits->count, 0, "Deleted the correct number of limits" );
259
260     $schema->storage->txn_rollback;
261 };