aboutsummaryrefslogtreecommitdiffstats
path: root/t/app/helpers/send_email.t
blob: a692fb6bc58d5cf16948d66e259269584719f9e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package FixMyStreet::Cobrand::Tester;
use parent 'FixMyStreet::Cobrand::Default';
sub path_to_email_templates { [ FixMyStreet->path_to( 't', 'app', 'helpers', 'emails') ] }

package main;

use Email::MIME;
use Test::LongString;

use Catalyst::Test 'FixMyStreet::App';

use Path::Tiny;

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
$mech->clear_emails_ok;

# send the test 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 = $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 = $mech->get_first_email(@emails);
my $email = Email::MIME->new($email_as_string);

my $expected_email_content =   path(__FILE__)->parent->child('send_email_sample.txt')->slurp;
my $name = FixMyStreet->config('CONTACT_NAME');
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;
};

done_testing;