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
=> 3;
26 use t
::lib
::TestBuilder
;
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
'get() tests' => sub {
43 $schema->storage->txn_begin;
45 my $patron = $builder->build_object(
47 class => 'Koha::Patrons',
48 value
=> { flags
=> 0 }
51 my $password = 'thePassword123';
52 $patron->set_password( { password
=> $password, skip_validation
=> 1 } );
53 $patron->discard_changes;
54 my $userid = $patron->userid;
56 my $biblio = $builder->build_sample_biblio({
57 title
=> 'The unbearable lightness of being',
58 author
=> 'Milan Kundera'
60 $t->get_ok("//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber)
63 $patron->flags(4)->store;
65 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
66 => { Accept
=> 'application/weird+format' } )
68 ->json_is( [ "application/json",
69 "application/marcxml+xml",
70 "application/marc-in-json",
74 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
75 => { Accept
=> 'application/json' } )
77 ->json_is( '/title', 'The unbearable lightness of being' )
78 ->json_is( '/author', 'Milan Kundera' );
80 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
81 => { Accept
=> 'application/marcxml+xml' } )
84 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
85 => { Accept
=> 'application/marc-in-json' } )
88 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
89 => { Accept
=> 'application/marc' } )
92 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
93 => { Accept
=> 'text/plain' } )
95 ->content_is($biblio->metadata->record->as_formatted);
98 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
99 => { Accept
=> 'application/marc' } )
101 ->json_is( '/error', 'Object not found.' );
103 $schema->storage->txn_rollback;
106 subtest
'delete() tests' => sub {
110 $schema->storage->txn_begin;
112 my $patron = $builder->build_object(
114 class => 'Koha::Patrons',
115 value
=> { flags
=> 0 } # no permissions
118 my $password = 'thePassword123';
119 $patron->set_password( { password
=> $password, skip_validation
=> 1 } );
120 my $userid = $patron->userid;
122 my $item = $builder->build_sample_item();
123 my $biblio_id = $item->biblionumber;
125 $t->delete_ok("//$userid:$password@/api/v1/biblios/$biblio_id")
126 ->status_is(403, 'Not enough permissions makes it return the right code');
131 source
=> 'UserPermission',
133 borrowernumber
=> $patron->borrowernumber,
135 code
=> 'edit_catalogue'
141 # Bibs with items cannot be deleted
142 $t->delete_ok("//$userid:$password@/api/v1/biblios/$biblio_id")
147 # Bibs with no items can be deleted
148 $t->delete_ok("//$userid:$password@/api/v1/biblios/$biblio_id")
149 ->status_is(204, 'SWAGGER3.2.4')
150 ->content_is('', 'SWAGGER3.3.4');
152 $t->delete_ok("//$userid:$password@/api/v1/biblios/$biblio_id")
155 $schema->storage->txn_rollback;
158 subtest
'get_public() tests' => sub {
162 $schema->storage->txn_begin;
164 my $category = $builder->build_object({ class => 'Koha::Patron::Categories' });
165 my $patron = $builder->build_object(
167 class => 'Koha::Patrons',
169 flags
=> undef, # opac user
170 categorycode
=> $category->categorycode
174 my $password = 'thePassword123';
175 $patron->set_password( { password
=> $password, skip_validation
=> 1 } );
176 $patron->discard_changes;
177 my $userid = $patron->userid;
179 my $biblio = $builder->build_sample_biblio({
180 title
=> 'The unbearable lightness of being',
181 author
=> 'Milan Kundera'
184 # Make sure author in shown in the OPAC
185 my $subfields = Koha
::MarcSubfieldStructures
->search({ tagfield
=> '100' });
186 while ( my $subfield = $subfields->next ) {
187 $subfield->set({ hidden
=> -1 })->store;
189 Koha
::Caches
->get_instance()->flush_all;
191 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
192 => { Accept
=> 'application/weird+format' } )
194 ->json_is( [ "application/marcxml+xml",
195 "application/marc-in-json",
199 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
200 => { Accept
=> 'text/plain' } )
202 ->content_like( qr{100\s+_aMilan Kundera} )
203 ->content_like( qr{245\s+_aThe unbearable lightness of being} );
205 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
206 => { Accept
=> 'application/marcxml+xml' } )
209 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
210 => { Accept
=> 'application/marc-in-json' } )
213 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
214 => { Accept
=> 'application/marc' } )
217 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
218 => { Accept
=> 'text/plain' } )
220 ->content_is($biblio->metadata->record->as_formatted);
222 subtest
'anonymous access' => sub {
225 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
226 => { Accept
=> 'application/marcxml+xml' } )
229 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
230 => { Accept
=> 'application/marc-in-json' } )
233 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
234 => { Accept
=> 'application/marc' } )
237 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
238 => { Accept
=> 'text/plain' } )
240 ->content_is($biblio->metadata->record->as_formatted);
243 # Hide author in OPAC
244 $subfields = Koha
::MarcSubfieldStructures
->search({ tagfield
=> '100' });
245 while ( my $subfield = $subfields->next ) {
246 $subfield->set({ hidden
=> 1 })->store;
249 Koha
::Caches
->get_instance()->flush_all;
251 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
252 => { Accept
=> 'text/plain' } )
254 ->content_unlike( qr{100\s+_aMilan Kundera} )
255 ->content_like( qr{245\s+_aThe unbearable lightness of being} );
257 subtest
'hidden_in_opac tests' => sub {
261 my $biblio_hidden_in_opac = 1;
263 my $biblio_class = Test
::MockModule
->new('Koha::Biblio');
264 # force biblio hidden in OPAC
265 $biblio_class->mock( 'hidden_in_opac', sub { return $biblio_hidden_in_opac; } );
267 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
268 => { Accept
=> 'text/plain' } )
269 ->status_is(404, 'hidden_in_opac + anonymous => hidden');
271 my $category_override_hidden_items = 0;
272 my $category_class = Test
::MockModule
->new('Koha::Patron::Category');
273 $category_class->mock( 'override_hidden_items', sub { return $category_override_hidden_items; } );
274 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
275 => { Accept
=> 'text/plain' } )
276 ->status_is(404, "hidden_in_opac + patron whose category doesn't override => hidden");
278 # Make the category override
279 $category_override_hidden_items = 1;
280 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
281 => { Accept
=> 'text/plain' } )
282 ->status_is(200, "hidden_in_opac + patron whose category that overrides => displayed");
284 t
::lib
::Mocks
::mock_preference
('OpacHiddenItems');
288 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
289 => { Accept
=> 'application/marc' } )
291 ->json_is( '/error', 'Object not found.' );
293 $schema->storage->txn_rollback;