View | Details | Raw Unified | Return to bug 41700
Collapse All | Expand All

(-)a/t/db_dependent/api/v1/checkouts.t (-61 / +132 lines)
Lines 18-24 Link Here
18
use Modern::Perl;
18
use Modern::Perl;
19
19
20
use Test::NoWarnings;
20
use Test::NoWarnings;
21
use Test::More tests => 109;
21
use Test::More tests => 111;
22
use Test::MockModule;
22
use Test::MockModule;
23
use Test::Mojo;
23
use Test::Mojo;
24
use t::lib::Mocks;
24
use t::lib::Mocks;
Lines 91-97 $bookings_librarian->set_password( { password => $password, skip_validation => 1 Link Here
91
my $bookings_userid = $bookings_librarian->userid;
91
my $bookings_userid = $bookings_librarian->userid;
92
92
93
$t->get_ok("//$bookings_userid:$password@/api/v1/checkouts?patron_id=$patron_id")
93
$t->get_ok("//$bookings_userid:$password@/api/v1/checkouts?patron_id=$patron_id")
94
    ->status_is( 200, 'manage_bookings allows checkouts access' )->json_is( [] );
94
    ->status_is( 200, 'manage_bookings allows checkouts access' )
95
    ->json_is( [] );
95
96
96
Koha::CirculationRules->set_rules(
97
Koha::CirculationRules->set_rules(
97
    {
98
    {
Lines 121-146 my $date_due3 = Koha::DateUtils::dt_from_string( $issue3->date_due ); Link Here
121
my $issue4    = C4::Circulation::AddIssue( $patron, $item4->barcode );
122
my $issue4    = C4::Circulation::AddIssue( $patron, $item4->barcode );
122
C4::Circulation::AddReturn( $item4->barcode, $branchcode );
123
C4::Circulation::AddReturn( $item4->barcode, $branchcode );
123
124
124
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id")->status_is(200)
125
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id")
125
    ->json_is( '/0/patron_id' => $patron_id )->json_is( '/0/item_id' => $item1->itemnumber )
126
    ->status_is(200)
127
    ->json_is( '/0/patron_id' => $patron_id )
128
    ->json_is( '/0/item_id'   => $item1->itemnumber )
126
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
129
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
127
    ->json_is( '/1/patron_id' => $patron_id )->json_is( '/1/item_id' => $item2->itemnumber )
130
    ->json_is( '/1/patron_id' => $patron_id )
128
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )->json_hasnt('/2');
131
    ->json_is( '/1/item_id'   => $item2->itemnumber )
132
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )
133
    ->json_hasnt('/2');
129
134
130
# Test checked_in parameter, zero means, the response is same as without it
135
# Test checked_in parameter, zero means, the response is same as without it
131
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=0")->status_is(200)
136
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=0")
132
    ->json_is( '/0/patron_id' => $patron_id )->json_is( '/0/item_id' => $item1->itemnumber )
137
    ->status_is(200)
138
    ->json_is( '/0/patron_id' => $patron_id )
139
    ->json_is( '/0/item_id'   => $item1->itemnumber )
133
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
140
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
134
    ->json_is( '/1/patron_id' => $patron_id )->json_is( '/1/item_id' => $item2->itemnumber )
141
    ->json_is( '/1/patron_id' => $patron_id )
135
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )->json_hasnt('/2');
142
    ->json_is( '/1/item_id'   => $item2->itemnumber )
143
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )
144
    ->json_hasnt('/2');
136
145
137
# Test checked_in parameter, one measn, the checked in checkout is in the response too
146
# Test checked_in parameter, one measn, the checked in checkout is in the response too
138
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=1")->status_is(200)
147
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=1")
139
    ->json_is( '/0/patron_id' => $patron_id )->json_is( '/0/item_id' => $item4->itemnumber )->json_hasnt('/1');
148
    ->status_is(200)
149
    ->json_is( '/0/patron_id' => $patron_id )
150
    ->json_is( '/0/item_id'   => $item4->itemnumber )
151
    ->json_hasnt('/1');
140
152
141
$item4->delete;
153
$item4->delete;
142
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=1")->status_is(200)
154
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&checked_in=1")
143
    ->json_is( '/0/patron_id' => $patron_id )->json_is( '/0/item_id' => undef );
155
    ->status_is(200)
156
    ->json_is( '/0/patron_id' => $patron_id )
157
    ->json_is( '/0/item_id'   => undef );
144
158
145
$t->get_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->issue_id )->status_is(403)->json_is(
159
$t->get_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->issue_id )->status_is(403)->json_is(
146
    {
160
    {
Lines 149-197 $t->get_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->is Link Here
149
    }
163
    }
150
);
164
);
151
165
152
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id")->status_is(200)
166
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id")
153
    ->json_is( '/0/patron_id' => $patron_id )->json_is( '/0/item_id' => $item1->itemnumber )
