use warnings; use strict; package Jifty::Test::Email; use Test::More; use Test::Email; use Email::Abstract; use base 'Exporter'; our @EXPORT = qw(mail_ok); =head1 NAME Jifty::Test::Email - Test mail notification =head1 SYNOPSIS use Jifty::Test::Email; mail_ok { # ... code } { from => 'admin@localhost', body => qr('hello') }, { from => 'admin@localhost', body => qr('hello again') }; # ... more code # XXX: not yet mail_sent_ok { from => 'admin@localhost', body => qr('hello') }; # you should expect all mails by the end of the test =head1 DESCRIPTION This is a test helper module for jifty, allowing you to expect mail notification generated during the block or the test. =head1 METHODS =head2 mail_ok BLOCK HASHREF [, HASHREF ...] Executes the C, and expects it to send a number of emails equal to the number of Cs after the C. L is used to check if the messages match up to the appropriate hashrefs. =cut sub mail_ok (&@) { my $code = shift; # XXX. ensure mailbox is empty; but make sure the test count is correct $code->(); local $Test::Builder::Level = $Test::Builder::Level + 1; my @msgs = Jifty::Test->messages; is(@msgs, @_, "Sent exactly " . @_ . " emails"); for my $spec (@_) { my $msg = shift @msgs or ok(0, 'Expecting message but none found.'), next; my $te = Email::Abstract->new($msg)->cast('MIME::Entity'); bless $te, 'Test::Email'; $te->ok($spec, "email matched") or diag $msg->as_string; } Jifty::Test->setup_mailbox; } =head1 ENDING TESTS An END block causes the test to C if there are uncaught notifications at the end of the test script. =cut END { my $Test = Jifty::Test->builder; # Such a hack -- try to detect if this is a forked copy and don't # do cleanup in that case. return if $Test->{Original_Pid} != $$; if (scalar Jifty::Test->messages) { diag ((scalar Jifty::Test->messages)." uncaught notification email at end of test: "); diag "From: @{[ $_->header('From' ) ]}, Subject: @{[ $_->header('Subject') ]}" for Jifty::Test->messages; die; } } 1;