From 5df0bc3d5ee4468c25ae57b3083268c988055181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Nyl=C3=A9n?= Date: Tue, 14 Dec 2021 08:35:04 +0000 Subject: [PATCH] Bug 27208: Unit tests This commit adds unit test for changes in C4/Letters.pm and C4/Reserves.pm --- t/db_dependent/Letters.t | 33 +++++++++++- t/db_dependent/Reserves.t | 103 +++++++++++++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 2 deletions(-) diff --git a/t/db_dependent/Letters.t b/t/db_dependent/Letters.t index 9a37118503..a0924aff8f 100755 --- a/t/db_dependent/Letters.t +++ b/t/db_dependent/Letters.t @@ -18,7 +18,7 @@ # along with Koha; if not, see . use Modern::Perl; -use Test::More tests => 83; +use Test::More tests => 88; use Test::MockModule; use Test::Warn; use Test::Exception; @@ -147,6 +147,7 @@ is( $messages->[0]->{status}, 'pending', 'EnqueueLetter stores the status pendin isnt( $messages->[0]->{time_queued}, undef, 'Time queued inserted by default in message_queue table' ); is( $messages->[0]->{updated_on}, $messages->[0]->{time_queued}, 'Time status changed equals time queued when created in message_queue table' ); is( $messages->[0]->{failure_code}, '', 'Failure code for successful message correctly empty'); +is( $messages->[0]->{delay_until}, undef, 'Delay until should be undef if not set'); # Setting time_queued to something else than now my $yesterday = dt_from_string->subtract( days => 1 ); @@ -171,6 +172,36 @@ is( isnt($messages->[0]->{updated_on}, $messages->[0]->{time_queued}, 'Time status changed differs from time queued when status changes' ); is(dt_from_string($messages->[0]->{time_queued}), $yesterday, 'Time queued remaines inmutable' ); +# Delayed message +my $tomorrow = dt_from_string()->add( days => 1 ); +my $delay_message = { + borrowernumber => $borrowernumber, + message_transport_type => 'email', + to_address => 'to@example', + from_address => 'from@example.com', + delay_until => $tomorrow, +}; +$delay_message->{letter} = { + content => 'I am waiting', + title => 'Patience is great', + metadata => 'metadata', + code => 'TEST_MESSAGE', + content_type => 'text/plain', +}; + +my $delayed_message_id = C4::Letters::EnqueueLetter($delay_message); + +my $delay_until = Koha::Notice::Messages->find($delayed_message_id)->delay_until; +is(dt_from_string($delay_until), $tomorrow, 'Delay_until is properly set'); + +my $delayed_messages_processed = C4::Letters::SendQueuedMessages(); +is($delayed_messages_processed, 0, 'Message not processed if delay_until is set in the future'); + +Koha::Notice::Messages->find($delayed_message_id)->delay_until($yesterday)->store; +$delayed_messages_processed = C4::Letters::SendQueuedMessages(); +is($delayed_messages_processed, 1, 'Message processed if delay_until is set in the past'); +Koha::Notice::Messages->find($delayed_message_id)->delete; + # ResendMessage my $resent = C4::Letters::ResendMessage($messages->[0]->{message_id}); my $message = C4::Letters::GetMessage( $messages->[0]->{message_id}); diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t index 9b4122dbd4..7771211f0e 100755 --- a/t/db_dependent/Reserves.t +++ b/t/db_dependent/Reserves.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 68; +use Test::More tests => 69; use Test::MockModule; use Test::Warn; @@ -1332,6 +1332,107 @@ subtest 'ModReserveAffect logging' => sub { like( $log->info, qr{$expected}, 'Timestamp logged is the current one' ); }; +subtest 'ModReserveAffect delayed notice' => sub { + + plan tests => 4; + + my $wants_hold_and_email = { + wants_digest => '0', + transports => { + email => 'HOLD', + }, + letter_code => 'HOLD' + }; + + my $mp = Test::MockModule->new( 'C4::Members::Messaging' ); + + $mp->mock("GetMessagingPreferences",$wants_hold_and_email); + + $dbh->do('DELETE FROM letter'); + $dbh->do('DELETE FROM reserves'); + $dbh->do('DELETE FROM message_queue'); + + + my $email_hold_notice = $builder->build({ + source => 'Letter', + value => { + message_transport_type => 'email', + branchcode => '', + code => 'HOLD', + module => 'reserves', + lang => 'default', + } + }); + + my $hold_borrower = $builder->build({ + source => 'Borrower', + value => { + email=>'ac@b.com', + } + })->{borrowernumber}; + + my $hold = C4::Reserves::AddReserve( + { + branchcode => $item->homebranch, + borrowernumber => $hold_borrower, + biblionumber => $item->biblionumber, + } + ); + t::lib::Mocks::mock_preference('PickupNoticeDelayMode', 'off'); + t::lib::Mocks::mock_preference('PickupNoticeDelayDuration', 1); + + # No delay allowed + my $tomorrow = dt_from_string()->add(days => 1); + ModReserveAffect($item->itemnumber, $hold_borrower, 0, $hold, undef, $tomorrow ); + my $delay_until = $schema->resultset('MessageQueue')->search({ + letter_code => 'HOLD', + message_transport_type => 'email', + borrowernumber => $hold_borrower, + }, { order_by => { -desc => 'message_id' } })->next()->delay_until(); + is($delay_until, undef ,"No notice delay if PickupNoticeDelayMode is off even if delay is passed"); + + $dbh->do('DELETE FROM message_queue'); + $dbh->do('DELETE FROM reserves'); + $hold = C4::Reserves::AddReserve( + { + branchcode => $item->homebranch, + borrowernumber => $hold_borrower, + biblionumber => $item->biblionumber, + } + ); + + t::lib::Mocks::mock_preference('PickupNoticeDelayMode', 'fixed'); + my $more_than_hour = dt_from_string()->add( minutes => 61); + my $less_than_hour = dt_from_string()->add( minutes => 59); + ModReserveAffect($item->itemnumber, $hold_borrower, 0, $hold, undef, undef); + $delay_until = $schema->resultset('MessageQueue')->search({ + letter_code => 'HOLD', + message_transport_type => 'email', + borrowernumber => $hold_borrower, + }, { order_by => { -desc => 'message_id' } })->next()->delay_until(); + cmp_ok(dt_from_string($delay_until)->epoch, ">=", $less_than_hour->epoch, "1h fixed delay_until is bigger than 59 min."); + cmp_ok(dt_from_string($delay_until), "<=", $more_than_hour, "1h fixed delay_until is less than 61 min."); + + $dbh->do('DELETE FROM message_queue'); + $dbh->do('DELETE FROM reserves'); + $hold = C4::Reserves::AddReserve( + { + branchcode => $item->homebranch, + borrowernumber => $hold_borrower, + biblionumber => $item->biblionumber, + } + ); + + t::lib::Mocks::mock_preference('PickupNoticeDelayMode', 'staff'); + ModReserveAffect($item->itemnumber, $hold_borrower, 0, $hold, undef, $tomorrow ); + $delay_until = $schema->resultset('MessageQueue')->search({ + letter_code => 'HOLD', + message_transport_type => 'email', + borrowernumber => $hold_borrower, + }, { order_by => { -desc => 'message_id' } })->next()->delay_until(); + is(dt_from_string($delay_until), $tomorrow, "Delay_until is same as set in function call"); +}; + sub count_hold_print_messages { my $message_count = $dbh->selectall_arrayref(q{ SELECT COUNT(*) -- 2.20.1