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 => 5;
24 use t::lib::TestBuilder;
27 use List::Util qw(min);
29 use Koha::Biblio::ItemGroups;
33 my $schema = Koha::Database->new->schema;
34 my $builder = t::lib::TestBuilder->new;
36 t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
37 t::lib::Mocks::mock_preference( 'EnableItemGroups', 1 );
39 my $t = Test::Mojo->new('Koha::REST::V1');
41 subtest 'list() tests' => sub {
44 $schema->storage->txn_begin;
46 my $patron = $builder->build_object({
47 class => 'Koha::Patrons',
48 value => { flags => 4 }
50 my $password = 'thePassword123';
51 $patron->set_password({ password => $password, skip_validation => 1 });
52 my $userid = $patron->userid;
54 my $biblio = $builder->build_sample_biblio();
55 my $biblio_id = $biblio->id;
57 $t->get_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups" )
58 ->status_is( 200, 'SWAGGER3.2.2' );
59 my $response_count = scalar @{ $t->tx->res->json };
60 is( $response_count, 0, 'Results count is 2');
62 my $item_group_1 = Koha::Biblio::ItemGroup->new( { biblio_id => $biblio->id, display_order => 1, description => "Vol 1" } )->store();
64 $t->get_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups" )
65 ->status_is( 200, 'SWAGGER3.2.2' );
66 $response_count = scalar @{ $t->tx->res->json };
67 is( $response_count, 1, 'Results count is 2');
69 my $item_group_2 = Koha::Biblio::ItemGroup->new( { biblio_id => $biblio->id, display_order => 2, description => "Vol 2" } )->store();
71 $t->get_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups" )
72 ->status_is( 200, 'SWAGGER3.2.2' );
74 $response_count = scalar @{ $t->tx->res->json };
75 is( $response_count, 2, 'Results count is 2');
77 $schema->storage->txn_rollback;
80 subtest 'add() tests' => sub {
84 $schema->storage->txn_begin;
86 my $authorized_patron = $builder->build_object({
87 class => 'Koha::Patrons',
88 value => { flags => 1 }
90 my $password = 'thePassword123';
91 $authorized_patron->set_password({ password => $password, skip_validation => 1 });
92 my $auth_userid = $authorized_patron->userid;
94 my $unauthorized_patron = $builder->build_object({
95 class => 'Koha::Patrons',
96 value => { flags => 0 }
98 $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
99 my $unauth_userid = $unauthorized_patron->userid;
101 my $biblio = $builder->build_sample_biblio();
102 my $biblio_id = $biblio->id;
103 my $item_group = { description => 'Vol 1', display_order => 1 };
105 # Unauthorized attempt
106 $t->post_ok( "//$unauth_userid:$password@/api/v1/biblios/$biblio_id/item_groups" => json => $item_group )
110 $t->post_ok( "//$auth_userid:$password@/api/v1/biblios/$biblio_id/item_groups" => json => $item_group )
111 ->status_is( 201, 'SWAGGER3.2.1' );
114 { # hide useless warnings
116 open STDERR, '>', '/dev/null';
117 $t->post_ok( "//$auth_userid:$password@/api/v1/biblios/XXX/item_groups" => json => $item_group )
122 $schema->storage->txn_rollback;
125 subtest 'update() tests' => sub {
128 $schema->storage->txn_begin;
130 my $authorized_patron = $builder->build_object({
131 class => 'Koha::Patrons',
132 value => { flags => 1 }
134 my $password = 'thePassword123';
135 $authorized_patron->set_password({ password => $password, skip_validation => 1 });
136 my $auth_userid = $authorized_patron->userid;
138 my $unauthorized_patron = $builder->build_object({
139 class => 'Koha::Patrons',
140 value => { flags => 0 }
142 $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
143 my $unauth_userid = $unauthorized_patron->userid;
145 my $biblio = $builder->build_sample_biblio();
146 my $biblio_id = $biblio->id;
147 my $item_group = Koha::Biblio::ItemGroup->new( { biblio_id => $biblio->id, display_order => 1, description => "Vol 1" } )->store();
148 my $item_group_id = $item_group->id;
150 # Unauthorized attempt
151 $t->put_ok( "//$unauth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_group_id"
152 => json => { description => 'New unauthorized desc change' } )
156 $t->put_ok( "//$auth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_group_id" => json => { description => "Vol A" } )
157 ->status_is(200, 'SWAGGER3.2.1')
158 ->json_has( '/description' => "Vol A", 'SWAGGER3.3.3' );
161 $t->put_ok( "//$auth_userid:$password@/api/v1/biblios/XXX/item_groups/$item_group_id" => json => { description => "Vol A" } )
164 # Invalid item group id
165 $t->put_ok( "//$auth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/XXX" => json => { description => "Vol A" } )
168 $schema->storage->txn_rollback;
171 subtest 'delete() tests' => sub {
174 $schema->storage->txn_begin;
176 my $authorized_patron = $builder->build_object({
177 class => 'Koha::Patrons',
178 value => { flags => 1 }
180 my $password = 'thePassword123';
181 $authorized_patron->set_password({ password => $password, skip_validation => 1 });
182 my $auth_userid = $authorized_patron->userid;
184 my $unauthorized_patron = $builder->build_object({
185 class => 'Koha::Patrons',
186 value => { flags => 0 }
188 $unauthorized_patron->set_password({ password => $password, skip_validation => 1 });
189 my $unauth_userid = $unauthorized_patron->userid;
191 my $biblio = $builder->build_sample_biblio();
192 my $biblio_id = $biblio->id;
193 my $item_group = Koha::Biblio::ItemGroup->new( { biblio_id => $biblio->id, display_order => 1, description => "Vol 1" } )->store();
194 my $item_groupid = $item_group->id;
196 $t->delete_ok( "//$auth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_groupid" )
197 ->status_is(204, 'SWAGGER3.2.4')
198 ->content_is('', 'SWAGGER3.3.4');
200 # Unauthorized attempt to delete
201 $t->delete_ok( "//$unauth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_groupid" )
204 $t->delete_ok( "//$auth_userid:$password@/api/v1/biblios/XXX/item_groups/$item_groupid" )
207 $t->delete_ok( "//$auth_userid:$password@/api/v1/biblios/$biblio_id/item_groups/XXX" )
210 $schema->storage->txn_rollback;
213 subtest 'volume items add() + delete() tests' => sub {
216 $schema->storage->txn_begin;
218 my $patron = $builder->build_object({
219 class => 'Koha::Patrons',
220 value => { flags => 4 }
222 my $password = 'thePassword123';
223 $patron->set_password({ password => $password, skip_validation => 1 });
224 my $userid = $patron->userid;
226 my $biblio = $builder->build_sample_biblio();
227 my $biblio_id = $biblio->id;
229 my $item_group = Koha::Biblio::ItemGroup->new( { biblio_id => $biblio->id, display_order => 1, description => "Vol 1" } )->store();
230 my $item_groupid = $item_group->id;
232 my @items = $item_group->items->as_list;
233 is( scalar(@items), 0, 'Item group has no items');
235 my $item_1 = $builder->build_sample_item({ biblionumber => $biblio->biblionumber });
236 my $item_1_id = $item_1->id;
238 $t->post_ok( "//$userid:$password@/api/v1/biblios/XXX/item_groups/$item_groupid/items" => json => { item_id => $item_1->id } )
240 ->json_is( { error => 'Item group does not belong to passed biblio_id' } );
242 $t->post_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_groupid/items" => json => { item_id => $item_1->id } )
243 ->status_is( 201, 'SWAGGER3.2.1' );
245 @items = $item_group->items;
246 is( scalar(@items), 1, 'Item group now has one item');
248 my $item_2 = $builder->build_sample_item({ biblionumber => $biblio->biblionumber });
249 my $item_2_id = $item_2->id;
251 $t->post_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_groupid/items" => json => { item_id => $item_2->id } )
252 ->status_is( 201, 'SWAGGER3.2.1' );
254 @items = $item_group->items->as_list;
255 is( scalar(@items), 2, 'Item group now has two items');
257 $t->delete_ok( "//$userid:$password@/api/v1/biblios/$biblio_id/item_groups/$item_groupid/items/$item_1_id" )
258 ->status_is(204, 'SWAGGER3.2.4')
259 ->content_is('', 'SWAGGER3.3.4');
261 @items = $item_group->items;
262 is( scalar(@items), 1, 'Item group now has one item');
264 $schema->storage->txn_rollback;