Lines 20-26
Link Here
|
20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
21 |
|
21 |
|
22 |
use Test::NoWarnings; |
22 |
use Test::NoWarnings; |
23 |
use Test::More tests => 5; |
23 |
use Test::More tests => 9; |
24 |
use Test::Mojo; |
24 |
use Test::Mojo; |
25 |
|
25 |
|
26 |
use t::lib::TestBuilder; |
26 |
use t::lib::TestBuilder; |
Lines 41-47
my $builder = t::lib::TestBuilder->new;
Link Here
|
41 |
my $t = Test::Mojo->new('Koha::REST::V1'); |
41 |
my $t = Test::Mojo->new('Koha::REST::V1'); |
42 |
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 ); |
42 |
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 ); |
43 |
|
43 |
|
44 |
my $sushi_response_file_TR_J1 = dirname(__FILE__) . "/../../data/erm/eusage/TR_J1.json"; |
44 |
my $sushi_response_file_TR_J1 = dirname(__FILE__) . "/../../data/erm/eusage/COUNTER_5/TR_J1.json"; |
45 |
my $sushi_counter_5_response_TR_J1 = decode_json( read_file($sushi_response_file_TR_J1) ); |
45 |
my $sushi_counter_5_response_TR_J1 = decode_json( read_file($sushi_response_file_TR_J1) ); |
46 |
my $report_items = $sushi_counter_5_response_TR_J1->{Report_Items}; |
46 |
my $report_items = $sushi_counter_5_response_TR_J1->{Report_Items}; |
47 |
my $sushi_counter_TR_J1 = Koha::ERM::EUsage::SushiCounter->new( { response => $sushi_counter_5_response_TR_J1 } ); |
47 |
my $sushi_counter_TR_J1 = Koha::ERM::EUsage::SushiCounter->new( { response => $sushi_counter_5_response_TR_J1 } ); |
Lines 404-406
subtest "provider_rollup_report" => sub {
Link Here
|
404 |
|
404 |
|
405 |
$schema->storage->txn_rollback; |
405 |
$schema->storage->txn_rollback; |
406 |
}; |
406 |
}; |
407 |
- |
407 |
|
|
|
408 |
my $sushi_response_file_51_TR_J1 = dirname(__FILE__) . "/../../data/erm/eusage/COUNTER_5.1/TR_J1.json"; |
409 |
my $sushi_counter_51_response_TR_J1 = decode_json( read_file($sushi_response_file_51_TR_J1) ); |
410 |
my $sushi_counter_51_TR_J1 = Koha::ERM::EUsage::SushiCounter->new( { response => $sushi_counter_51_response_TR_J1 } ); |
411 |
|
412 |
subtest "5.1 monthly_report" => sub { |
413 |
plan tests => 17; |
414 |
|
415 |
$schema->storage->txn_begin; |
416 |
|
417 |
my $librarian = $builder->build_object( |
418 |
{ |
419 |
class => 'Koha::Patrons', |
420 |
value => { flags => 2**28 } |
421 |
} |
422 |
); |
423 |
my $password = 'thePassword123'; |
424 |
$librarian->set_password( { password => $password, skip_validation => 1 } ); |
425 |
my $userid = $librarian->userid; |
426 |
t::lib::Mocks::mock_userenv( { number => $userid } ); |
427 |
|
428 |
my $patron = $builder->build_object( |
429 |
{ |
430 |
class => 'Koha::Patrons', |
431 |
value => { flags => 0 } |
432 |
} |
433 |
); |
434 |
|
435 |
$patron->set_password( { password => $password, skip_validation => 1 } ); |
436 |
my $unauth_userid = $patron->userid; |
437 |
|
438 |
# Run a harvest to populate the database with data |
439 |
my $usage_data_provider = $builder->build_object( { class => 'Koha::ERM::EUsage::UsageDataProviders' } ); |
440 |
my $counter_file = $sushi_counter_51_TR_J1->get_COUNTER_from_SUSHI; |
441 |
|
442 |
$usage_data_provider->counter_files( |
443 |
[ |
444 |
{ |
445 |
usage_data_provider_id => $usage_data_provider->erm_usage_data_provider_id, |
446 |
file_content => $counter_file, |
447 |
filename => "Test_TR_J1", |
448 |
} |
449 |
] |
450 |
); |
451 |
|
452 |
# Unauthorized access |
453 |
$t->get_ok("//$unauth_userid:$password@/api/v1/erm/eUsage/monthly_report/title")->status_is(403); |
454 |
|
455 |
# Authorised access |
456 |
my $query_string_with_no_results = 'q=[ |
457 |
{ |
458 |
"erm_usage_muses.year":2023, |
459 |
"erm_usage_muses.report_type":"TR_J1", |
460 |
"erm_usage_muses.month":[1,2,3,4,5,6,7,8,9,10,11,12], |
461 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
462 |
} |
463 |
]'; |
464 |
|
465 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/monthly_report/title?$query_string_with_no_results" => |
466 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200)->json_is( [] ); |
467 |
|
468 |
my $query_string = 'q=[ |
469 |
{ |
470 |
"erm_usage_muses.year":2022, |
471 |
"erm_usage_muses.report_type":"TR_J1", |
472 |
"erm_usage_muses.month":[6], |
473 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
474 |
} |
475 |
]'; |
476 |
my $expected_results1 = 2; # One title, with one row for each metric type |
477 |
|
478 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/monthly_report/title?$query_string" => |
479 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200) |
480 |
->json_has( '/' . ( $expected_results1 - 2 ) . '/title_id' ) |
481 |
->json_has( '/' . ( $expected_results1 - 1 ) . '/title_id' ) |
482 |
->json_hasnt( '/' . ($expected_results1) . '/title_id' ); |
483 |
|
484 |
my $query_string_with_multiple_years = 'q=[ |
485 |
{ |
486 |
"erm_usage_muses.year":2022, |
487 |
"erm_usage_muses.report_type":"TR_J1", |
488 |
"erm_usage_muses.month":[1,6,7,8], |
489 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
490 |
}, |
491 |
{ |
492 |
"erm_usage_muses.year":2021, |
493 |
"erm_usage_muses.report_type":"TR_J1", |
494 |
"erm_usage_muses.month":[1,2,3], |
495 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
496 |
} |
497 |
]'; |
498 |
my $expected_results2 = 4; # Two titles this time |
499 |
|
500 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/monthly_report/title?$query_string_with_multiple_years" => |
501 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200) |
502 |
->json_has( '/' . ( $expected_results2 - 4 ) . '/title_id' ) |
503 |
->json_has( '/' . ( $expected_results2 - 3 ) . '/title_id' ) |
504 |
->json_has( '/' . ( $expected_results2 - 2 ) . '/title_id' ) |
505 |
->json_has( '/' . ( $expected_results2 - 1 ) . '/title_id' ) |
506 |
->json_hasnt( '/' . ($expected_results2) . '/title_id' ); |
507 |
|
508 |
$schema->storage->txn_rollback; |
509 |
}; |
510 |
|
511 |
subtest "5.1 yearly_report" => sub { |
512 |
plan tests => 17; |
513 |
|
514 |
$schema->storage->txn_begin; |
515 |
|
516 |
my $librarian = $builder->build_object( |
517 |
{ |
518 |
class => 'Koha::Patrons', |
519 |
value => { flags => 2**28 } |
520 |
} |
521 |
); |
522 |
my $password = 'thePassword123'; |
523 |
$librarian->set_password( { password => $password, skip_validation => 1 } ); |
524 |
my $userid = $librarian->userid; |
525 |
t::lib::Mocks::mock_userenv( { number => $userid } ); |
526 |
|
527 |
my $patron = $builder->build_object( |
528 |
{ |
529 |
class => 'Koha::Patrons', |
530 |
value => { flags => 0 } |
531 |
} |
532 |
); |
533 |
|
534 |
$patron->set_password( { password => $password, skip_validation => 1 } ); |
535 |
my $unauth_userid = $patron->userid; |
536 |
|
537 |
# Run a harvest to populate the database with data |
538 |
my $usage_data_provider = $builder->build_object( { class => 'Koha::ERM::EUsage::UsageDataProviders' } ); |
539 |
my $counter_file = $sushi_counter_51_TR_J1->get_COUNTER_from_SUSHI; |
540 |
|
541 |
$usage_data_provider->counter_files( |
542 |
[ |
543 |
{ |
544 |
usage_data_provider_id => $usage_data_provider->erm_usage_data_provider_id, |
545 |
file_content => $counter_file, |
546 |
filename => "Test_TR_J1", |
547 |
} |
548 |
] |
549 |
); |
550 |
|
551 |
# Unauthorized access |
552 |
$t->get_ok("//$unauth_userid:$password@/api/v1/erm/eUsage/yearly_report/title")->status_is(403); |
553 |
|
554 |
# Authorised access |
555 |
my $query_string_with_no_results = 'q= |
556 |
{ |
557 |
"erm_usage_yuses.year":[2023], |
558 |
"erm_usage_yuses.report_type":"TR_J1", |
559 |
"erm_usage_yuses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
560 |
} |
561 |
'; |
562 |
|
563 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/yearly_report/title?$query_string_with_no_results" => |
564 |
{ 'x-koha-embed' => 'erm_usage_yuses' } )->status_is(200)->json_is( [] ); |
565 |
|
566 |
my $query_string = 'q= |
567 |
{ |
568 |
"erm_usage_yuses.year":[2022], |
569 |
"erm_usage_yuses.report_type":"TR_J1", |
570 |
"erm_usage_yuses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
571 |
} |
572 |
'; |
573 |
my $expected_results1 = 4; # Two titles, with one row for each metric type |
574 |
|
575 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/yearly_report/title?$query_string" => |
576 |
{ 'x-koha-embed' => 'erm_usage_yuses' } )->status_is(200) |
577 |
->json_has( '/' . ( $expected_results1 - 2 ) . '/title_id' ) |
578 |
->json_has( '/' . ( $expected_results1 - 1 ) . '/title_id' ) |
579 |
->json_hasnt( '/' . ($expected_results1) . '/title_id' ); |
580 |
|
581 |
my $query_string_with_multiple_years = 'q= |
582 |
{ |
583 |
"erm_usage_yuses.year":[2021,2022], |
584 |
"erm_usage_yuses.report_type":"TR_J1", |
585 |
"erm_usage_yuses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
586 |
} |
587 |
'; |
588 |
my $expected_results2 = 4; # Two titles this time |
589 |
|
590 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/yearly_report/title?$query_string_with_multiple_years" => |
591 |
{ 'x-koha-embed' => 'erm_usage_yuses' } )->status_is(200) |
592 |
->json_has( '/' . ( $expected_results2 - 4 ) . '/title_id' ) |
593 |
->json_has( '/' . ( $expected_results2 - 3 ) . '/title_id' ) |
594 |
->json_has( '/' . ( $expected_results2 - 2 ) . '/title_id' ) |
595 |
->json_has( '/' . ( $expected_results2 - 1 ) . '/title_id' ) |
596 |
->json_hasnt( '/' . ($expected_results2) . '/title_id' ); |
597 |
|
598 |
$schema->storage->txn_rollback; |
599 |
}; |
600 |
|
601 |
subtest "5.1 metric_types_report" => sub { |
602 |
plan tests => 14; |
603 |
|
604 |
$schema->storage->txn_begin; |
605 |
|
606 |
my $librarian = $builder->build_object( |
607 |
{ |
608 |
class => 'Koha::Patrons', |
609 |
value => { flags => 2**28 } |
610 |
} |
611 |
); |
612 |
my $password = 'thePassword123'; |
613 |
$librarian->set_password( { password => $password, skip_validation => 1 } ); |
614 |
my $userid = $librarian->userid; |
615 |
t::lib::Mocks::mock_userenv( { number => $userid } ); |
616 |
|
617 |
my $patron = $builder->build_object( |
618 |
{ |
619 |
class => 'Koha::Patrons', |
620 |
value => { flags => 0 } |
621 |
} |
622 |
); |
623 |
|
624 |
$patron->set_password( { password => $password, skip_validation => 1 } ); |
625 |
my $unauth_userid = $patron->userid; |
626 |
|
627 |
# Run a harvest to populate the database with data |
628 |
my $usage_data_provider = $builder->build_object( { class => 'Koha::ERM::EUsage::UsageDataProviders' } ); |
629 |
my $counter_file = $sushi_counter_51_TR_J1->get_COUNTER_from_SUSHI; |
630 |
|
631 |
$usage_data_provider->counter_files( |
632 |
[ |
633 |
{ |
634 |
usage_data_provider_id => $usage_data_provider->erm_usage_data_provider_id, |
635 |
file_content => $counter_file, |
636 |
filename => "Test_TR_J1", |
637 |
} |
638 |
] |
639 |
); |
640 |
|
641 |
# Unauthorized access |
642 |
$t->get_ok("//$unauth_userid:$password@/api/v1/erm/eUsage/metric_types_report/title")->status_is(403); |
643 |
|
644 |
# Authorised access |
645 |
my $query_string_with_no_results = 'q=[ |
646 |
{ |
647 |
"erm_usage_muses.year":2023, |
648 |
"erm_usage_muses.report_type":"TR_J1", |
649 |
"erm_usage_muses.month":[1,2,3,4,5,6,7,8,9,10,11,12], |
650 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
651 |
} |
652 |
]'; |
653 |
|
654 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/metric_types_report/title?$query_string_with_no_results" => |
655 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200)->json_is( [] ); |
656 |
|
657 |
my $query_string = 'q=[ |
658 |
{ |
659 |
"erm_usage_muses.year":2022, |
660 |
"erm_usage_muses.report_type":"TR_J1", |
661 |
"erm_usage_muses.month":[6], |
662 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
663 |
} |
664 |
]'; |
665 |
my $expected_results1 = 1; # One title |
666 |
|
667 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/metric_types_report/title?$query_string" => |
668 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200) |
669 |
->json_has( '/' . ( $expected_results1 - 1 ) . '/title_id' ) |
670 |
->json_hasnt( '/' . ($expected_results1) . '/title_id' ); |
671 |
|
672 |
my $query_string_with_multiple_years = 'q=[ |
673 |
{ |
674 |
"erm_usage_muses.year":2022, |
675 |
"erm_usage_muses.report_type":"TR_J1", |
676 |
"erm_usage_muses.month":[1,2,3,6,7,8], |
677 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
678 |
}, |
679 |
{ |
680 |
"erm_usage_muses.year":2021, |
681 |
"erm_usage_muses.report_type":"TR_J1", |
682 |
"erm_usage_muses.month":[1,2,3], |
683 |
"erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
684 |
} |
685 |
]'; |
686 |
my $expected_results2 = 2; # Two titles this time |
687 |
|
688 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/metric_types_report/title?$query_string_with_multiple_years" => |
689 |
{ 'x-koha-embed' => 'erm_usage_muses' } )->status_is(200) |
690 |
->json_has( '/' . ( $expected_results2 - 2 ) . '/title_id' ) |
691 |
->json_has( '/' . ( $expected_results2 - 1 ) . '/title_id' ) |
692 |
->json_hasnt( '/' . ($expected_results2) . '/title_id' ); |
693 |
|
694 |
$schema->storage->txn_rollback; |
695 |
}; |
696 |
|
697 |
subtest "5.1 provider_rollup_report" => sub { |
698 |
plan tests => 9; |
699 |
|
700 |
$schema->storage->txn_begin; |
701 |
|
702 |
my $librarian = $builder->build_object( |
703 |
{ |
704 |
class => 'Koha::Patrons', |
705 |
value => { flags => 2**28 } |
706 |
} |
707 |
); |
708 |
my $password = 'thePassword123'; |
709 |
$librarian->set_password( { password => $password, skip_validation => 1 } ); |
710 |
my $userid = $librarian->userid; |
711 |
t::lib::Mocks::mock_userenv( { number => $userid } ); |
712 |
|
713 |
my $patron = $builder->build_object( |
714 |
{ |
715 |
class => 'Koha::Patrons', |
716 |
value => { flags => 0 } |
717 |
} |
718 |
); |
719 |
|
720 |
$patron->set_password( { password => $password, skip_validation => 1 } ); |
721 |
my $unauth_userid = $patron->userid; |
722 |
|
723 |
# Run a harvest to populate the database with data |
724 |
my $usage_data_provider = $builder->build_object( { class => 'Koha::ERM::EUsage::UsageDataProviders' } ); |
725 |
my $counter_file = $sushi_counter_51_TR_J1->get_COUNTER_from_SUSHI; |
726 |
|
727 |
$usage_data_provider->counter_files( |
728 |
[ |
729 |
{ |
730 |
usage_data_provider_id => $usage_data_provider->erm_usage_data_provider_id, |
731 |
file_content => $counter_file, |
732 |
filename => "Test_TR_J1", |
733 |
} |
734 |
] |
735 |
); |
736 |
|
737 |
# Unauthorized access |
738 |
$t->get_ok("//$unauth_userid:$password@/api/v1/erm/eUsage/provider_rollup_report/title")->status_is(403); |
739 |
|
740 |
# Authorised access |
741 |
my $query_string_with_no_results = 'q=[ |
742 |
{ |
743 |
"erm_usage_titles.erm_usage_muses.year":2023, |
744 |
"erm_usage_titles.erm_usage_muses.report_type":"TR_J1", |
745 |
"erm_usage_titles.erm_usage_muses.month":[1,2,3,4,5,6,7,8,9,10,11,12], |
746 |
"erm_usage_titles.erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
747 |
} |
748 |
]'; |
749 |
|
750 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/provider_rollup_report/title?$query_string_with_no_results" => |
751 |
{ 'x-koha-embed' => 'erm_usage_titles.erm_usage_muses' } )->status_is(200)->json_is( [] ); |
752 |
|
753 |
my $query_string = 'q=[ |
754 |
{ |
755 |
"erm_usage_titles.erm_usage_muses.year":2022, |
756 |
"erm_usage_titles.erm_usage_muses.report_type":"TR_J1", |
757 |
"erm_usage_titles.erm_usage_muses.month":[1,6], |
758 |
"erm_usage_titles.erm_usage_muses.metric_type":["Total_Item_Requests","Unique_Item_Requests"] |
759 |
} |
760 |
]'; |
761 |
my $expected_results1 = 2; # One provider repeated once for each metric type |
762 |
|
763 |
$t->get_ok( "//$userid:$password@/api/v1/erm/eUsage/provider_rollup_report/title?$query_string" => |
764 |
{ 'x-koha-embed' => 'erm_usage_titles.erm_usage_muses' } )->status_is(200) |
765 |
->json_is( '/' . ( $expected_results1 - 2 ) . '/provider_rollup_total' => 528, 'Total is correct' ) |
766 |
->json_is( '/' . ( $expected_results1 - 1 ) . '/provider_rollup_total' => 228, 'Total is correct' ); |
767 |
|
768 |
$schema->storage->txn_rollback; |
769 |
}; |