package Silki::Test::Email;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( clear_emails test_email );
use List::AllUtils qw( first );
use Test::More;
$ENV{EMAIL_SENDER_TRANSPORT} = 'Test';
sub clear_emails {
Email::Sender::Simple->default_transport()->clear_deliveries();
}
sub test_email {
my $headers = shift;
my $html_re = shift;
my $text_re = shift;
local $Test::Builder::Level = $Test::Builder::Level + 1;
my @deliveries = Email::Sender::Simple->default_transport()->deliveries();
is( scalar @deliveries, 1, 'one email was sent' );
my $email = $deliveries[0]{email}->cast('Email::MIME');
for my $header ( sort keys %{$headers} ) {
my $expect = $headers->{$header};
if ( ref $expect ) {
like(
scalar $email->header($header),
$expect,
"$header matches regex"
);
}
else {
is(
scalar $email->header($header),
$expect,
"$header header is correct"
);
}
}
my @parts = $email->parts();
my $html = first { $_->content_type() =~ m{^text/html} } @parts;
ok( $html, 'found an HTML part' );
is(
$html->content_type(),
'text/html; charset=utf-8',
'html content type is text/html and includes charset'
);
like(
$html->body(),
$html_re,
'html body matches regex'
);
my $text = first { $_->content_type() =~ m{^text/plain} } @parts;
ok( $text, 'found plain text part' );
is(
$text->content_type(),
'text/plain; charset=utf-8',
'text content type is text/plain and includes charset'
);
like(
$text->body,
$text_re,
'plain text body matches regex'
);
}
1;