From b30c9c8b3248d4dff781788e22f4b6db123453dc Mon Sep 17 00:00:00 2001 From: Matt Blenkinsop Date: Wed, 10 Jan 2024 10:14:40 +0000 Subject: [PATCH] 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 --- .../api/v1/erm_counter_registries.t | 120 ++++-------------- t/db_dependent/api/v1/erm_sushi_services.t | 67 +++++----- 2 files changed, 58 insertions(+), 129 deletions(-) diff --git a/t/db_dependent/api/v1/erm_counter_registries.t b/t/db_dependent/api/v1/erm_counter_registries.t index def1b8c8b0..e80f9e8dcf 100755 --- a/t/db_dependent/api/v1/erm_counter_registries.t +++ b/t/db_dependent/api/v1/erm_counter_registries.t @@ -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' ); }; diff --git a/t/db_dependent/api/v1/erm_sushi_services.t b/t/db_dependent/api/v1/erm_sushi_services.t index 73d46241d8..0da48fa6e3 100755 --- a/t/db_dependent/api/v1/erm_sushi_services.t +++ b/t/db_dependent/api/v1/erm_sushi_services.t @@ -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'); }; -- 2.30.2