webgui/t/Mail/Send.t
Patrick Donelan 388a0b1267 Fixed a whole lot of brokenness in Inbox SMS/Email notifications
WebGUI::Inbox::Message::create now passes isInbox flag to WebGUI::Mail::Send::create
so that per-user notification settings get used

SMS Gateway setting field is now 'text' instead of 'email' so that user can enter a
properly formed value (such as 'myemailgateway.com', which is not an email address).

Added SMS notification template as distinct from email notification template because
SMSs should not be HTML and in general you will want to make your SMS notification
message a lot shorter than your html email notification message (160 char limits in
many countries). As a result, SMSs are now sent as separate emails to gateway rather
than being CCd on email notification.

Added smsGatewaySubject setting because many SMS Gateways use email subject for
authentication. For consistency, also added Email notification email subject.

Fixed handling of different combinations of site-wide sendInboxNotificationsOnly with
per-user receiveInboxEmailNotifications and receiveInboxSmsEmailNotifications.
 * sendInboxNotificationsOnly && receiveInboxEmailNotifications = email notification
 * sendInboxNotificationsOnly && !receiveInboxEmailNotifications = no email
 * !sendInboxNotificationsOnly = ignore receiveInboxEmailNotifications
 * In all cases, SMS is optional and only dependent on receiveInboxSmsEmailNotifications

Updated tests and i18n
2009-08-16 09:42:35 +00:00

351 lines
12 KiB
Perl

