diff options
Diffstat (limited to 't/app/helpers/send_email.t')
-rw-r--r-- | t/app/helpers/send_email.t | 137 |
1 files changed, 107 insertions, 30 deletions
diff --git a/t/app/helpers/send_email.t b/t/app/helpers/send_email.t index 8c043f701..66b771292 100644 --- a/t/app/helpers/send_email.t +++ b/t/app/helpers/send_email.t @@ -1,57 +1,134 @@ -#!/usr/bin/perl - use strict; use warnings; use utf8; +package FixMyStreet::Cobrand::Tester; +use parent 'FixMyStreet::Cobrand::Default'; +sub path_to_email_templates { [ FixMyStreet->path_to( 't', 'app', 'helpers', 'emails') ] } + +package main; + BEGIN { use FixMyStreet; FixMyStreet->test_mode(1); } -use Test::More tests => 6; +use Email::MIME; +use Test::More; +use Test::LongString; + +use Catalyst::Test 'FixMyStreet::App'; -use Email::Send::Test; -use Path::Class; +use Path::Tiny; -use_ok 'FixMyStreet::App'; -my $c = FixMyStreet::App->new( - { - request => Catalyst::Request->new( - { - base => URI->new('http://fixmystreet.com/'), - uri => URI->new('http://fixmystreet.com/') - } - ), - } -); -$c->setup_request(); +use FixMyStreet::TestMech; +my $mech = FixMyStreet::TestMech->new; + +my $c = ctx_request("/"); # set some values in the stash $c->stash->{foo} = 'bar'; # clear the email queue -Email::Send::Test->clear; +$mech->clear_emails_ok; # send the test email -ok $c->send_email( 'test.txt', { to => 'test@recipient.com' } ), - "sent an email"; +FixMyStreet::override_config { + ALLOWED_COBRANDS => [ 'tester' ], +}, sub { + ok $c->send_email( 'test.txt', { to => 'test@recipient.com' } ), + "sent an email"; +}; # check it got templated and sent correctly -my @emails = Email::Send::Test->emails; +my @emails = $mech->get_email; is scalar(@emails), 1, "caught one email"; # Get the email, check it has a date and then strip it out -my $email_as_string = $emails[0]->as_string; -ok $email_as_string =~ s{\s+Date:\s+\S.*?$}{}xms, "Found and stripped out date"; -ok $email_as_string =~ s{\s+Message-ID:\s+\S.*?$}{}xms, "Found and stripped out message ID (contains epoch)"; +my $email_as_string = $mech->get_first_email(@emails); +my $email = Email::MIME->new($email_as_string); -my $expected_email_content = file(__FILE__)->dir->file('send_email_sample.txt')->slurp; +my $expected_email_content = path(__FILE__)->parent->child('send_email_sample.txt')->slurp; my $name = FixMyStreet->config('CONTACT_NAME'); -$name = "\"$name\"" if $name =~ / /; -my $sender = $name . ' <' . FixMyStreet->config('CONTACT_EMAIL') . '>'; +my $sender = '"' . $name . '" <' . FixMyStreet->config('DO_NOT_REPLY_EMAIL') . '>'; $expected_email_content =~ s{CONTACT_EMAIL}{$sender}; +my $expected_email = Email::MIME->new($expected_email_content); + +is_deeply { $email->header_pairs }, { $expected_email->header_pairs }, 'MIME email headers ok'; +is_string $email->body, $expected_email->body, 'email is as expected'; + +subtest 'MIME attachments' => sub { + my $data = path(__FILE__)->parent->child('grey.gif')->slurp_raw; + + $mech->clear_emails_ok; + + ok $c->send_email( 'test.txt', + { to => 'test@recipient.com', + attachments => [ + { + body => $data, + attributes => { + filename => 'foo.gif', + content_type => 'image/gif', + encoding => 'quoted-printable', + name => 'foo.gif', + }, + }, + { + body => $data, + attributes => { + filename => 'bar.gif', + content_type => 'image/gif', + encoding => 'quoted-printable', + name => 'bar.gif', + }, + }, + ] + } ), "sent an email with MIME attachments"; + + @emails = $mech->get_email; + is scalar(@emails), 1, "caught one email"; + + my $email_as_string = $mech->get_first_email(@emails); + my ($boundary) = $email_as_string =~ /boundary="([A-Za-z0-9.]*)"/ms; + my $email = Email::MIME->new($email_as_string); + + my $expected_email_content = path(__FILE__)->parent->child('send_email_sample_mime.txt')->slurp; + $expected_email_content =~ s{CONTACT_EMAIL}{$sender}g; + $expected_email_content =~ s{BOUNDARY}{$boundary}g; + my $expected_email = Email::MIME->new($expected_email_content); + + my @email_parts; + $email->walk_parts(sub { + my ($part) = @_; + push @email_parts, [ { $part->header_pairs }, $part->body ]; + }); + my @expected_email_parts; + $expected_email->walk_parts(sub { + my ($part) = @_; + push @expected_email_parts, [ { $part->header_pairs }, $part->body ]; + }); + is_deeply \@email_parts, \@expected_email_parts, 'MIME email text ok' + or do { + (my $test_name = $0) =~ s{/}{_}g; + my $path = path("test-output-$test_name.tmp"); + $path->spew($email_as_string); + diag "Saved output in $path"; + }; + $mech->clear_emails_ok; +}; + +subtest 'Inline emails!' => sub { + ok $c->send_email( 'html_test.txt', { to => 'test@recipient.com' } ), "sent an email with email attachments"; + + my $email = $mech->get_email; + like $email->debug_structure, qr[ + \+\ multipart/related.*\n + \ {5}\+\ multipart/alternative.*\n + \ {10}\+\ text/plain.*\n + \ {10}\+\ text/html.*\n + \ {5}\+\ image/gif]x; + $mech->clear_emails_ok; +}; -is $email_as_string, -$expected_email_content, - "email is as expected"; +done_testing; |