167
    ->status_is(200)
168
    ->json_is( '/0/patron_id' => $patron_id )
169
    ->json_is( '/0/item_id'   => $item1->itemnumber )
154
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
170
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
155
    ->json_is( '/1/patron_id' => $patron_id )->json_is( '/1/item_id' => $item2->itemnumber )
171
    ->json_is( '/1/patron_id' => $patron_id )
156
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )->json_hasnt('/2');
172
    ->json_is( '/1/item_id'   => $item2->itemnumber )
157
173
    ->json_is( '/1/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )
158
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&_per_page=1&_page=1")->status_is(200)
174
    ->json_hasnt('/2');
159
    ->header_is( 'X-Total-Count', '2' )->header_like( 'Link', qr|rel="next"| )->header_like( 'Link', qr|rel="first"| )
175
160
    ->header_like( 'Link', qr|rel="last"| )->json_is( '/0/patron_id' => $patron_id )
176
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&_per_page=1&_page=1")
161
    ->json_is( '/0/item_id'  => $item1->itemnumber )
177
    ->status_is(200)
162
    ->json_is( '/0/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )->json_hasnt('/1');
178
    ->header_is( 'X-Total-Count', '2' )
163
179
    ->header_like( 'Link', qr|rel="next"| )
164
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&_per_page=1&_page=2")->status_is(200)
180
    ->header_like( 'Link', qr|rel="first"| )
165
    ->header_is( 'X-Total-Count', '2' )->header_like( 'Link', qr|rel="prev"| )->header_like( 'Link', qr|rel="first"| )
181
    ->header_like( 'Link', qr|rel="last"| )
166
    ->header_like( 'Link', qr|rel="last"| )->json_is( '/0/patron_id' => $patron_id )
182
    ->json_is( '/0/patron_id' => $patron_id )
167
    ->json_is( '/0/item_id'  => $item2->itemnumber )
183
    ->json_is( '/0/item_id'   => $item1->itemnumber )
168
    ->json_is( '/0/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )->json_hasnt('/1');
184
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
169
185
    ->json_hasnt('/1');
170
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id )->status_is(200)
186
171
    ->json_is( '/patron_id' => $patron_id )->json_is( '/item_id' => $item1->itemnumber )
187
$t->get_ok("//$userid:$password@/api/v1/checkouts?patron_id=$patron_id&_per_page=1&_page=2")
172
    ->json_is( '/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )->json_hasnt('/1');
188
    ->status_is(200)
173
189
    ->header_is( 'X-Total-Count', '2' )
174
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id )->status_is(200)
190
    ->header_like( 'Link', qr|rel="prev"| )
191
    ->header_like( 'Link', qr|rel="first"| )
192
    ->header_like( 'Link', qr|rel="last"| )
193
    ->json_is( '/0/patron_id' => $patron_id )
194
    ->json_is( '/0/item_id'   => $item2->itemnumber )
195
    ->json_is( '/0/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) )
196
    ->json_hasnt('/1');
197
198
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id )
199
    ->status_is(200)
200
    ->json_is( '/patron_id' => $patron_id )
201
    ->json_is( '/item_id'   => $item1->itemnumber )
202
    ->json_is( '/due_date'  => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) )
203
    ->json_hasnt('/1');
204
205
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id )
206
    ->status_is(200)
175
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) );
207
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due1 } ) );
176
208
177
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id )->status_is(200)
209
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id )
210
    ->status_is(200)
178
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) );
211
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $date_due2 } ) );
179
212
180
my $expected_datedue =
213
my $expected_datedue =
181
    $date_due->set_time_zone('local')->add( days => 7 )->set( hour => 23, minute => 59, second => 0 );
214
    $date_due->set_time_zone('local')->add( days => 7 )->set( hour => 23, minute => 59, second => 0 );
182
215
183
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewal" )->status_is(201)
216
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewal" )
217
    ->status_is(201)
184
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $expected_datedue } ) )
218
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $expected_datedue } ) )
185
    ->header_is( Location => "/api/v1/checkouts/" . $issue1->issue_id . "/renewal" );
219
    ->header_is( Location => "/api/v1/checkouts/" . $issue1->issue_id . "/renewal" );
186
220
187
my $renewal = $issue1->renewals->last;
221
my $renewal = $issue1->renewals->last;
188
is( $renewal->renewal_type, 'Manual', 'Manual renewal recorded' );
222
is( $renewal->renewal_type, 'Manual', 'Manual renewal recorded' );
189
223
190
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewals" )->status_is(200)
224
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewals" )
191
    ->json_is( '/0/checkout_id' => $issue1->issue_id )->json_is( '/0/interface' => 'api' )
