From 9c0c454206dea38ff4f0ae5327c088054f72975c 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 | 37 +++++++++++- t/db_dependent/Reserves.t | 118 +++++++++++++++++++++++++++++++++++++- 2 files changed, 152 insertions(+), 3 deletions(-) diff --git a/t/db_dependent/Letters.t b/t/db_dependent/Letters.t index f248a07f7f5..56714663af3 100755 --- a/t/db_dependent/Letters.t +++ b/t/db_dependent/Letters.t @@ -19,7 +19,7 @@ use Modern::Perl; use File::Basename qw(dirname); -use Test::More tests => 105; +use Test::More tests => 111; use Test::NoWarnings; use Test::MockModule; @@ -168,7 +168,8 @@ is( t::lib::Dates::compare( $messages->[0]->{updated_on}, $messages->[0]->{time_queued} ), 0, '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]->{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 ); @@ -227,6 +228,38 @@ isnt( ); is( dt_from_string( $messages->[0]->{time_queued} ), $yesterday, 'Time queued remains 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; +warning_like { $delayed_messages_processed = C4::Letters::SendQueuedMessages(); } +qr|Fake send_or_die|, + "SendQueuedMessages is using the mocked send_or_die routine"; +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} ); $message = C4::Letters::GetMessage( $messages->[0]->{message_id} ); diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t index 3b952ebb811..ed358f8f10f 100755 --- a/t/db_dependent/Reserves.t +++ b/t/db_dependent/Reserves.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 69; +use Test::More tests => 70; use Test::NoWarnings; use Test::MockModule; use Test::Warn; @@ -1466,6 +1466,122 @@ 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, 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, 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, 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{ -- 2.43.0