|
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 |
- |
|
|