225
    ->status_is(200)
226
    ->json_is( '/0/checkout_id' => $issue1->issue_id )
227
    ->json_is( '/0/interface'   => 'api' )
192
    ->json_is( '/0/renewer_id'  => $librarian->borrowernumber );
228
    ->json_is( '/0/renewer_id'  => $librarian->borrowernumber );
193
229
194
$t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->issue_id . "/renewal" )->status_is(403)
230
$t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->issue_id . "/renewal" )
231
    ->status_is(403)
195
    ->json_is(
232
    ->json_is(
196
    {
233
    {
197
        error                => "Authorization failure. Missing required permission(s).",
234
        error                => "Authorization failure. Missing required permission(s).",
Lines 199-205 $t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->i Link Here
199
    }
236
    }
200
    );
237
    );
201
238
202
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal" )->status_is(200)
239
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal" )
240
    ->status_is(200)
203
    ->json_is(
241
    ->json_is(
204
    {
242
    {
205
        allows_renewal   => Mojo::JSON->true,
243
        allows_renewal   => Mojo::JSON->true,
Lines 210-223 $t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/all Link Here
210
    }
248
    }
211
    );
249
    );
212
250
213
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/renewal" )->status_is(201)
251
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/renewal" )
252
    ->status_is(201)
214
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $expected_datedue } ) )
253
    ->json_is( '/due_date' => output_pref( { dateformat => "rfc3339", dt => $expected_datedue } ) )
215
    ->header_is( Location => "/api/v1/checkouts/" . $issue2->issue_id . "/renewal" );
254
    ->header_is( Location => "/api/v1/checkouts/" . $issue2->issue_id . "/renewal" );
216
255
217
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewal" )->status_is(403)
256
$t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/renewal" )
257
    ->status_is(403)
218
    ->json_is( { error => 'Renewal not authorized (too_many)' } );
258
    ->json_is( { error => 'Renewal not authorized (too_many)' } );
219
259
220
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal" )->status_is(200)
260
$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal" )
261
    ->status_is(200)
221
    ->json_is(
262
    ->json_is(
222
    {
263
    {
223
        allows_renewal   => Mojo::JSON->false,
264
        allows_renewal   => Mojo::JSON->false,
Lines 228-233 $t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/all Link Here
228
    }
269
    }
229
    );
270
    );
230
271
272
#Confirm we can get a checkout with a note
273
$issue1->note("Test")->notedate( dt_from_string() )->store;
274
$t->get_ok("//$userid:$password@/api/v1/checkouts")->status_is(200);
275
231
$schema->storage->txn_rollback;
276
$schema->storage->txn_rollback;
232
277
233
subtest 'get_availability' => sub {
278
subtest 'get_availability' => sub {
Lines 275-281 subtest 'get_availability' => sub { Link Here
275
320
276
    $t->get_ok(
321
    $t->get_ok(
277
        "//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
322
        "//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
278
        ->status_is(403)->json_is(
323
        ->status_is(403)
324
        ->json_is(
279
        {
325
        {
280
            error                => "Authorization failure. Missing required permission(s).",
326
            error                => "Authorization failure. Missing required permission(s).",
281
            required_permissions => { circulate => "circulate_remaining_permissions" }
327
            required_permissions => { circulate => "circulate_remaining_permissions" }
Lines 284-304 subtest 'get_availability' => sub { Link Here
284
330
285
    # Available
331
    # Available
286
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
332
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
287
        ->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
333
        ->status_is(200)
334
        ->json_is( '/blockers' => {} )
335
        ->json_is( '/confirms' => {} )
336
        ->json_is( '/warnings' => {} )
288
        ->json_has('/confirmation_token');
337
        ->json_has('/confirmation_token');
289
338
290
    # Blocked
339
    # Blocked
291
    %issuingimpossible = ( GNA => 1 );
340
    %issuingimpossible = ( GNA => 1 );
292
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
341
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
293
        ->status_is(200)->json_is( '/blockers' => { GNA => 1 } )->json_is( '/confirms' => {} )
342
        ->status_is(200)
294
        ->json_is( '/warnings' => {} )->json_has('/confirmation_token');
343
        ->json_is( '/blockers' => { GNA => 1 } )
344
        ->json_is( '/confirms' => {} )
345
        ->json_is( '/warnings' => {} )
346
        ->json_has('/confirmation_token');
295
    %issuingimpossible = ();
347
    %issuingimpossible = ();
296
348
297
    # Warnings/Info
349
    # Warnings/Info
298
    %alerts   = ( alert1   => "this is an alert" );
350
    %alerts   = ( alert1   => "this is an alert" );
299
    %messages = ( message1 => "this is a message" );
351
    %messages = ( message1 => "this is a message" );
300
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
352
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
301
        ->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )
353
        ->status_is(200)
354
        ->json_is( '/blockers' => {} )
355
        ->json_is( '/confirms' => {} )
302
        ->json_is( '/warnings' => { alert1 => "this is an alert", message1 => "this is a message" } )
356
        ->json_is( '/warnings' => { alert1 => "this is an alert", message1 => "this is a message" } )
303
        ->json_has('/confirmation_token');
357
        ->json_has('/confirmation_token');
304
    %alerts   = ();
358
    %alerts   = ();
Lines 308-315 subtest 'get_availability' => sub { Link Here
308
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
362
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
309
    my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } );
363
    my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } );
310
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
364
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
311
        ->status_is(200)->json_is( '/blockers' => {} )
365
        ->status_is(200)
312
        ->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } )->json_is( '/warnings' => {} )
366
        ->json_is( '/blockers' => {} )
367
        ->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } )
368
        ->json_is( '/warnings' => {} )
313
        ->json_has('/confirmation_token');
369
        ->json_has('/confirmation_token');
314
    my $confirmation_token = $t->tx->res->json('/confirmation_token');
370
    my $confirmation_token = $t->tx->res->json('/confirmation_token');
315
    ok(
371
    ok(
Lines 336-350 subtest 'get_availability' => sub { Link Here
336
        # All ok
392
        # All ok
337
        $t->get_ok(
393
        $t->get_ok(
338
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
394
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
339
        )->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
395
            )
396
            ->status_is(200)
397
            ->json_is( '/blockers' => {} )
398
            ->json_is( '/confirms' => {} )
399
            ->json_is( '/warnings' => {} )
340
            ->json_has('/confirmation_token');
400
            ->json_has('/confirmation_token');
341
401
342
        # Needs confirmation upgrade to blocker
402
        # Needs confirmation upgrade to blocker
343
        %needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 );
403
        %needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 );
344
        $t->get_ok(
404
        $t->get_ok(
345
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
405
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
346
        )->status_is(200)->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } )
406
            )
347
            ->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )->json_has('/confirmation_token');
