Koha/t/db_dependent/Illrequest/Config.t
Jonathan Druart 97307b881d
Bug 34842: Fix Illrequest/Config.t if DB upgraded twice
Not sure this is correct, but I think it is!

Signed-off-by: Pedro Amorim <pedro.amorim@ptfs-europe.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2023-10-03 08:51:12 -04:00

491 lines
17 KiB
Perl
Executable file

#!/usr/bin/perl
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use Koha::Database;
use t::lib::Mocks;
use t::lib::TestBuilder;
use Test::MockObject;
use Test::Exception;
use Test::More tests => 5;
my $schema = Koha::Database->new->schema;
my $builder = t::lib::TestBuilder->new;
use_ok('Koha::Illrequest::Config');
my $base_limits = {
branch => { CPL => { count => 1, method => 'annual' } },
brw_cat => { A => { count => -1, method => 'active' } },
default => { count => 10, method => 'annual' },
};
my $base_censorship = { censor_notes_staff => 1, censor_reply_date => 1 };
subtest 'Basics' => sub {
plan tests => 19;
$schema->storage->txn_begin;
t::lib::Mocks::mock_config("interlibrary_loans", {});
t::lib::Mocks::mock_preference('ILLPartnerCode', undef);
my $config = Koha::Illrequest::Config->new;
isa_ok($config, "Koha::Illrequest::Config",
"Correctly create and load a config object.");
# backend:
is($config->backend, undef, "backend: Undefined backend is undefined.");
is($config->backend("Mock"), "Mock", "backend: setter works.");
is($config->backend, "Mock", "backend: setter is persistent.");
# backend_dir:
is($config->backend_dir, undef, "backend_dir: Undefined backend_dir is undefined.");
is($config->backend_dir("/tmp/"), "/tmp/", "backend_dir: setter works.");
is($config->backend_dir, "/tmp/", "backend_dir: setter is persistent.");
# partner_code:
is($config->partner_code, 'IL', "partner_code: Undefined partner_code fallback to 'IL'.");
is($config->partner_code("ILTST"), "ILTST", "partner_code: setter works.");
is($config->partner_code, "ILTST", "partner_code: setter is persistent.");
# limits:
is_deeply($config->limits, {}, "limits: Undefined limits is empty hash.");
is_deeply($config->limits($base_limits), $base_limits, "limits: setter works.");
is_deeply($config->limits, $base_limits, "limits: setter is persistent.");
# censorship:
is_deeply($config->censorship, { censor_notes_staff => 0, censor_reply_date => 0 },
"censorship: Undefined censorship is default values.");
is_deeply($config->censorship($base_censorship), $base_censorship, "censorship: setter works.");
is_deeply($config->censorship, $base_censorship, "censorship: setter is persistent.");
# getLimitRules
dies_ok( sub { $config->getLimitRules("FOO") }, "getLimitRules: die if not correct type.");
is_deeply($config->getLimitRules("brw_cat"), {
A => { count => -1, method => 'active' },
default => { count => 10, method => 'annual' },
}, "getLimitRules: fetch brw_cat limits.");
is_deeply($config->getLimitRules("branch"), {
CPL => { count => 1, method => 'annual' },
default => { count => 10, method => 'annual' },
}, "getLimitRules: fetch brw_cat limits.");
$schema->storage->txn_rollback;
};
# _load_unit_config:
subtest '_load_unit_config' => sub {
plan tests => 10;
$schema->storage->txn_begin;
my $config = Koha::Illrequest::Config->new;
dies_ok(
sub { Koha::Illrequest::Config::_load_unit_config({
id => 'durineadu', type => 'baz'
}) },
"_load_unit_config: die if ID is not default, and type is not branch or brw_cat."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => {}, id => 'default', config => {}, test => 1
}), {}, "_load_unit_config: invocation without id returns unmodified config."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { api_key => 'foo', api_auth => 'bar' },
id => "CPL", type => 'branch', config => {}
}),
{ credentials => { api_keys => { CPL => { api_key => 'foo', api_auth => 'bar' } } } },
"_load_unit_config: add auth values."
);
# Populate request_limits
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { request_limit => [ 'heelo', 1234 ] },
id => "CPL", type => 'branch', config => {}
}), {}, "_load_unit_config: invalid request_limit structure."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { request_limit => { method => 'eudiren', count => '-5465' } },
id => "CPL", type => 'branch', config => {}
}), {}, "_load_unit_config: invalid method & count."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { request_limit => { method => 'annual', count => 6 } },
id => "default", config => {}
}),
{ limits => { default => { method => 'annual', count => 6 } } },
"_load_unit_config: correct default request_limits."
);
# Populate prefix
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { prefix => 'Foo-ill' },
id => "default", config => {}
}),
{ prefixes => { default => 'Foo-ill' } },
"_load_unit_config: correct default prefix."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { prefix => 'Foo-ill' },
id => "A", config => {}, type => 'brw_cat'
}),
{ prefixes => { brw_cat => { A => 'Foo-ill' } } },
"_load_unit_config: correct brw_cat prefix."
);
# Populate digital_recipient
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { digital_recipient => 'borrower' },
id => "default", config => {}
}),
{ digital_recipients => { default => 'borrower' } },
"_load_unit_config: correct default digital_recipient."
);
is_deeply(
Koha::Illrequest::Config::_load_unit_config({
unit => { digital_recipient => 'branch' },
id => "A", config => {}, type => 'brw_cat'
}),
{ digital_recipients => { brw_cat => { A => 'branch' } } },
"_load_unit_config: correct brw_cat digital_recipient."
);
$schema->storage->txn_rollback;
};
# _load_configuration:
# We have already tested _load_unit_config, so we are reasonably confident
# that the per-branch, per-borrower_category & default sections parsing is
# good.
#
# Now we need to ensure that Arrays & Hashes are handled correctly, that
# censorship & ill partners are loaded correctly and that the backend
# directory is set correctly.
subtest '_load_configuration' => sub {
plan tests => 10;
$schema->storage->txn_begin;
my $config = Koha::Illrequest::Config->new;
t::lib::Mocks::mock_preference('ILLPartnerCode', 'IL');
# Return basic configuration
is_deeply(
Koha::Illrequest::Config::_load_configuration({}, 0),
{
backend_directory => undef,
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => {},
digital_recipients => {},
prefixes => {},
partner_code => 'IL',
raw_config => {},
},
"load_configuration: return the base configuration."
);
# Return correct backend_dir
is_deeply(
Koha::Illrequest::Config::_load_configuration({ backend_directory => '/tmp/' }, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => {},
digital_recipients => {},
prefixes => {},
partner_code => 'IL',
raw_config => { backend_directory => '/tmp/' },
},
"load_configuration: return the correct backend_dir."
);
# Map over branch configs
my $xml_config = {
backend_directory => '/tmp/',
branch => [
{ code => '1', request_limit => { method => 'annual', count => 1 } },
{ code => '2', prefix => '2-prefix' },
{ code => '3', digital_recipient => 'branch' }
]
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => { branch => { 1 => { method => 'annual', count => 1 } } },
digital_recipients => { branch => { 3 => 'branch' } },
prefixes => { branch => { 2 => '2-prefix' } },
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: multi branch config parsed correctly."
);
# Single branch config
$xml_config = {
backend_directory => '/tmp/',
branch => {
code => '1',
request_limit => { method => 'annual', count => 1 },
prefix => '2-prefix',
digital_recipient => 'branch',
}
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => { branch => { 1 => { method => 'annual', count => 1 } } },
digital_recipients => { branch => { 1 => 'branch' } },
prefixes => { branch => { 1 => '2-prefix' } },
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: single branch config parsed correctly."
);
# Map over borrower_category settings
$xml_config = {
backend_directory => '/tmp/',
borrower_category => [
{ code => 'A', request_limit => { method => 'annual', count => 1 } },
{ code => 'B', prefix => '2-prefix' },
{ code => 'C', digital_recipient => 'branch' }
]
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => { brw_cat => { A => { method => 'annual', count => 1 } } },
digital_recipients => { brw_cat => { C => 'branch' } },
prefixes => { brw_cat => { B => '2-prefix' } },
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: multi borrower_category config parsed correctly."
);
# Single borrower_category config
$xml_config = {
backend_directory => '/tmp/',
borrower_category => {
code => '1',
request_limit => { method => 'annual', count => 1 },
prefix => '2-prefix',
digital_recipient => 'branch',
}
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => { brw_cat => { 1 => { method => 'annual', count => 1 } } },
digital_recipients => { brw_cat => { 1 => 'branch' } },
prefixes => { brw_cat => { 1 => '2-prefix' } },
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: single borrower_category config parsed correctly."
);
# Default Configuration
$xml_config = {
backend_directory => '/tmp/',
request_limit => { method => 'annual', count => 1 },
prefix => '2-prefix',
digital_recipient => 'branch',
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => { default => { method => 'annual', count => 1 } },
digital_recipients => { default => 'branch' },
prefixes => { default => '2-prefix' },
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: parse the default configuration."
);
# Censorship
$xml_config = {
backend_directory => '/tmp/',
staff_request_comments => 'hide',
reply_date => 'hide'
};
is_deeply(
Koha::Illrequest::Config::_load_configuration($xml_config, 0),
{
backend_directory => '/tmp/',
censorship => {
censor_notes_staff => 1,
censor_reply_date => 1,
},
limits => {},
digital_recipients => {},
prefixes => {},
partner_code => 'IL',
raw_config => $xml_config,
},
"load_configuration: parse censorship settings configuration."
);
# Partner library category
is_deeply(
Koha::Illrequest::Config::_load_configuration( { partner_code => 'FOOBAR' } ),
{
backend_directory => undef,
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => {},
digital_recipients => {},
prefixes => {},
partner_code => 'IL',
raw_config => { partner_code => 'FOOBAR' },
},
q{'partner_code' not read from the config file, default value 'IL' used instead}
);
t::lib::Mocks::mock_preference( 'ILLPartnerCode', 'FOOBAR' );
is_deeply(
Koha::Illrequest::Config::_load_configuration(),
{
backend_directory => undef,
censorship => {
censor_notes_staff => 0,
censor_reply_date => 0,
},
limits => {},
digital_recipients => {},
prefixes => {},
partner_code => 'FOOBAR',
raw_config => {},
},
q{'ILLPartnerCode' takes precedence over default value for 'partner_code'}
);
$schema->storage->txn_rollback;
};
subtest 'Final tests' => sub {
plan tests => 9;
$schema->storage->txn_begin;
t::lib::Mocks::mock_config("interlibrary_loans", {});
my $config = Koha::Illrequest::Config->new;
# getPrefixes (error & undef):
is($config->getPrefixes(), undef,
"getPrefixes: Undefined branch prefix is undefined.");
is($config->has_branch(), undef, "Config does not have branch when no config loaded");
# getDigitalRecipients (error & undef):
dies_ok( sub { $config->getDigitalRecipients("FOO") },
"getDigitalRecipients: die if not correct type.");
is_deeply($config->getDigitalRecipients("brw_cat"), { default => undef},
"getDigitalRecipients: Undefined brw_cat dig rec is undefined.");
is_deeply($config->getDigitalRecipients("branch"), { default => undef},
"getDigitalRecipients: Undefined branch dig rec is undefined.");
$config->{configuration} = Koha::Illrequest::Config::_load_configuration({
backend_directory => '/tmp/',
prefix => 'DEFAULT-prefix',
digital_recipient => 'branch',
borrower_category => [
{ code => 'B', prefix => '2-prefix' },
{ code => 'C', digital_recipient => 'branch' }
],
branch => [
{ code => '1', prefix => 'T-prefix' },
{ code => '2', digital_recipient => 'borrower' }
]
}, 0
);
# getPrefixes (values):
is_deeply($config->getPrefixes(),
{ '1' => 'T-prefix' },
"getPrefixes: return configuration branch prefixes.");
# getDigitalRecipients (values):
is_deeply($config->getDigitalRecipients("brw_cat"),
{ C => 'branch', default => 'branch' },
"getDigitalRecipients: return brw_cat digital_recipients.");
is_deeply($config->getDigitalRecipients("branch"),
{ 2 => 'borrower', default => 'branch' },
"getDigitalRecipients: return branch digital_recipients.");
# has_branch test
ok($config->has_branch(), "has_branch returns true if branch defined in configuration");
$schema->storage->txn_rollback;
};
1;