Lines 264-271
subtest 'get_availability' => sub {
Link Here
|
264 |
} |
264 |
} |
265 |
); |
265 |
); |
266 |
my $unauth_password = 'thePassword000'; |
266 |
my $unauth_password = 'thePassword000'; |
267 |
$patron->set_password( |
267 |
$patron->set_password( { password => $unauth_password, skip_validattion => 1 } ); |
268 |
{ password => $unauth_password, skip_validattion => 1 } ); |
|
|
269 |
my $unauth_userid = $patron->userid; |
268 |
my $unauth_userid = $patron->userid; |
270 |
my $patron_id = $patron->borrowernumber; |
269 |
my $patron_id = $patron->borrowernumber; |
271 |
|
270 |
|
Lines 278-284
subtest 'get_availability' => sub {
Link Here
|
278 |
my %needsconfirmation = (); |
277 |
my %needsconfirmation = (); |
279 |
my %alerts = (); |
278 |
my %alerts = (); |
280 |
my %messages = (); |
279 |
my %messages = (); |
281 |
my $mocked_circ = Test::MockModule->new('C4::Circulation'); |
280 |
my $mocked_circ = Test::MockModule->new('C4::Circulation'); |
282 |
$mocked_circ->mock( |
281 |
$mocked_circ->mock( |
283 |
'CanBookBeIssued', |
282 |
'CanBookBeIssued', |
284 |
sub { |
283 |
sub { |
Lines 287-346
subtest 'get_availability' => sub {
Link Here
|
287 |
); |
286 |
); |
288 |
|
287 |
|
289 |
$t->get_ok( |
288 |
$t->get_ok( |
290 |
"//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
289 |
"//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id") |
291 |
)->status_is(403)->json_is( |
290 |
->status_is(403)->json_is( |
292 |
{ |
291 |
{ |
293 |
error => "Authorization failure. Missing required permission(s).", |
292 |
error => "Authorization failure. Missing required permission(s).", |
294 |
required_permissions => |
293 |
required_permissions => { circulate => "circulate_remaining_permissions" } |
295 |
{ circulate => "circulate_remaining_permissions" } |
|
|
296 |
} |
294 |
} |
297 |
); |
295 |
); |
298 |
|
296 |
|
299 |
# Available |
297 |
# Available |
300 |
$t->get_ok( |
298 |
$t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id") |
301 |
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
299 |
->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
302 |
)->status_is(200)->json_is( '/blockers' => {} ) |
300 |
->json_has('/confirmation_token'); |
303 |
->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
|
|
304 |
->json_has( '/confirmation_token'); |
305 |
|
301 |
|
306 |
# Blocked |
302 |
# Blocked |
307 |
%issuingimpossible = ( GNA => 1 ); |
303 |
%issuingimpossible = ( GNA => 1 ); |
308 |
$t->get_ok( |
304 |
$t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id") |
309 |
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
305 |
->status_is(200)->json_is( '/blockers' => { GNA => 1 } )->json_is( '/confirms' => {} ) |
310 |
)->status_is(200)->json_is( '/blockers' => { GNA => 1 } ) |
306 |
->json_is( '/warnings' => {} )->json_has('/confirmation_token'); |
311 |
->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
|
|
312 |
->json_has( '/confirmation_token'); |
313 |
%issuingimpossible = (); |
307 |
%issuingimpossible = (); |
314 |
|
308 |
|
315 |
# Warnings/Info |
309 |
# Warnings/Info |
316 |
%alerts = ( alert1 => "this is an alert" ); |
310 |
%alerts = ( alert1 => "this is an alert" ); |
317 |
%messages = ( message1 => "this is a message" ); |
311 |
%messages = ( message1 => "this is a message" ); |
318 |
$t->get_ok( |
312 |
$t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id") |
319 |
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
313 |
->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} ) |
320 |
)->status_is(200)->json_is( '/blockers' => {} ) |
314 |
->json_is( '/warnings' => { alert1 => "this is an alert", message1 => "this is a message" } ) |
321 |
->json_is( '/confirms' => {} ) |
315 |
->json_has('/confirmation_token'); |
322 |
->json_is( '/warnings' => |
|
|
323 |
{ alert1 => "this is an alert", message1 => "this is a message" } ) |
324 |
->json_has( '/confirmation_token'); |
325 |
%alerts = (); |
316 |
%alerts = (); |
326 |
%messages = (); |
317 |
%messages = (); |
327 |
|
318 |
|
328 |
# Needs confirm |
319 |
# Needs confirm |
329 |
%needsconfirmation = ( confirm1 => 1, confirm2 => 'please' ); |
320 |
%needsconfirmation = ( confirm1 => 1, confirm2 => 'please' ); |
330 |
my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" }); |
321 |
my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } ); |
331 |
$t->get_ok( |
322 |
$t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id") |
332 |
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
323 |
->status_is(200)->json_is( '/blockers' => {} ) |
333 |
)->status_is(200)->json_is( '/blockers' => {} ) |
324 |
->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } )->json_is( '/warnings' => {} ) |
334 |
->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } ) |
325 |
->json_has('/confirmation_token'); |
335 |
->json_is( '/warnings' => {} ) |
|
|
336 |
->json_has( '/confirmation_token'); |
337 |
my $confirmation_token = $t->tx->res->json('/confirmation_token'); |
326 |
my $confirmation_token = $t->tx->res->json('/confirmation_token'); |
338 |
ok( |
327 |
ok( |
339 |
Koha::Token->new->check_jwt( |
328 |
Koha::Token->new->check_jwt( |
340 |
{ |
329 |
{ |
341 |
id => $librarian->id . ":" |
330 |
id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2", |
342 |
. $item1_id |
|
|
343 |
. ":confirm1:confirm2", |
344 |
token => $confirmation_token |
331 |
token => $confirmation_token |
345 |
} |
332 |
} |
346 |
), |
333 |
), |
Lines 352-371
subtest 'get_availability' => sub {
Link Here
|
352 |
plan tests => 18; |
339 |
plan tests => 18; |
353 |
|
340 |
|
354 |
# Available, Not authentication required |
341 |
# Available, Not authentication required |
355 |
$t->get_ok( |
342 |
$t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200) |
356 |
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
343 |
->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
357 |
)->status_is(200)->json_is( '/blockers' => {} ) |
344 |
->json_has('/confirmation_token'); |
358 |
->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
|
|
359 |
->json_has('/confirmation_token'); |
360 |
|
345 |
|
361 |
# Needs confirmation upgrade to blocker |
346 |
# Needs confirmation upgrade to blocker |
362 |
%needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 ); |
347 |
%needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 ); |
363 |
$t->get_ok( |
348 |
$t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200) |
364 |
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
349 |
->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } )->json_is( '/confirms' => {} ) |
365 |
)->status_is(200) |
350 |
->json_is( '/warnings' => {} )->json_has('/confirmation_token'); |
366 |
->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } ) |
|
|
367 |
->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
368 |
->json_has('/confirmation_token'); |
369 |
%needsconfirmation = (); |
351 |
%needsconfirmation = (); |
370 |
|
352 |
|
371 |
# Remove personal information from public endpoint |
353 |
# Remove personal information from public endpoint |
Lines 412-422
subtest 'get_availability' => sub {
Link Here
|
412 |
ressurname => 'private', |
394 |
ressurname => 'private', |
413 |
item_notforloan => 'private' |
395 |
item_notforloan => 'private' |
414 |
); |
396 |
); |
415 |
$t->get_ok( |
397 |
$t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200) |
416 |
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id" |
398 |
->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
417 |
)->status_is(200)->json_is( '/blockers' => {} ) |
399 |
->json_has('/confirmation_token'); |
418 |
->json_is( '/confirms' => {} )->json_is( '/warnings' => {} ) |
|
|
419 |
->json_has('/confirmation_token'); |
420 |
%issuingimpossible = (); |
400 |
%issuingimpossible = (); |
421 |
%alerts = (); |
401 |
%alerts = (); |
422 |
%needsconfirmation = (); |
402 |
%needsconfirmation = (); |
Lines 447-454
subtest 'add checkout' => sub {
Link Here
|
447 |
} |
427 |
} |
448 |
); |
428 |
); |
449 |
my $unauth_password = 'thePassword000'; |
429 |
my $unauth_password = 'thePassword000'; |
450 |
$patron->set_password( |
430 |
$patron->set_password( { password => $unauth_password, skip_validattion => 1 } ); |
451 |
{ password => $unauth_password, skip_validattion => 1 } ); |
|
|
452 |
my $unauth_userid = $patron->userid; |
431 |
my $unauth_userid = $patron->userid; |
453 |
my $patron_id = $patron->borrowernumber; |
432 |
my $patron_id = $patron->borrowernumber; |
454 |
|
433 |
|
Lines 461-467
subtest 'add checkout' => sub {
Link Here
|
461 |
my %needsconfirmation = (); |
440 |
my %needsconfirmation = (); |
462 |
my %alerts = (); |
441 |
my %alerts = (); |
463 |
my %messages = (); |
442 |
my %messages = (); |
464 |
my $mocked_circ = Test::MockModule->new('C4::Circulation'); |
443 |
my $mocked_circ = Test::MockModule->new('C4::Circulation'); |
465 |
$mocked_circ->mock( |
444 |
$mocked_circ->mock( |
466 |
'CanBookBeIssued', |
445 |
'CanBookBeIssued', |
467 |
sub { |
446 |
sub { |
Lines 469-563
subtest 'add checkout' => sub {
Link Here
|
469 |
} |
448 |
} |
470 |
); |
449 |
); |
471 |
|
450 |
|
472 |
$t->post_ok( |
451 |
$t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts" => json => |
473 |
"//$unauth_userid:$unauth_password@/api/v1/checkouts" => json => |
452 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(403)->json_is( |
474 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(403) |
|
|
475 |
->json_is( |
476 |
{ |
453 |
{ |
477 |
error => "Authorization failure. Missing required permission(s).", |
454 |
error => "Authorization failure. Missing required permission(s).", |
478 |
required_permissions => |
455 |
required_permissions => { circulate => "circulate_remaining_permissions" } |
479 |
{ circulate => "circulate_remaining_permissions" } |
|
|
480 |
} |
456 |
} |
481 |
); |
457 |
); |
482 |
|
458 |
|
483 |
$t->post_ok( "//$userid:$password@/api/v1/checkouts" => json => |
459 |
$t->post_ok( "//$userid:$password@/api/v1/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } ) |
484 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(201); |
460 |
->status_is(201); |
485 |
|
461 |
|
486 |
# Needs confirm |
462 |
# Needs confirm |
487 |
%needsconfirmation = ( confirm1 => 1, confirm2 => 'please' ); |
463 |
%needsconfirmation = ( confirm1 => 1, confirm2 => 'please' ); |
488 |
$t->post_ok( |
464 |
$t->post_ok( |
489 |
"//$userid:$password@/api/v1/checkouts" => json => { |
465 |
"//$userid:$password@/api/v1/checkouts" => json => { |
490 |
item_id => $item1_id, |
466 |
item_id => $item1_id, |
491 |
patron_id => $patron_id, |
467 |
patron_id => $patron_id, |
492 |
} |
468 |
} |
493 |
)->status_is(412); |
469 |
)->status_is(412); |
494 |
|
470 |
|
495 |
my $token = Koha::Token->new->generate_jwt( |
471 |
my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } ); |
496 |
{ |
|
|
497 |
id => $librarian->id . ":" |
498 |
. $item1_id |
499 |
. ":confirm1:confirm2" |
500 |
} |
501 |
); |
502 |
$t->post_ok( |
472 |
$t->post_ok( |
503 |
"//$userid:$password@/api/v1/checkouts?confirmation=$token" => json => { |
473 |
"//$userid:$password@/api/v1/checkouts?confirmation=$token" => json => { |
504 |
item_id => $item1_id, |
474 |
item_id => $item1_id, |
505 |
patron_id => $patron_id |
475 |
patron_id => $patron_id |
506 |
} |
476 |
} |
507 |
)->status_is(201)->or(sub { diag $t->tx->res->body }); |
477 |
)->status_is(201)->or( sub { diag $t->tx->res->body } ); |
508 |
%needsconfirmation = (); |
478 |
%needsconfirmation = (); |
509 |
|
479 |
|
510 |
subtest 'public add' => sub { |
480 |
subtest 'public add' => sub { |
511 |
plan tests => 14; |
481 |
plan tests => 14; |
512 |
|
482 |
|
513 |
my $useridp = $patron->userid; |
483 |
my $useridp = $patron->userid; |
514 |
$patron->set_password( |
484 |
$patron->set_password( { password => $password, skip_validation => 1 } ); |
515 |
{ password => $password, skip_validation => 1 } ); |
|
|
516 |
|
485 |
|
517 |
# Feature disabled |
486 |
# Feature disabled |
518 |
t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 0 ); |
487 |
t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 0 ); |
519 |
|
488 |
|
520 |
$t->post_ok( "/api/v1/public/patrons/$patron_id/checkouts" => json => |
|
|
521 |
{ item_id => $item1_id, patron_id => $patron_id } ) |
522 |
->status_is(401)->json_is( |
523 |
{ |
524 |
error => "Authentication failure." |
525 |
} |
526 |
); |
527 |
|
528 |
$t->post_ok( |
489 |
$t->post_ok( |
529 |
"//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" |
490 |
"/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } ) |
530 |
=> json => { item_id => $item1_id, patron_id => $patron_id } ) |
491 |
->status_is(401)->json_is( { error => "Authentication failure." } ); |
531 |
->status_is(405) |
492 |
|
532 |
->json_is( |
493 |
$t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json => |
533 |
{ error => "Feature disabled", error_code => "FEATURE_DISABLED" } ); |
494 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(405) |
|
|
495 |
->json_is( { error => "Feature disabled", error_code => "FEATURE_DISABLED" } ); |
534 |
|
496 |
|
535 |
# Feature enabled |
497 |
# Feature enabled |
536 |
t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 1 ); |
498 |
t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 1 ); |
537 |
|
499 |
|
538 |
$t->post_ok( "/api/v1/public/patrons/$patron_id/checkouts" => json => |
|
|
539 |
{ item_id => $item1_id, patron_id => $patron_id } ) |
540 |
->status_is(401)->json_is( |
541 |
{ |
542 |
error => "Authentication failure." |
543 |
} |
544 |
); |
545 |
|
546 |
$t->post_ok( |
500 |
$t->post_ok( |
547 |
"//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts" |
501 |
"/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } ) |
548 |
=> json => { item_id => $item1_id, patron_id => $patron_id } ) |
502 |
->status_is(401)->json_is( { error => "Authentication failure." } ); |
549 |
->status_is(403)->json_is( |
503 |
|
|
|
504 |
$t->post_ok( "//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts" => json => |
505 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(403)->json_is( |
550 |
{ |
506 |
{ |
551 |
error => |
507 |
error => "Authorization failure. Missing required permission(s).", |
552 |
"Authorization failure. Missing required permission(s).", |
|
|
553 |
required_permissions => undef |
508 |
required_permissions => undef |
554 |
} |
509 |
} |
555 |
); |
510 |
); |
556 |
|
511 |
|
557 |
$t->post_ok( |
512 |
$t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json => |
558 |
"//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" |
513 |
{ item_id => $item1_id, patron_id => $patron_id } )->status_is(201); |
559 |
=> json => { item_id => $item1_id, patron_id => $patron_id } ) |
|
|
560 |
->status_is(201); |
561 |
}; |
514 |
}; |
562 |
|
515 |
|
563 |
$schema->storage->txn_rollback; |
516 |
$schema->storage->txn_rollback; |
564 |
- |
|
|