407
            ->status_is(200)
408
            ->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } )
409
            ->json_is( '/confirms' => {} )
410
            ->json_is( '/warnings' => {} )
411
            ->json_has('/confirmation_token');
348
        %needsconfirmation = ();
412
        %needsconfirmation = ();
349
413
350
        # Remove personal information from public endpoint
414
        # Remove personal information from public endpoint
Lines 393-399 subtest 'get_availability' => sub { Link Here
393
        );
457
        );
394
        $t->get_ok(
458
        $t->get_ok(
395
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
459
            "//$unauth_userid:$unauth_password@/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
396
        )->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
460
            )
461
            ->status_is(200)
462
            ->json_is( '/blockers' => {} )
463
            ->json_is( '/confirms' => {} )
464
            ->json_is( '/warnings' => {} )
397
            ->json_has('/confirmation_token');
465
            ->json_has('/confirmation_token');
398
        %issuingimpossible = ();
466
        %issuingimpossible = ();
399
        %alerts            = ();
467
        %alerts            = ();
Lines 504-513 subtest 'add checkout' => sub { Link Here
504
572
505
        $t->post_ok(
573
        $t->post_ok(
506
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
574
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
507
            ->status_is(401)->json_is( { error => "Authentication failure." } );
575
            ->status_is(401)
576
            ->json_is( { error => "Authentication failure." } );
508
577
509
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
578
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
510
                { item_id => $item1_id, patron_id => $patron_id } )->status_is(405)
579
                { item_id => $item1_id, patron_id => $patron_id } )
580
            ->status_is(405)
511
            ->json_is( { error => "Feature disabled", error_code => "FEATURE_DISABLED" } );
581
            ->json_is( { error => "Feature disabled", error_code => "FEATURE_DISABLED" } );
512
582
513
        # Feature enabled
583
        # Feature enabled
Lines 515-524 subtest 'add checkout' => sub { Link Here
515
585
516
        $t->post_ok(
586
        $t->post_ok(
517
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
587
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
518
            ->status_is(401)->json_is( { error => "Authentication failure." } );
588
            ->status_is(401)
589
            ->json_is( { error => "Authentication failure." } );
519
590
520
        $t->post_ok( "//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
591
        $t->post_ok( "//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
521
                { item_id => $item1_id, patron_id => $patron_id } )->status_is(403)
592
                { item_id => $item1_id, patron_id => $patron_id } )
593
            ->status_is(403)
522
            ->json_is( { error => "Unprivileged user cannot access another user's resources" } );
594
            ->json_is( { error => "Unprivileged user cannot access another user's resources" } );
523
595
524
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
596
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
525
- 

Return to bug 41700