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>.
20 use Test::More tests => 4;
24 use t::lib::TestBuilder;
27 use List::Util qw(min);
29 use Koha::Item::Transfer::Limits;
32 my $schema = Koha::Database->new->schema;
33 my $builder = t::lib::TestBuilder->new;
35 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
37 my $t = Test::Mojo->new('Koha::REST::V1');
39 subtest 'list() tests' => sub {
42 $schema->storage->txn_begin;
44 Koha::Item::Transfer::Limits->delete;
46 my $patron = $builder->build_object({
47 class => 'Koha::Patrons',
48 value => { flags => 1 }
50 my $password = 'thePassword123';
51 $patron->set_password({ password => $password, skip_validation => 1 });
52 my $userid = $patron->userid;
54 my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
56 $t->get_ok( "//$userid:$password@/api/v1/transfer_limits" )
57 ->status_is( 200, 'SWAGGER3.2.2' )
58 ->json_is( [$limit->to_api] );
60 $schema->storage->txn_rollback;
63 subtest 'add() tests' => sub {
67 $schema->storage->txn_begin;
69 my $authorized_patron = $builder->build_object({
70 class => 'Koha::Patrons',
71 value => { flags => 1 }
73 my $password = 'thePassword123';
74 $authorized_patron->set_password({ password => $password, skip_validation => 1 });
75 my $auth_userid = $authorized_patron->userid;
77 my $unauthorized_patron = $builder->build_object({
78 class => 'Koha::Patrons',
79 value => { flags => 4 }
81 $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
82 my $unauth_userid = $unauthorized_patron->userid;
84 my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
85 my $limit_hashref = $limit->to_api;
86 delete $limit_hashref->{limit_id};
89 # Unauthorized attempt to write
90 $t->post_ok( "//$unauth_userid:$password@/api/v1/transfer_limits" => json => $limit_hashref )
93 # Authorized attempt to write invalid data
94 my $limit_with_invalid_field = {'invalid' => 'invalid'};
96 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits" => json => $limit_with_invalid_field )
101 message => "Properties not allowed: invalid.",
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' );
112 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits" => json => $limit_hashref )
113 ->status_is( 409, 'Conflict creating the resource' )
116 error => qq{Exception 'Koha::Exceptions::TransferLimit::Duplicate' thrown 'A transfer limit with the given parameters already exists!'\n}
120 $schema->storage->txn_rollback;
123 subtest 'delete() tests' => sub {
126 $schema->storage->txn_begin;
128 my $authorized_patron = $builder->build_object({
129 class => 'Koha::Patrons',
130 value => { flags => 1 }
132 my $password = 'thePassword123';
133 $authorized_patron->set_password({ password => $password, skip_validation => 1 });
134 my $auth_userid = $authorized_patron->userid;
136 my $unauthorized_patron = $builder->build_object({
137 class => 'Koha::Patrons',
138 value => { flags => 4 }
140 $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
141 my $unauth_userid = $unauthorized_patron->userid;
143 my $limit = $builder->build_object({ class => 'Koha::Item::Transfer::Limits' });
144 my $limit_id = $limit->id;
146 # Unauthorized attempt to delete
147 $t->delete_ok( "//$unauth_userid:$password@/api/v1/transfer_limits/$limit_id" )
150 $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/$limit_id" )
151 ->status_is(204, 'SWAGGER3.2.4')
152 ->content_is('', 'SWAGGER3.3.4');
154 $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/$limit_id" )
157 $schema->storage->txn_rollback;
160 subtest 'batch_add() and batch_delete() tests' => sub {
164 $schema->storage->txn_begin;
166 t::lib::Mocks::mock_preference( 'BranchTransferLimitsType', 'itemtype' );
168 Koha::Item::Transfer::Limits->delete;
170 #my $library = $builder->build_object({ class => 'Koha::Libraries' });
172 my $library = Koha::Libraries->search->next;
173 my $itemtype = Koha::ItemTypes->search->next;
175 my $authorized_patron = $builder->build_object(
177 class => 'Koha::Patrons',
178 value => { flags => 1 }
181 my $password = 'thePassword123';
182 $authorized_patron->set_password( { password => $password, skip_validation => 1 } );
183 my $auth_userid = $authorized_patron->userid;
185 my $unauthorized_patron = $builder->build_object(
187 class => 'Koha::Patrons',
188 value => { flags => 4 }
191 $unauthorized_patron->set_password( { password => $password, skip_validation => 1 } );
192 my $unauth_userid = $unauthorized_patron->userid;
194 my $limit_hashref = { item_type => $itemtype->id };
196 # Unauthorized attempt to write
197 $t->post_ok( "//$unauth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )->status_is(403);
199 # Authorized attempt to write invalid data
200 my $limit_with_invalid_field = { 'invalid' => 'invalid' };
202 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_with_invalid_field )
203 ->status_is(400)->json_is(
206 message => "Properties not allowed: invalid.",
212 # Create all combinations of to/from libraries
213 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json =>
214 { item_type => 'X', collection_code => 'Y' } )->status_is(400)
215 ->json_is( '/error' => "Only one of 'item_type' and 'collecion_code' can be passed at a time" );
217 t::lib::Mocks::mock_preference( 'BranchTransferLimitsType', 'ccode' );
219 # Create all combinations of to/from libraries
220 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => { item_type => 'X' } )
221 ->status_is(409)->json_is( '/error' => "You passed 'item_type' but configuration expects 'collection_code'" );
223 t::lib::Mocks::mock_preference( 'BranchTransferLimitsType', 'itemtype' );
225 # Create all combinations of to/from libraries
226 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => { collection_code => 'X' } )
227 ->status_is(409)->json_is( '/error' => "You passed 'collection_code' but configuration expects 'item_type'" );
229 # Create all combinations of to/from libraries
230 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
231 ->status_is( 201, 'SWAGGER3.2.1' )->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
233 my $limits = Koha::Item::Transfer::Limits->search;
235 my $libraries_count = Koha::Libraries->search->count;
236 is( $limits->count, $libraries_count * ( $libraries_count - 1 ), "Created the correct number of limits" );
238 # Delete all combinations of to/from libraries
239 $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
240 ->status_is( 204, 'SWAGGER3.2.4' )->content_is( '', 'SWAGGER3.3.4' );
242 $limits = Koha::Item::Transfer::Limits->search;
244 is( $limits->count, 0, "Deleted the correct number of limits" );
246 # Create all combinations of 'to' libraries
247 $limit_hashref->{to_library_id} = $library->id;
248 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
249 ->status_is( 201, 'SWAGGER3.2.1' )->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
251 $limits = Koha::Item::Transfer::Limits->search;
253 is( $limits->count, $libraries_count - 1, "Created the correct number of limits" );
255 # Delete all combinations of 'to' libraries
256 $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
257 ->status_is( 204, 'SWAGGER3.2.4' )->content_is( '', 'SWAGGER3.3.4' );
259 $limits = Koha::Item::Transfer::Limits->search;
261 is( $limits->count, 0, "Deleted the correct number of limits" );
263 # Create all combinations of 'from' libraries
264 Koha::Item::Transfer::Limits->search->delete;
266 delete $limit_hashref->{to_library_id};
267 $limit_hashref->{from_library_id} = $library->id;
268 $t->post_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
269 ->status_is( 201, 'SWAGGER3.2.1' )->json_has( '' => $limit_hashref, 'SWAGGER3.3.1' );
271 $limits = Koha::Item::Transfer::Limits->search;
273 $libraries_count = Koha::Libraries->search->count;
274 is( $limits->count, $libraries_count - 1, "Created the correct number of limits" );
276 # Delete all combinations of 'from' libraries
277 $t->delete_ok( "//$auth_userid:$password@/api/v1/transfer_limits/batch" => json => $limit_hashref )
278 ->status_is( 204, 'SWAGGER3.2.4' )->content_is( '', 'SWAGGER3.3.4' );
280 $limits = Koha::Item::Transfer::Limits->search;
282 $libraries_count = Koha::Libraries->search->count;
283 is( $limits->count, 0, "Deleted the correct number of limits" );
285 $schema->storage->txn_rollback;