Bug 26922: Regression tests
[koha.git] / t / db_dependent / api / v1 / biblios.t
blob66d423d25f6630aa08ee2caf2d47ee6b9c4dfd86
1 #!/usr/bin/env perl
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>.
18 use Modern::Perl;
20 use Test::More tests => 3;
21 use Test::MockModule;
22 use Test::Mojo;
23 use Test::Warn;
25 use t::lib::Mocks;
26 use t::lib::TestBuilder;
28 use C4::Auth;
29 use Koha::Biblios;
30 use Koha::Database;
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 {
41 plan tests => 21;
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'
59 });
60 $t->get_ok("//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber)
61 ->status_is(403);
63 $patron->flags(4)->store;
65 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
66 => { Accept => 'application/weird+format' } )
67 ->status_is(406)
68 ->json_is( [ "application/json",
69 "application/marcxml+xml",
70 "application/marc-in-json",
71 "application/marc",
72 "text/plain" ] );
74 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
75 => { Accept => 'application/json' } )
76 ->status_is(200)
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' } )
82 ->status_is(200);
84 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
85 => { Accept => 'application/marc-in-json' } )
86 ->status_is(200);
88 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
89 => { Accept => 'application/marc' } )
90 ->status_is(200);
92 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
93 => { Accept => 'text/plain' } )
94 ->status_is(200)
95 ->content_is($biblio->metadata->record->as_formatted);
97 $biblio->delete;
98 $t->get_ok( "//$userid:$password@/api/v1/biblios/" . $biblio->biblionumber
99 => { Accept => 'application/marc' } )
100 ->status_is(404)
101 ->json_is( '/error', 'Object not found.' );
103 $schema->storage->txn_rollback;
106 subtest 'delete() tests' => sub {
108 plan tests => 9;
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');
128 # Add permissions
129 $builder->build(
131 source => 'UserPermission',
132 value => {
133 borrowernumber => $patron->borrowernumber,
134 module_bit => 9,
135 code => 'edit_catalogue'
141 # Bibs with items cannot be deleted
142 $t->delete_ok("//$userid:$password@/api/v1/biblios/$biblio_id")
143 ->status_is(409);
145 $item->delete();
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")
153 ->status_is(404);
155 $schema->storage->txn_rollback;
158 subtest 'get_public() tests' => sub {
160 plan tests => 25;
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',
168 value => {
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' } )
193 ->status_is(406)
194 ->json_is( [ "application/marcxml+xml",
195 "application/marc-in-json",
196 "application/marc",
197 "text/plain" ] );
199 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
200 => { Accept => 'text/plain' } )
201 ->status_is(200)
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' } )
207 ->status_is(200);
209 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
210 => { Accept => 'application/marc-in-json' } )
211 ->status_is(200);
213 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
214 => { Accept => 'application/marc' } )
215 ->status_is(200);
217 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
218 => { Accept => 'text/plain' } )
219 ->status_is(200)
220 ->content_is($biblio->metadata->record->as_formatted);
222 subtest 'anonymous access' => sub {
223 plan tests => 9;
225 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
226 => { Accept => 'application/marcxml+xml' } )
227 ->status_is(200);
229 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
230 => { Accept => 'application/marc-in-json' } )
231 ->status_is(200);
233 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
234 => { Accept => 'application/marc' } )
235 ->status_is(200);
237 $t->get_ok( "/api/v1/public/biblios/" . $biblio->biblionumber
238 => { Accept => 'text/plain' } )
239 ->status_is(200)
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' } )
253 ->status_is(200)
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 {
259 plan tests => 6;
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');
287 $biblio->delete;
288 $t->get_ok( "//$userid:$password@/api/v1/public/biblios/" . $biblio->biblionumber
289 => { Accept => 'application/marc' } )
290 ->status_is(404)
291 ->json_is( '/error', 'Object not found.' );
293 $schema->storage->txn_rollback;