+
+subtest 'GetPreparedLetter' => sub {
+ plan tests => 4;
+
+ Koha::Notice::Template->new(
+ {
+ module => 'test',
+ code => 'test',
+ branchcode => '',
+ message_transport_type => 'email'
+ }
+ )->store;
+ my $letter;
+ warning_like {
+ $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ letter_code => 'test',
+ );
+ }
+ qr{^ERROR: nothing to substitute},
+'GetPreparedLetter should warn if tables, substiture and repeat are not set';
+ is( $letter, undef,
+'No letter should be returned by GetPreparedLetter if something went wrong'
+ );
+
+ warning_like {
+ $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ letter_code => 'test',
+ substitute => {}
+ );
+ }
+ qr{^ERROR: nothing to substitute},
+'GetPreparedLetter should warn if tables, substiture and repeat are not set, even if the key is passed';
+ is( $letter, undef,
+'No letter should be returned by GetPreparedLetter if something went wrong'
+ );
+
+};
+
+
+
+subtest 'TranslateNotices' => sub {
+ plan tests => 4;
+
+ t::lib::Mocks::mock_preference( 'TranslateNotices', '1' );
+
+ $dbh->do(
+ q|
+ INSERT INTO letter (module, code, branchcode, name, title, content, message_transport_type, lang) VALUES
+ ('test', 'code', '', 'test', 'a test', 'just a test', 'email', 'default'),
+ ('test', 'code', '', 'test', 'una prueba', 'solo una prueba', 'email', 'es-ES');
+ | );
+ my $substitute = {};
+ my $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ tables => $tables,
+ letter_code => 'code',
+ message_transport_type => 'email',
+ substitute => $substitute,
+ );
+ is(
+ $letter->{title},
+ 'a test',
+ 'GetPreparedLetter should return the default one if the lang parameter is not provided'
+ );
+
+ $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ tables => $tables,
+ letter_code => 'code',
+ message_transport_type => 'email',
+ substitute => $substitute,
+ lang => 'es-ES',
+ );
+ is( $letter->{title}, 'una prueba',
+ 'GetPreparedLetter should return the required notice if it exists' );
+
+ $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ tables => $tables,
+ letter_code => 'code',
+ message_transport_type => 'email',
+ substitute => $substitute,
+ lang => 'fr-FR',
+ );
+ is(
+ $letter->{title},
+ 'a test',
+ 'GetPreparedLetter should return the default notice if the one required does not exist'
+ );
+
+ t::lib::Mocks::mock_preference( 'TranslateNotices', '' );
+
+ $letter = C4::Letters::GetPreparedLetter(
+ module => 'test',
+ tables => $tables,
+ letter_code => 'code',
+ message_transport_type => 'email',
+ substitute => $substitute,
+ lang => 'es-ES',
+ );
+ is( $letter->{title}, 'a test',
+ 'GetPreparedLetter should return the default notice if pref disabled but additional language exists' );
+
+};
+
+subtest 'SendQueuedMessages' => sub {
+
+ plan tests => 3;
+ t::lib::Mocks::mock_preference( 'SMSSendDriver', 'Email' );
+ my $patron = Koha::Patrons->find($borrowernumber);
+ $dbh->do(q|
+ INSERT INTO message_queue(borrowernumber, subject, content, message_transport_type, status, letter_code)
+ VALUES (?, 'subject', 'content', 'sms', 'pending', 'just_a_code')
+ |, undef, $borrowernumber
+ );
+ eval { C4::Letters::SendQueuedMessages(); };
+ is( $@, '', 'SendQueuedMessages should not explode if the patron does not have a sms provider set' );
+
+ my $sms_pro = $builder->build_object({ class => 'Koha::SMS::Providers', value => { domain => 'kidclamp.rocks' } });
+ ModMember( borrowernumber => $borrowernumber, smsalertnumber => '5555555555', sms_provider_id => $sms_pro->id() );
+ $message_id = C4::Letters::EnqueueLetter($my_message); #using datas set around line 95 and forward
+ C4::Letters::SendQueuedMessages();
+ my $sms_message_address = $schema->resultset('MessageQueue')->search({
+ borrowernumber => $borrowernumber,
+ status => 'sent'
+ })->next()->to_address();
+ is( $sms_message_address, '5555555555@kidclamp.rocks', 'SendQueuedMessages populates the to address correctly for SMS by email when to_address not set' );
+ $schema->resultset('MessageQueue')->search({borrowernumber => $borrowernumber,status => 'sent'})->delete(); #clear borrower queue
+ $my_message->{to_address} = 'fixme@kidclamp.iswrong';
+ $message_id = C4::Letters::EnqueueLetter($my_message);
+ C4::Letters::SendQueuedMessages();
+ $sms_message_address = $schema->resultset('MessageQueue')->search({
+ borrowernumber => $borrowernumber,
+ status => 'sent'
+ })->next()->to_address();
+ is( $sms_message_address, '5555555555@kidclamp.rocks', 'SendQueuedMessages populates the to address correctly for SMS by email when to_address is set incorrectly' );
+
+};
+
+subtest 'get_item_content' => sub {
+ plan tests => 2;
+
+ t::lib::Mocks::mock_preference('dateformat', 'metric');
+ t::lib::Mocks::mock_preference('timeformat', '24hr');
+ my @items = (
+ {date_due => '2041-01-01 12:34', title => 'a first title', barcode => 'a_first_barcode', author => 'a_first_author', itemnumber => 1 },
+ {date_due => '2042-01-02 23:45', title => 'a second title', barcode => 'a_second_barcode', author => 'a_second_author', itemnumber => 2 },
+ );
+ my @item_content_fields = qw( date_due title barcode author itemnumber );
+
+ my $items_content;
+ for my $item ( @items ) {
+ $items_content .= C4::Letters::get_item_content( { item => $item, item_content_fields => \@item_content_fields } );
+ }
+
+ my $expected_items_content = <<EOF;
+01/01/2041 12:34\ta first title\ta_first_barcode\ta_first_author\t1
+02/01/2042 23:45\ta second title\ta_second_barcode\ta_second_author\t2
+EOF
+ is( $items_content, $expected_items_content, 'get_item_content should return correct items info with time (default)' );
+
+
+ $items_content = q||;
+ for my $item ( @items ) {
+ $items_content .= C4::Letters::get_item_content( { item => $item, item_content_fields => \@item_content_fields, dateonly => 1, } );
+ }
+
+ $expected_items_content = <<EOF;
+01/01/2041\ta first title\ta_first_barcode\ta_first_author\t1
+02/01/2042\ta second title\ta_second_barcode\ta_second_author\t2
+EOF
+ is( $items_content, $expected_items_content, 'get_item_content should return correct items info without time (if dateonly => 1)' );
+};
+
+subtest 'Test limit parameter for SendQueuedMessages' => sub {
+ plan tests => 3;
+
+ my $dbh = C4::Context->dbh;
+
+ my $borrowernumber = AddMember(
+ firstname => 'Jane',
+ surname => 'Smith',
+ categorycode => $patron_category,
+ branchcode => $library->{branchcode},
+ dateofbirth => $date,
+ smsalertnumber => undef,
+ );
+
+ $dbh->do(q|DELETE FROM message_queue|);
+ $my_message = {
+ 'letter' => {
+ 'content' => 'a message',
+ 'metadata' => 'metadata',
+ 'code' => 'TEST_MESSAGE',
+ 'content_type' => 'text/plain',
+ 'title' => 'message title'
+ },
+ 'borrowernumber' => $borrowernumber,
+ 'to_address' => undef,
+ 'message_transport_type' => 'sms',
+ 'from_address' => 'from@example.com'
+ };
+ C4::Letters::EnqueueLetter($my_message);
+ C4::Letters::EnqueueLetter($my_message);
+ C4::Letters::EnqueueLetter($my_message);
+ C4::Letters::EnqueueLetter($my_message);
+ C4::Letters::EnqueueLetter($my_message);
+ my $messages_processed = C4::Letters::SendQueuedMessages( { limit => 1 } );
+ is( $messages_processed, 1,
+ 'Processed 1 message with limit of 1 and 5 unprocessed messages' );
+ $messages_processed = C4::Letters::SendQueuedMessages( { limit => 2 } );
+ is( $messages_processed, 2,
+ 'Processed 2 message with limit of 2 and 4 unprocessed messages' );
+ $messages_processed = C4::Letters::SendQueuedMessages( { limit => 3 } );
+ is( $messages_processed, 2,
+ 'Processed 2 message with limit of 3 and 2 unprocessed messages' );
+};