Bug 35757: Fix unit tests for external counter registry API

This patch updates the unit tests for the external counter registry API used in the Usage Statistics module. The intent of the tests is to identify any changes in the external response that could lead to errors in Koha. To do this, the tests now compare the list of hash keys returned in the response with the current definition in Koha, and identifies any new fields that need to be added to the definition.

Test plan:
prove t/db_dependent/api/v1/erm_counter_registries.t
prove t/db_dependent/api/v1/erm_sushi_services.t

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Matt Blenkinsop 2024-01-10 10:14:40 +00:00 committed by Katrin Fischer
parent 520ac94242
commit f42741d32c
No known key found for this signature in database
GPG Key ID: 0EF6E2C03357A834
2 changed files with 58 additions and 129 deletions

View File

@ -26,10 +26,14 @@ use t::lib::TestBuilder;
use t::lib::Mocks;
use JSON qw(encode_json);
use Array::Utils qw( array_minus );
use Koha::ERM::EUsage::CounterFiles;
use Koha::Database;
# The Usage statistics module uses an external API to fetch data from the counter registry
# This test is designed to catch any changes in the response that the API provides so that we can react quickly to ensure the module still functions as expected
my $builder = t::lib::TestBuilder->new;
my $t = Test::Mojo->new('Koha::REST::V1');
@ -38,101 +42,20 @@ t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
subtest 'get() tests' => sub {
plan tests => 5;
my $expected_response = [
{
"abbrev" => "EBSCO",
"address" => "EBSCO Information Services\n10 Estes Street\nIpswich, MA 01938",
"address_country" => {
"code" => "US",
"name" => "United States of America"
},
"contact" => {
"email" => 'chadmovalli@ebsco.com',
"form_url" => "",
"person" => "Chad Movalli",
"phone" => ""
},
"content_provider_name" => "EBSCO",
"host_types" => [ { "name" => "Aggregated_Full_Content" } ],
"id" => "b2b2736c-2cb9-48ec-91f4-870336acfb1c",
"name" => "EBSCO Information Services",
"reports" => [
{
"counter_release" => "5",
"report_id" => "TR_J4",
"report_name" => "Title Report - Journal Report 4"
},
{
"counter_release" => "5",
"report_id" => "DR_D2",
"report_name" => "Database Report - Report 2"
},
{
"counter_release" => "5",
"report_id" => "TR_J3",
"report_name" => "Title Report - Journal Report 3"
},
{
"counter_release" => "5",
"report_id" => "DR_D1",
"report_name" => "Database Report - Report 1"
},
{
"counter_release" => "5",
"report_id" => "TR_J2",
"report_name" => "Title Report - Journal Report 2"
},
{
"counter_release" => "5",
"report_id" => "PR",
"report_name" => "Platform Master Report"
},
{
"counter_release" => "5",
"report_id" => "TR_B2",
"report_name" => "Title Report - Book Report 2"
},
{
"counter_release" => "5",
"report_id" => "TR_B3",
"report_name" => "Title Report - Book Report 3"
},
{
"counter_release" => "5",
"report_id" => "TR",
"report_name" => "Title Master Report"
},
{
"counter_release" => "5",
"report_id" => "TR_B1",
"report_name" => "Title Report - Book Report 1"
},
{
"counter_release" => "5",
"report_id" => "PR_P1",
"report_name" => "Platform Report - Report 1"
},
{
"counter_release" => "5",
"report_id" => "TR_J1",
"report_name" => "Title Report - Journal Report 1"
},
{
"counter_release" => "5",
"report_id" => "DR",
"report_name" => "Database Master Report"
}
],
"sushi_services" => [
{
"counter_release" => "5",
"url" =>
"https:\/\/registry.projectcounter.org\/api\/v1\/sushi-service\/b94bc981-fa16-4bf6-ba5f-6c113f7ffa0b\/"
}
],
"website" => "https:\/\/www.ebsco.com\/"
}
];
my @expected_fields = (
"abbrev",
"address",
"address_country",
"audited",
"contact",
"content_provider_name",
"host_types",
"id",
"name",
"reports",
"sushi_services",
"website",
);
my $librarian = $builder->build_object(
{
@ -161,5 +84,10 @@ subtest 'get() tests' => sub {
my $q = encode_json( { "name" => "EBSCO Information Services" } );
my $counter_registry =
$t->get_ok("//$userid:$password@/api/v1/erm/counter_registry?q=$q")->status_is(200)->tx->res->json;
is_deeply( $counter_registry, $expected_response );
my $registry_to_check = @$counter_registry[0];
my @response_fields = map { $_ } keys %$registry_to_check;
my @new_fields_in_response = array_minus( @response_fields, @expected_fields );
is( scalar(@new_fields_in_response), 0, 'The response fields match the expected fields' );
};

View File

@ -26,6 +26,7 @@ use t::lib::TestBuilder;
use t::lib::Mocks;
use JSON qw(encode_json);
use Array::Utils qw( array_minus );
use Koha::ERM::EUsage::CounterFiles;
use Koha::Database;
@ -35,42 +36,38 @@ my $builder = t::lib::TestBuilder->new;
my $t = Test::Mojo->new('Koha::REST::V1');
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
# The Usage statistics module uses an external API to fetch data from the counter registry
# This test is designed to catch any changes in the response that the API provides so that we can react quickly to ensure the module still functions as expected
subtest 'get() tests' => sub {
plan tests => 5;
my $service_url = "https://registry.projectcounter.org/api/v1/sushi-service/b94bc981-fa16-4bf6-ba5f-6c113f7ffa0b/";
my $expected_response = {
"api_key_info" => "",
"api_key_required" => 0,
"contact" => {
"email" => 'chadmovalli@ebsco.com',
"form_url" => "",
"person" => "Chad Movalli",
"phone" => ""
},
"counter_release" => "5",
"credentials_auto_expire" => 0,
"credentials_auto_expire_info" => "",
"customer_id_info" => "This is your EBSCOhost Customer ID",
"customizations_in_place" => 0,
"customizations_info" => "",
"data_host" =>
"https:\/\/registry.projectcounter.org\/api\/v1\/usage-data-host\/72a35413-6fcd-44f2-8bce-0c7b2373e33f\/",
"id" => "b94bc981-fa16-4bf6-ba5f-6c113f7ffa0b",
"ip_address_authorization" => 0,
"ip_address_authorization_info" => "",
"notification_count" => 1,
"notifications_url" =>
"https:\/\/registry.projectcounter.org\/api\/v1\/sushi-service\/b94bc981-fa16-4bf6-ba5f-6c113f7ffa0b\/notification\/",
"platform_attr_required" => 0,
"platform_specific_info" => "",
"request_volume_limits_applied" => 0,
"request_volume_limits_info" => "",
"requestor_id_info" =>
"Customers generate their Requestor ID in EBSCOAdmin on the SUSHI Authentication tab within the COUNTER R5 Reports section.",
"requestor_id_required" => 1,
"url" => "https:\/\/sushi.ebscohost.com\/R5"
};
my @expected_fields = (
"api_key_info",
"api_key_required",
"contact",
"counter_release",
"credentials_auto_expire",
"credentials_auto_expire_info",
"customer_id_info",
"customizations_in_place",
"customizations_info",
"data_host",
"id",
"ip_address_authorization",
"ip_address_authorization_info",
"migrations",
"notification_count",
"notifications_url",
"platform_attr_required",
"platform_specific_info",
"request_volume_limits_applied",
"request_volume_limits_info",
"requestor_id_info",
"requestor_id_required",
"url",
);
my $librarian = $builder->build_object(
{
@ -98,5 +95,9 @@ subtest 'get() tests' => sub {
# Authorised access test
my $q = encode_json( { "url" => $service_url } );
my $sushi_service = $t->get_ok("//$userid:$password@/api/v1/erm/sushi_service?q=$q")->status_is(200)->tx->res->json;
is_deeply( $sushi_service, $expected_response );
my @response_fields = map { $_ } keys %$sushi_service;
my @new_fields_in_response = array_minus( @response_fields, @expected_fields );
is(scalar(@new_fields_in_response), 0, 'The response fields match the expected fields');
};