843 lines
37 KiB
Perl
Executable File
843 lines
37 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# Copyright 2017 Koha-Suomi Oy
|
|
#
|
|
# 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 Test::More tests => 8;
|
|
|
|
use t::lib::Mocks;
|
|
use t::lib::TestBuilder;
|
|
|
|
use C4::Context;
|
|
|
|
use Koha::Notice::Templates;
|
|
use Koha::Patron::Categories;
|
|
use Koha::Patron::MessagePreference::Attributes;
|
|
use Koha::Patron::MessagePreference::Transport::Types;
|
|
use Koha::Patron::MessagePreference::Transports;
|
|
use Koha::Patrons;
|
|
|
|
use File::Temp qw/tempfile/;
|
|
use Log::Log4perl;
|
|
|
|
my $schema = Koha::Database->new->schema;
|
|
my $builder = t::lib::TestBuilder->new;
|
|
|
|
subtest 'Test class imports' => sub {
|
|
plan tests => 2;
|
|
|
|
use_ok('Koha::Patron::MessagePreference');
|
|
use_ok('Koha::Patron::MessagePreferences');
|
|
};
|
|
|
|
subtest 'Test Koha::Patron::MessagePreferences' => sub {
|
|
plan tests => 2;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $attribute = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Attributes' });
|
|
my $letter = build_a_test_letter();
|
|
my $mtt = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_type => $mtt->message_transport_type,
|
|
is_digest => 0,
|
|
letter_module => $letter->module,
|
|
letter_code => $letter->code,
|
|
})->store;
|
|
|
|
subtest 'Test for a patron' => sub {
|
|
plan tests => 3;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
wants_digest => 0,
|
|
days_in_advance => undef,
|
|
})->store;
|
|
|
|
my $preference = Koha::Patron::MessagePreferences->find({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id
|
|
});
|
|
ok($preference->borrower_message_preference_id > 0,
|
|
'Added a new messaging preference for patron.');
|
|
|
|
subtest 'Test set not throwing an exception on duplicate object' => sub {
|
|
plan tests => 1;
|
|
|
|
Koha::Patron::MessagePreference::Attributes->find({
|
|
message_attribute_id => $attribute->message_attribute_id
|
|
})->set({ takes_days => 1 })->store;
|
|
$preference->set({ days_in_advance => 1 })->store;
|
|
is(ref($preference), 'Koha::Patron::MessagePreference',
|
|
'Updating the preference does not cause duplicate object exception');
|
|
};
|
|
|
|
$preference->delete;
|
|
is(Koha::Patron::MessagePreferences->search({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id
|
|
})->count, 0, 'Deleted the messaging preference.');
|
|
};
|
|
|
|
subtest 'Test for a category' => sub {
|
|
my $category = $builder->build_object({ class => 'Koha::Patron::Categories' });
|
|
Koha::Patron::MessagePreference->new({
|
|
categorycode => $category->categorycode,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
wants_digest => 0,
|
|
days_in_advance => undef,
|
|
})->store;
|
|
|
|
my $preference = Koha::Patron::MessagePreferences->find({
|
|
categorycode => $category->categorycode,
|
|
message_attribute_id => $attribute->message_attribute_id
|
|
});
|
|
ok($preference->borrower_message_preference_id > 0,
|
|
'Added a new messaging preference for category.');
|
|
|
|
$preference->delete;
|
|
is(Koha::Patron::MessagePreferences->search({
|
|
categorycode => $category->categorycode,
|
|
message_attribute_id => $attribute->message_attribute_id
|
|
})->count, 0, 'Deleted the messaging preference.');
|
|
};
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Test Koha::Patron::MessagePreferences->get_options' => sub {
|
|
plan tests => 2;
|
|
|
|
subtest 'Test method availability and return value' => sub {
|
|
plan tests => 3;
|
|
|
|
ok(Koha::Patron::MessagePreferences->can('get_options'),
|
|
'Method get_options is available.');
|
|
ok(my $options = Koha::Patron::MessagePreferences->get_options,
|
|
'Called get_options successfully.');
|
|
is(ref($options), 'ARRAY', 'get_options returns a ARRAYref');
|
|
};
|
|
|
|
subtest 'Make sure options are correct' => sub {
|
|
$schema->storage->txn_begin;
|
|
my $options = Koha::Patron::MessagePreferences->get_options;
|
|
|
|
foreach my $option (@$options) {
|
|
my $n = $option->{'message_name'};
|
|
my $attr = Koha::Patron::MessagePreference::Attributes->find($option->{'message_attribute_id'});
|
|
is($option->{'message_attribute_id'}, $attr->message_attribute_id,
|
|
'$n: message_attribute_id is set');
|
|
is($option->{'message_name'}, $attr->message_name, '$n: message_name is set');
|
|
is($option->{'takes_days'}, $attr->takes_days, '$n: takes_days is set');
|
|
my $transports = Koha::Patron::MessagePreference::Transports->search({
|
|
message_attribute_id => $option->{'message_attribute_id'},
|
|
is_digest => $option->{'has_digest'} || 0,
|
|
});
|
|
while (my $trnzport = $transports->next) {
|
|
is($option->{'has_digest'} || 0, $trnzport->is_digest, '$n: has_digest is set for '.$trnzport->message_transport_type);
|
|
is($option->{'transport_'.$trnzport->message_transport_type}, ' ', '$n: transport_'.$trnzport->message_transport_type.' is set');
|
|
}
|
|
}
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
};
|
|
|
|
subtest 'Add preferences from defaults' => sub {
|
|
plan tests => 3;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my ($default, $mtt1, $mtt2) = build_a_test_category_preference({
|
|
patron => $patron,
|
|
});
|
|
ok(Koha::Patron::MessagePreference->new_from_default({
|
|
borrowernumber => $patron->borrowernumber,
|
|
categorycode => $patron->categorycode,
|
|
message_attribute_id => $default->message_attribute_id,
|
|
})->store, 'Added a default preference to patron.');
|
|
ok(my $pref = Koha::Patron::MessagePreferences->find({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $default->message_attribute_id,
|
|
}), 'Found the default preference from patron.');
|
|
is(Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $pref->borrower_message_preference_id
|
|
})->count, 2, 'Found the two transport types that we set earlier');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Test Koha::Patron::MessagePreference->message_transport_types' => sub {
|
|
plan tests => 4;
|
|
|
|
ok(Koha::Patron::MessagePreference->can('message_transport_types'),
|
|
'Method message_transport_types available');
|
|
|
|
subtest 'get message_transport_types' => sub {
|
|
plan tests => 5;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my ($preference, $mtt1, $mtt2) = build_a_test_complete_preference({
|
|
patron => $patron
|
|
});
|
|
Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
})->delete;
|
|
Koha::Patron::MessagePreference::Transport::Preference->new({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
message_transport_type => $mtt1->message_transport_type,
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport::Preference->new({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
message_transport_type => $mtt2->message_transport_type,
|
|
})->store;
|
|
my $stored_transports = Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
});
|
|
my $transport1 = Koha::Patron::MessagePreference::Transports->find({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => $mtt1->message_transport_type,
|
|
});
|
|
my $transport2 = Koha::Patron::MessagePreference::Transports->find({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => $mtt2->message_transport_type,
|
|
});
|
|
my $transports = $preference->message_transport_types;
|
|
is(keys %{$transports}, $stored_transports->count,
|
|
'->message_transport_types gets correct amount of transport types.');
|
|
is($transports->{$stored_transports->next->message_transport_type},
|
|
$transport1->letter_code, 'Found correct message transport type and letter code.');
|
|
is($transports->{$stored_transports->next->message_transport_type},
|
|
$transport2->letter_code, 'Found correct message transport type and letter code.');
|
|
ok(!$preference->message_transport_types->{'nonexistent'},
|
|
'Didn\'t find nonexistent transport type.');
|
|
|
|
subtest 'test logging of warnings by invalid message transport type' => sub {
|
|
plan tests => 2;
|
|
|
|
my $log = mytempfile();
|
|
my $conf = mytempfile( <<"HERE"
|
|
log4perl.logger.opac = WARN, OPAC
|
|
log4perl.appender.OPAC=Log::Log4perl::Appender::TestBuffer
|
|
log4perl.appender.OPAC.filename=$log
|
|
log4perl.appender.OPAC.mode=append
|
|
log4perl.appender.OPAC.layout=SimpleLayout
|
|
log4perl.logger.intranet = WARN, INTRANET
|
|
log4perl.appender.INTRANET=Log::Log4perl::Appender::TestBuffer
|
|
log4perl.appender.INTRANET.filename=$log
|
|
log4perl.appender.INTRANET.mode=append
|
|
log4perl.appender.INTRANET.layout=SimpleLayout
|
|
HERE
|
|
);
|
|
t::lib::Mocks::mock_config('log4perl_conf', $conf);
|
|
my $appenders = Log::Log4perl->appenders;
|
|
my $appender = Log::Log4perl->appenders->{OPAC};
|
|
|
|
my $pref = Koha::Patron::MessagePreferences->find(
|
|
$preference->borrower_message_preference_id
|
|
);
|
|
my $transports = $pref->message_transport_types;
|
|
is($appender, undef, 'Nothing in buffer yet');
|
|
|
|
my $mtt_new = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
Koha::Patron::MessagePreference::Transport::Preference->new({
|
|
borrower_message_preference_id =>
|
|
$pref->borrower_message_preference_id,
|
|
message_transport_type => $mtt_new->message_transport_type,
|
|
})->store;
|
|
$pref = Koha::Patron::MessagePreferences->find(
|
|
$pref->borrower_message_preference_id
|
|
);
|
|
$transports = $pref->message_transport_types;
|
|
$appender = Log::Log4perl->appenders->{OPAC};
|
|
my $name = $pref->message_name;
|
|
my $tt = $mtt_new->message_transport_type;
|
|
like($appender->buffer, qr/WARN - $name has no transport with $tt/,
|
|
'Logged invalid message transport type');
|
|
};
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'set message_transport_types' => sub {
|
|
plan tests => 18;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my ($preference, $mtt1, $mtt2) = build_a_test_complete_preference({
|
|
patron => $patron
|
|
});
|
|
|
|
my $mtt1_str = $mtt1->message_transport_type;
|
|
my $mtt2_str = $mtt2->message_transport_type;
|
|
# 1/3, use message_transport_types(list)
|
|
Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
})->delete;
|
|
ok($preference->message_transport_types($mtt1_str, $mtt2_str)->store,
|
|
'1/3 Set returned true.');
|
|
my $stored_transports = Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
'-or' => [
|
|
message_transport_type => $mtt1_str,
|
|
message_transport_type => $mtt2_str
|
|
]
|
|
});
|
|
is($stored_transports->count, 2, 'Two transports selected');
|
|
|
|
# 2/3, use message_transport_types(ARRAYREF)
|
|
Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
})->delete;
|
|
ok($preference->message_transport_types([$mtt1_str, $mtt2_str])->store,
|
|
'2/3 Set returned true.');
|
|
$stored_transports = Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
'-or' => [
|
|
message_transport_type => $mtt1_str,
|
|
message_transport_type => $mtt2_str
|
|
]
|
|
});
|
|
is($stored_transports->count, 2, 'Two transports selected');
|
|
|
|
# 3/3, use set({ message_transport_types => ARRAYREF })
|
|
Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
})->delete;
|
|
ok($preference->set({
|
|
message_transport_types => [$mtt1_str, $mtt2_str]})->store,
|
|
'3/3 Set returned true.');
|
|
$stored_transports = Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
'-or' => [
|
|
message_transport_type => $mtt1_str,
|
|
message_transport_type => $mtt2_str
|
|
]
|
|
});
|
|
is($stored_transports->count, 2, 'Two transports selected');
|
|
|
|
# Test contact information validation
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'email'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'itiva'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'phone'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'sms'
|
|
})->store };
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'email',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'itiva',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'phone',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'sms',
|
|
is_digest => 1
|
|
})->store;
|
|
t::lib::Mocks::mock_preference('TalkingTechItivaPhoneNotification', 0);
|
|
$patron->set({ email => '', emailpro => '', B_email => '', phone => '', smsalertnumber => '' })->store;
|
|
eval {
|
|
$preference->message_transport_types('email')->store;
|
|
};
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::EmailAddressRequired',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::EmailAddressRequired');
|
|
is ($@->message_name, $preference->message_name, 'The previous exception '
|
|
.' tells us it which message name it was.');
|
|
is ($@->borrowernumber, $patron->borrowernumber, 'The previous exception '
|
|
.' tells us which patron it was.');
|
|
eval {
|
|
$preference->message_transport_types('itiva')->store;
|
|
};
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::TalkingTechItivaPhoneNotificationRequired',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::TalkingTechItivaPhoneNotificationRequired');
|
|
is ($@->message_name, $preference->message_name, 'The previous exception '
|
|
.' tells us it which message name it was.');
|
|
is ($@->borrowernumber, $patron->borrowernumber, 'The previous exception '
|
|
.' tells us which patron it was.');
|
|
eval {
|
|
$preference->message_transport_types('phone')->store;
|
|
};
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::PhoneNumberRequired',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::PhoneNumberRequired');
|
|
is ($@->message_name, $preference->message_name, 'The previous exception '
|
|
.' tells us it which message name it was.');
|
|
is ($@->borrowernumber, $patron->borrowernumber, 'The previous exception '
|
|
.' tells us which patron it was.');
|
|
eval {
|
|
$preference->message_transport_types('sms')->store;
|
|
};
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::SMSNumberRequired',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::SMSNumberRequired');
|
|
is ($@->message_name, $preference->message_name, 'The previous exception '
|
|
.' tells us it which message name it was.');
|
|
is ($@->borrowernumber, $patron->borrowernumber, 'The previous exception '
|
|
.' tells us which patron it was.');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'new message_transport_types' => sub {
|
|
plan tests => 3;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my $letter = build_a_test_letter();
|
|
my $attribute = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Attributes' });
|
|
my $mtt = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_type => $mtt->message_transport_type,
|
|
is_digest => 0,
|
|
letter_module => $letter->module,
|
|
letter_code => $letter->code,
|
|
})->store;
|
|
ok(my $preference = Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
wants_digest => 0,
|
|
days_in_advance => undef,
|
|
message_transport_types => $mtt->message_transport_type,
|
|
})->store, 'Added a new messaging preference and transport types to patron.');
|
|
ok($preference->message_transport_types->{$mtt->message_transport_type},
|
|
'The transport type is stored in the object.');
|
|
my $stored_transports = Koha::Patron::MessagePreference::Transport::Preferences->search({
|
|
borrower_message_preference_id => $preference->borrower_message_preference_id,
|
|
});
|
|
is($stored_transports->next->message_transport_type, $mtt->message_transport_type,
|
|
'The transport type is stored in the database.');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
};
|
|
|
|
subtest 'Test Koha::Patron::MessagePreference->message_name' => sub {
|
|
plan tests => 1;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my $attribute = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Attributes' });
|
|
my ($preference, $mtt1, $mtt2) = build_a_test_complete_preference({
|
|
patron => $patron,
|
|
attr => $attribute,
|
|
});
|
|
my $message_name_pref = Koha::Patron::MessagePreferences->search_with_message_name({
|
|
borrowernumber => $patron->{'borrowernumber'},
|
|
message_name => $attribute->message_name,
|
|
})->next;
|
|
is($message_name_pref->message_name, $attribute->message_name, "Found preference with message_name");
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Test Koha::Patron::MessagePreference->mtt_deliverable' => sub {
|
|
plan tests => 10;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my ($preference, $mtt1, $mtt2) = build_a_test_complete_preference({
|
|
patron => $patron
|
|
});
|
|
|
|
# Test email and smsalertnumber validation
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'email'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'sms'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'phone'
|
|
})->store };
|
|
eval { Koha::Patron::MessagePreference::Transport::Types->new({
|
|
message_transport_type => 'itiva'
|
|
})->store };
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'email',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'sms',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'phone',
|
|
is_digest => 1
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $preference->message_attribute_id,
|
|
message_transport_type => 'itiva',
|
|
is_digest => 1
|
|
})->store;
|
|
$patron->set({
|
|
email => 'nobody@koha-community.org',
|
|
emailpro => 'nobody@koha-community.org',
|
|
B_email => 'nobody@koha-community.org',
|
|
smsalertnumber => '123',
|
|
phone => '123',
|
|
})->store;
|
|
t::lib::Mocks::mock_preference('TalkingTechItivaPhoneNotification', 1);
|
|
|
|
is($preference->mtt_deliverable('email'), 1, 'mtt_deliverable - email');
|
|
is($preference->mtt_deliverable('itiva'), 1, 'mtt_deliverable - itiva');
|
|
is($preference->mtt_deliverable('phone'), 1, 'mtt_deliverable - phone');
|
|
is($preference->mtt_deliverable('sms'), 1, 'mtt_deliverable - sms');
|
|
|
|
$patron->set({email => '',})->store;
|
|
is($preference->mtt_deliverable('email'), 1, 'mtt_deliverable - emailpro');
|
|
|
|
$patron->set({emailpro => '',})->store;
|
|
is($preference->mtt_deliverable('email'), 1, 'mtt_deliverable - B_email');
|
|
|
|
$patron->set({B_email => '',})->store;
|
|
is($preference->mtt_deliverable('email'), 0, 'mtt_deliverable - email false');
|
|
|
|
t::lib::Mocks::mock_preference('TalkingTechItivaPhoneNotification', 0);
|
|
is($preference->mtt_deliverable('itiva'), 0, 'mtt_deliverable - itiva false');
|
|
|
|
$patron->set({phone => '',})->store;
|
|
is($preference->mtt_deliverable('phone'), 0, 'mtt_deliverable - phone false');
|
|
|
|
$patron->set({smsalertnumber => '',})->store;
|
|
is($preference->mtt_deliverable('sms'), 0, 'mtt_deliverable - smsalertnumber false');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Test adding a new preference with invalid parameters' => sub {
|
|
plan tests => 4;
|
|
|
|
subtest 'Missing parameters' => sub {
|
|
plan tests => 1;
|
|
|
|
eval { Koha::Patron::MessagePreference->new->store };
|
|
is(ref $@, 'Koha::Exceptions::MissingParameter',
|
|
'Adding a message preference without parameters'
|
|
.' => Koha::Exceptions::MissingParameter');
|
|
};
|
|
|
|
subtest 'Too many parameters' => sub {
|
|
plan tests => 1;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
categorycode => $patron->categorycode,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::TooManyParameters',
|
|
'Adding a message preference for both borrowernumber and categorycode'
|
|
.' => Koha::Exceptions::TooManyParameters');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Bad parameter' => sub {
|
|
plan tests => 18;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => -999,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::Patron::NotFound',
|
|
'Adding a message preference with invalid borrowernumber'
|
|
.' => Koha::Exceptions::Patron::NotFound');
|
|
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
categorycode => 'nonexistent',
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::Patron::Category::NotFound',
|
|
'Adding a message preference with invalid categorycode'
|
|
.' => Koha::Exceptions::Patron::Category::NotFound');
|
|
|
|
my $attribute = build_a_test_attribute({ takes_days => 0 });
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
days_in_advance => 10,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceNotAvailable',
|
|
'Adding a message preference with days in advance option when not'
|
|
.' available => Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceNotAvailable');
|
|
|
|
$attribute->set({ takes_days => 1 })->store;
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
days_in_advance => -1,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceOutOfRange',
|
|
'Adding a message preference with days in advance option is out of range'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceOutOfRange');
|
|
is ($@->min, 0, 'The previous exception min value is 0.');
|
|
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
days_in_advance => 31,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceOutOfRange',
|
|
'Adding a message preference with days in advance option is out of range'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::DaysInAdvanceOutOfRange');
|
|
is ($@->max, 30, 'The previous exception max value is 30.');
|
|
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_transport_types => ['nonexistent']
|
|
})->store };
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::Transport::TypeNotFound',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::Transport::TypeNotFound');
|
|
is ($@->transport_type, 'nonexistent', 'The previous exception '
|
|
.'tells us it which transport type it was.');
|
|
|
|
my $mtt_new = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
eval {
|
|
Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_types => [$mtt_new->message_transport_type],
|
|
wants_digest => 1,
|
|
})->store };
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::NoTransportType',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::NoTransportType');
|
|
is ($@->message_name, $attribute->message_name, 'The previous exception '
|
|
.'tells us which message it was.');
|
|
is ($@->transport_type, $mtt_new->message_transport_type, 'The previous exception '
|
|
.'tells us which message transport type it was.');
|
|
|
|
eval {
|
|
Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_types => [],
|
|
wants_digest => 1,
|
|
})->store };
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::DigestNotAvailable',
|
|
'Adding a message preference that has no digest setting'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::DigestNotAvailable');
|
|
is ($@->message_name, $attribute->message_name, 'The previous exception tells us'
|
|
.' which message it was');
|
|
|
|
eval {
|
|
Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_types => [],
|
|
wants_digest => 0,
|
|
})->store };
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::DigestRequired',
|
|
'Adding a message preference, that requires digest, with no digest'
|
|
.' => Koha::Exceptions::Patron::MessagePreference::DigestRequired');
|
|
is ($@->message_name, $attribute->message_name, 'The previous exception tells us'
|
|
.' which message it was');
|
|
eval {
|
|
Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => -1,
|
|
message_transport_types => [],
|
|
})->store };
|
|
is (ref $@, 'Koha::Exceptions::Patron::MessagePreference::AttributeNotFound',
|
|
'Adding a message preference with invalid message_transport_type'
|
|
.' => KKoha::Exceptions::Patron::MessagePreference::AttributeNotFound');
|
|
is ($@->message_attribute_id, -1, 'The previous exception tells'
|
|
.' us which message attribute id it was.');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Duplicate object' => sub {
|
|
plan tests => 2;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $attribute = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Attributes' });
|
|
my $letter = build_a_test_letter();
|
|
my $mtt = $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
message_transport_type => $mtt->message_transport_type,
|
|
is_digest => 0,
|
|
letter_module => $letter->module,
|
|
letter_code => $letter->code,
|
|
})->store;
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my $preference = Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
wants_digest => 0,
|
|
days_in_advance => undef,
|
|
})->store;
|
|
ok($preference->borrower_message_preference_id,
|
|
'Added a new messaging preference for patron.');
|
|
eval { Koha::Patron::MessagePreference->new({
|
|
borrowernumber => $patron->borrowernumber,
|
|
message_attribute_id => $attribute->message_attribute_id,
|
|
wants_digest => 0,
|
|
days_in_advance => undef,
|
|
})->store };
|
|
is(ref $@, 'Koha::Exceptions::DuplicateObject',
|
|
'Adding a duplicate preference'
|
|
.' => Koha::Exceptions::DuplicateObject');
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
};
|
|
|
|
sub build_a_test_attribute {
|
|
my ($params) = @_;
|
|
|
|
$params->{takes_days} = $params->{takes_days} && $params->{takes_days} > 0
|
|
? 1 : 0;
|
|
|
|
my $attribute = $builder->build({
|
|
source => 'MessageAttribute',
|
|
value => $params,
|
|
});
|
|
|
|
return Koha::Patron::MessagePreference::Attributes->find(
|
|
$attribute->{message_attribute_id}
|
|
);
|
|
}
|
|
|
|
sub build_a_test_letter {
|
|
my ($params) = @_;
|
|
|
|
my $mtt = $params->{mtt} ? $params->{mtt} : 'email';
|
|
my $branchcode = $builder->build({
|
|
source => 'Branch' })->{branchcode};
|
|
my $letter = $builder->build({
|
|
source => 'Letter',
|
|
value => {
|
|
branchcode => '',
|
|
is_html => 0,
|
|
message_transport_type => $mtt
|
|
}
|
|
});
|
|
|
|
return Koha::Notice::Templates->find({
|
|
module => $letter->{module},
|
|
code => $letter->{code},
|
|
branchcode => $letter->{branchcode},
|
|
});
|
|
}
|
|
|
|
sub build_a_test_category_preference {
|
|
my ($params) = @_;
|
|
|
|
my $patron = $params->{patron};
|
|
my $attr = $params->{attr}
|
|
? $params->{attr}
|
|
: build_a_test_attribute($params->{days_in_advance});
|
|
|
|
my $letter = $params->{letter} ? $params->{letter} : build_a_test_letter();
|
|
my $mtt1 = $params->{mtt1} ? $params->{mtt1} : $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
my $mtt2 = $params->{mtt2} ? $params->{mtt2} : $builder->build_object({ class => 'Koha::Patron::MessagePreference::Transport::Types' });
|
|
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $attr->message_attribute_id,
|
|
message_transport_type => $mtt1->message_transport_type,
|
|
is_digest => $params->{digest} ? 1 : 0,
|
|
letter_module => $letter->module,
|
|
letter_code => $letter->code,
|
|
})->store;
|
|
|
|
Koha::Patron::MessagePreference::Transport->new({
|
|
message_attribute_id => $attr->message_attribute_id,
|
|
message_transport_type => $mtt2->message_transport_type,
|
|
is_digest => $params->{digest} ? 1 : 0,
|
|
letter_module => $letter->module,
|
|
letter_code => $letter->code,
|
|
})->store;
|
|
|
|
my $default = Koha::Patron::MessagePreference->new({
|
|
categorycode => $patron->categorycode,
|
|
message_attribute_id => $attr->message_attribute_id,
|
|
wants_digest => $params->{digest} ? 1 : 0,
|
|
days_in_advance => $params->{days_in_advance}
|
|
? $params->{days_in_advance} : undef,
|
|
})->store;
|
|
|
|
Koha::Patron::MessagePreference::Transport::Preference->new({
|
|
borrower_message_preference_id => $default->borrower_message_preference_id,
|
|
message_transport_type => $mtt1->message_transport_type,
|
|
})->store;
|
|
Koha::Patron::MessagePreference::Transport::Preference->new({
|
|
borrower_message_preference_id => $default->borrower_message_preference_id,
|
|
message_transport_type => $mtt2->message_transport_type,
|
|
})->store;
|
|
|
|
return ($default, $mtt1, $mtt2);
|
|
}
|
|
|
|
sub build_a_test_complete_preference {
|
|
my ($params) = @_;
|
|
|
|
my ($default, $mtt1, $mtt2) = build_a_test_category_preference($params);
|
|
my $patron = $params->{patron};
|
|
$patron->set_default_messaging_preferences;
|
|
return (Koha::Patron::MessagePreferences->search({
|
|
borrowernumber => $patron->borrowernumber
|
|
})->next, $mtt1, $mtt2);
|
|
}
|
|
|
|
sub mytempfile {
|
|
my ( $fh, $fn ) = tempfile( SUFFIX => '.logger.test', UNLINK => 1 );
|
|
print $fh $_[0]//'';
|
|
close $fh;
|
|
return $fn;
|
|
}
|
|
|
|
1;
|