Bug 36641: Unit tests for effective=0

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Martin Renvoize 2024-07-12 10:16:08 +01:00 committed by Katrin Fischer
parent e9eabc0a66
commit 0990a6d66b
Signed by: kfischer
GPG key ID: 0EF6E2C03357A834

View file

@ -33,7 +33,10 @@ my $t = Test::Mojo->new('Koha::REST::V1');
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
subtest 'list_rules() tests' => sub {
plan tests => 32;
my $expected_rules = [ keys %{ Koha::CirculationRules->rule_kinds } ];
plan tests => ( scalar( @{$expected_rules} ) * 2 ) + 36;
$schema->storage->txn_begin;
@ -62,9 +65,18 @@ subtest 'list_rules() tests' => sub {
$patron->set_password( { password => $password, skip_validation => 1 } );
my $unauth_userid = $patron->userid;
note("Effective rules by default");
## Authorized user tests
# No circulation_rules, so empty hash should be returned
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)->json_is( '/0' => {} );
# No circulation_rules, so all keys in the returned hash should be undefined
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200);
# Extract and decode the JSON response
my $json = $t->tx->res->json;
note("No rules defined");
foreach my $key ( @{$expected_rules} ) {
ok( exists $json->[0]->{$key}, "Key '$key' exists in the JSON response" );
is( $json->[0]->{$key}, undef, "'$key' is undefined" );
}
# One rule created, should get returned
ok(
@ -80,8 +92,10 @@ subtest 'list_rules() tests' => sub {
'Given I added an issuing rule branchcode => undef,' . ' categorycode => undef, itemtype => undef,'
);
note("One default rule defined");
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)
->json_is( '/0' => { 'fine' => 2 }, "Our single rule is returned" );
->json_is( '/0/fine' => 2, "Default fine rule is returned as expected" )
->json_is( '/0/finedays' => undef, "Rule finedays is undefined as expected" );
# Two circulation_rules created, they should both be returned
ok(
@ -97,13 +111,10 @@ subtest 'list_rules() tests' => sub {
'Given I added another issuing rule branchcode => undef,' . ' categorycode => undef, itemtype => undef,'
);
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)->json_is(
'/0' => {
fine => 2,
finedays => 5,
},
"Two default rules are returned"
);
note("Two default rules defined");
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)
->json_is( '/0/fine' => 2, "Default fine rule is returned as expected" )
->json_is( '/0/finedays' => 5, "Default finedays rule is returned as expected" );
# Specificity works, three circulation_rules stored, one branchcode specific
ok(
@ -119,21 +130,17 @@ subtest 'list_rules() tests' => sub {
"Given I added an issuing rule branchcode => $branchcode," . ' categorycode => undef, itemtype => undef,'
);
$t->get_ok("//$userid:$password@/api/v1/circulation_rules?library_id=$branchcode")->status_is(200)->json_is(
'/0' => {
fine => 4,
finedays => 5,
},
"Branch specific rule is returned when library is added to request query"
);
note("Two default rules and one branch rule defined");
$t->get_ok("//$userid:$password@/api/v1/circulation_rules?library_id=$branchcode")->status_is(200)
->json_is( '/0/fine' => 4, "Branch specific fine rule is returned when library is added to request query" )
->json_is(
'/0/finedays' => 5,
"Default finedays rule is returned when library is added to request query but no branch specific rule is defined"
);
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)->json_is(
'/0' => {
fine => 2,
finedays => 5,
},
"Default rules are returned when no library is added to request query"
);
$t->get_ok("//$userid:$password@/api/v1/circulation_rules")->status_is(200)
->json_is( '/0/fine' => 2, "Defaul fine rule returned when no library is added to request query" )
->json_is( '/0/finedays' => 5, "Default finedays rule returned when no library is added to request query" );
# Warn on unsupported query parameter
$t->get_ok("//$userid:$password@/api/v1/circulation_rules?rules_blah=blah")->status_is(400)
@ -202,5 +209,71 @@ subtest 'list_rules() tests' => sub {
# Unauthorized access
$t->get_ok("//$unauth_userid:$password@/api/v1/circulation_rules")->status_is(403);
subtest 'effective=false tests' => sub {
my $count = scalar( @{$expected_rules} );
plan tests => ( $count * 2 ) + $count + 10;
# All rules
$t->get_ok("//$userid:$password@/api/v1/circulation_rules?effective=0")->status_is(200);
# Extract and decode the JSON response
my $json = $t->tx->res->json;
# Check if the response is an array
is( ref $json, 'ARRAY', 'Response is an array' );
is( scalar( @{$json} ), 2, 'Response contains 2 rule sets' );
# Iterate over each hash in the array
my $index = 0;
foreach my $hash ( @{$json} ) {
my $pointer = Mojo::JSON::Pointer->new($hash);
# First rule set should march default, default, default
if ( $index == 0 ) {
ok( $pointer->get('/branchcode') eq "*"
&& $pointer->get('/itemtype') eq '*'
&& $pointer->get('/categorycode') eq '*', "Default rules returned first" );
}
# Iterate over the list of expected keys for each hash
foreach my $key ( @{$expected_rules} ) {
ok( $pointer->contains( '/' . $key ), "Hash contains key '$key'" );
}
$index++;
}
# Filter on library
$t->get_ok("//$userid:$password@/api/v1/circulation_rules?effective=0&library_id=$branchcode")->status_is(200);
# Extract and decode the JSON response
$json = $t->tx->res->json;
# Check if the response is an array
is( ref $json, 'ARRAY', 'Response is an array' );
is( scalar( @{$json} ), 1, 'Filtered response contains 1 rule set' );
$index = 0;
foreach my $hash ( @{$json} ) {
my $pointer = Mojo::JSON::Pointer->new($hash);
# First (and only) rule set should match branchcode, default, default.
if ( $index == 0 ) {
ok( $pointer->get('/branchcode') eq $branchcode
&& $pointer->get('/itemtype') eq '*'
&& $pointer->get('/categorycode') eq '*', "Branchcode rule set returned when filtered" );
}
# Iterate over the list of expected keys for each hash
foreach my $key ( @{$expected_rules} ) {
ok( $pointer->contains( '/' . $key ), "Hash contains key '$key'" );
}
$index++;
}
};
$schema->storage->txn_rollback;
};