# vim:syntax=perl
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#------------------------------------------------------------------
# This script tests the creation, sending, and queuing of mail messages
# TODO: There is plenty left to do in this script.
use strict;
use FindBin;
use lib "$FindBin::Bin/../lib";
use JSON qw( from_json to_json );
use Test::More;
use Test::Deep;
use Data::Dumper;
use MIME::Parser;
use Encode qw/decode/;
use WebGUI::Test;
use WebGUI::Mail::Send;
$| = 1;
#----------------------------------------------------------------------------
# Init
my $session = WebGUI::Test->session;
my $mail; # The WebGUI::Mail::Send object
my $mime; # for getMimeEntity
# See if we have an SMTP server to use
my $hasServer = 0;
eval { WebGUI::Test->prepareMailServer; $hasServer = 1 };
if ( $@ ) { diag( "Can't prepare mail server: $@" ) }
#----------------------------------------------------------------------------
# Tests
plan tests => 16; # Increment this number for each test you create
#----------------------------------------------------------------------------
# Test create
$mail = WebGUI::Mail::Send->create( $session );
isa_ok( $mail, 'WebGUI::Mail::Send',
"WebGUI::Mail::Send->create returns a WebGUI::Mail::Send object",
);
# Test that getMimeEntity works
$mime = $mail->getMimeEntity;
isa_ok( $mime, 'MIME::Entity',
"getMimeEntity",
);
# Test that create gets the appropriate defaults
# TODO
#----------------------------------------------------------------------------
# Test addText
$mail = WebGUI::Mail::Send->create( $session );
my $text = <<'EOF';
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse eu lacus ut ligula fringilla elementum. Cras condimentum, velit commodo pretium semper, odio ante accumsan orci, a ultrices risus justo a nulla. Aliquam erat volutpat.
EOF
$mail->addText($text);
$mime = $mail->getMimeEntity;
# addText should add newlines after 78 characters
my $newlines = length $text / 78;
is( $mime->parts(0)->as_string =~ m/\n/, $newlines,
"addText should add newlines after 78 characters",
);
#----------------------------------------------------------------------------
# Test addHtml
$mail = WebGUI::Mail::Send->create( $session );
$text = <<'EOF';
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse eu lacus ut ligula fringilla elementum. Cras condimentum, velit commodo pretium semper, odio ante accumsan orci, a ultrices risus justo a nulla. Aliquam erat volutpat.
EOF
$mail->addHtml($text);
$mime = $mail->getMimeEntity;
# TODO: Test that addHtml creates an HTML wrapper if no html or body tag exists
# TODO: Test that addHtml creates a body with the right content type
# addHtml should add newlines after 78 characters
$newlines = length $text / 78;
is( $mime->parts(0)->as_string =~ m/\n/, $newlines,
"addHtml should add newlines after 78 characters",
);
# TODO: Test that addHtml does not create an HTML wrapper if html or body tag exist
#----------------------------------------------------------------------------
# Test addHtmlRaw
$mail = WebGUI::Mail::Send->create( $session );
$text = <<'EOF';
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse eu lacus ut ligula fringilla elementum. Cras condimentum, velit commodo pretium semper, odio ante accumsan orci, a ultrices risus justo a nulla. Aliquam erat volutpat.
EOF
$mail->addHtmlRaw($text);
$mime = $mail->getMimeEntity;
# TODO: Test that addHtmlRaw doesn't add an HTML wrapper
# addHtmlRaw should add newlines after 78 characters
$newlines = length $text / 78;
is( $mime->parts(0)->as_string =~ m/\n/, $newlines,
"addHtmlRaw should add newlines after 78 characters",
);
# TODO: Test that addHtml creates a body with the right content type
my $smtpServerOk = 0;
#----------------------------------------------------------------------------
# Test emailOverride
SKIP: {
my $numtests = 2; # Number of tests in this block
# Must be able to write the config, or we'll die
if ( !-w File::Spec->catfile( WebGUI::Test::root, 'etc', WebGUI::Test::file() ) ) {
skip "Cannot test emailOverride: Can't write new configuration value", $numtests;
}
# Must have an SMTP server, or it's pointless
if ( !$hasServer ) {
skip "Cannot test emailOverride: Module Net::SMTP::Server not loaded!", $numtests;
}
sleep 1;
$smtpServerOk = 1;
# Override the emailOverride
my $oldEmailOverride = $session->config->get('emailOverride');
$session->config->set( 'emailOverride', 'dufresne@localhost' );
# Send the mail
my $mail
= WebGUI::Mail::Send->create( $session, {
to => 'norton@localhost',
} );
$mail->addText( 'His judgement cometh and that right soon.' );
$mail->send;
my $received = WebGUI::Test->getMail;
if (!$received) {
skip "Cannot test emailOverride: No response received from smtpd", $numtests;
}
# Test the mail
like( $received->{to}->[0], qr/dufresne\@localhost/,
"Email TO: address is overridden",
);
my $parser = MIME::Parser->new();
$parser->output_to_core(1);
my $parsed_message = $parser->parse_data($received->{contents});
my $head = $parsed_message->head;
my $messageId = decode('MIME-Header', $head->get('Message-Id'));
like ($messageId, qr/^<WebGUI-([a-zA-Z0-9\-_]){22}@\w+\.\w{2,4}>$/, 'Message-Id is valid');
# Restore the emailOverride
$session->config->set( 'emailOverride', $oldEmailOverride );
}
SKIP: {
my $numtests = 4; # Number of tests in this block
skip "Cannot test message ids", $numtests unless $smtpServerOk;
# Send the mail
my $mail
= WebGUI::Mail::Send->create( $session, {
to => 'norton@localhost',
} );
$mail->addText( "I understand you're a man who knows how to get things." );
$mail->send;
my $received = WebGUI::Test->getMail;
if (!$received) {
skip "Cannot test messageIds: No response received from smtpd", $numtests;
}
# Test the mail
my $parser = MIME::Parser->new();
$parser->output_to_core(1);
my $parsed_message = $parser->parse_data($received->{contents});
my $head = $parsed_message->head;
my $messageId = decode('MIME-Header', $head->get('Message-Id'));
chomp $messageId;
like ($messageId, qr/^<WebGUI-([a-zA-Z0-9\-_]){22}@\w+\.\w{2,4}>$/, 'generated Message-Id is valid');
# Send the mail
$mail
= WebGUI::Mail::Send->create( $session, {
to => 'norton@localhost',
messageId => '<leadingAngleOnly@localhost.localdomain',
} );
$mail->addText( "What say you there, fuzzy-britches? Feel like talking?" );
$mail->send;
$received = WebGUI::Test->getMail;
$parsed_message = $parser->parse_data($received->{contents});
$head = $parsed_message->head;
$messageId = decode('MIME-Header', $head->get('Message-Id'));
chomp $messageId;
is($messageId, '<leadingAngleOnly@localhost.localdomain>', 'bad messageId corrected (added ending angle)');
# Send the mail
$mail
= WebGUI::Mail::Send->create( $session, {
to => 'norton@localhost',
messageId => 'endingAngleOnly@localhost.localdomain>',
} );
$mail->addText( "Dear Warden, You were right. Salvation lies within." );
$mail->send;
$received = WebGUI::Test->getMail;
$parsed_message = $parser->parse_data($received->{contents});
$head = $parsed_message->head;
$messageId = decode('MIME-Header', $head->get('Message-Id'));
chomp $messageId;
is($messageId, '<endingAngleOnly@localhost.localdomain>', 'bad messageId corrected (added starting angle)');
# Send the mail
$mail
= WebGUI::Mail::Send->create( $session, {
to => 'red@localhost',
messageId => 'noAngles@localhost.localdomain',
} );
$mail->addText( "Neither are they. You have to be human first. They don't qualify." );
$mail->send;
$received = WebGUI::Test->getMail;
$parsed_message = $parser->parse_data($received->{contents});
$head = $parsed_message->head;
$messageId = decode('MIME-Header', $head->get('Message-Id'));
chomp $messageId;
is($messageId, '<noAngles@localhost.localdomain>', 'bad messageId corrected (added both angles)');
}
#----------------------------------------------------------------------------
#
# Test sending an Inbox message to a user who has various notifications configured
#
#----------------------------------------------------------------------------
my $inboxUser = WebGUI::User->create($session);
WebGUI::Test->usersToDelete($inboxUser);
$inboxUser->username('red');
$inboxUser->profileField('receiveInboxEmailNotifications', 1);
$inboxUser->profileField('receiveInboxSmsNotifications', 0);
$inboxUser->profileField('email', 'ellis_boyd_redding@shawshank.gov');
$inboxUser->profileField('cellPhone', '55555');
$session->setting->set('smsGateway', 'textme.com');
my $emailUser = WebGUI::User->create($session);
WebGUI::Test->usersToDelete($emailUser);
$emailUser->username('heywood');
$emailUser->profileField('email', 'heywood@shawshank.gov');
my $lonelyUser = WebGUI::User->create($session);
WebGUI::Test->usersToDelete($lonelyUser);
$lonelyUser->profileField('receiveInboxEmailNotifications', 0);
$lonelyUser->profileField('email', 'jake@shawshank.gov');
my $inboxGroup = WebGUI::Group->new($session, 'new');
WebGUI::Test->groupsToDelete($inboxGroup);
$inboxGroup->addUsers([$emailUser->userId, $inboxUser->userId, $lonelyUser->userId]);
SKIP: {
my $numtests = 3; # Number of tests in this block
# Must be able to write the config, or we'll die
skip "Cannot test email notifications", $numtests unless $smtpServerOk;
# Send the mail
$mail = WebGUI::Mail::Send->create( $session, {
toUser => $inboxUser->userId,
},
'fromInbox',
);
$mail->addText( 'sent via email' );
$mail->send;
my $received = WebGUI::Test->getMail;
# Test the mail
is($received->{to}->[0], '<ellis_boyd_redding@shawshank.gov>', 'send, toUser with email address');
}
#----------------------------------------------------------------------------
#
# Test sending an Inbox message to a group with various user profile settings
#
#----------------------------------------------------------------------------
my @mailIds;
@mailIds = $session->db->buildArray('select messageId from mailQueue');
my $startingMessages = scalar @mailIds;
$mail = WebGUI::Mail::Send->create( $session, {
toGroup => $inboxGroup->getId,
},
'fromInbox',
);
$mail->addText('Mail::Send test message');
@mailIds = $session->db->buildArray('select messageId from mailQueue');
is(scalar @mailIds, $startingMessages, 'creating a message does not queue a message');
$mail->send;
@mailIds = $session->db->buildArray('select messageId from mailQueue');
is(scalar @mailIds, $startingMessages+2, 'sending a message with a group added two messages');
@mailIds = $session->db->buildArray("select messageId from mailQueue where message like ?",['%Mail::Send test message%']);
is(scalar @mailIds, $startingMessages+2, 'sending a message with a group added the right two messages');
my @emailAddresses = ();
foreach my $mailId (@mailIds) {
my $mail = WebGUI::Mail::Send->retrieve($session, $mailId);
push @emailAddresses, $mail->getMimeEntity->head->get('to');
}
cmp_bag(
\@emailAddresses,
[
'heywood@shawshank.gov'."\n",
'ellis_boyd_redding@shawshank.gov'."\n",
],
'send: when the original is sent, new messages are created for each user in the group, following their user profile settings'
);
# TODO: Test the emailToLog config setting
#----------------------------------------------------------------------------
# Cleanup
END {
$session->db->write('delete from mailQueue');
}