From 32427b2032b12a7195249a2041e7aaa420b06e6a Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 25 Mar 2016 21:30:44 +0000 Subject: Refactor email handling to use Email::MIME alone. --- t/app/controller/questionnaire.t | 10 +-- t/app/helpers/send_email.t | 3 +- t/app/helpers/send_email_sample.txt | 4 +- t/app/helpers/send_email_sample_mime.txt | 106 ++++++++++++++----------------- t/app/model/alert_type.t | 2 +- t/cobrand/fixamingata.t | 8 +-- t/cobrand/zurich.t | 7 +- t/cobrand/zurich_attachments.txt | 73 ++++++++++----------- 8 files changed, 100 insertions(+), 113 deletions(-) (limited to 't') diff --git a/t/app/controller/questionnaire.t b/t/app/controller/questionnaire.t index 7718d5034..cad86a40d 100644 --- a/t/app/controller/questionnaire.t +++ b/t/app/controller/questionnaire.t @@ -63,8 +63,8 @@ my $email = $mech->get_email; ok $email, "got an email"; like $email->body, qr/fill in our short questionnaire/i, "got questionnaire email"; -like $email->body, qr/Testing =96 Detail/, 'email contains encoded character'; -is $email->header('Content-Type'), 'text/plain; charset="windows-1252"', 'in the right character set'; +like $email->body_str, qr/Testing \x{2013} Detail/, 'email contains encoded character'; +is $email->header('Content-Type'), 'text/plain; charset="utf-8"', 'in the right character set'; my ($token) = $email->body =~ m{http://.*?/Q/(\S+)}; ok $token, "extracted questionnaire token '$token'"; @@ -461,9 +461,9 @@ FixMyStreet::override_config { ok $email, "got an email"; $mech->clear_emails_ok; - like $email->body, qr/Testing =96 Detail/, 'email contains encoded character from user'; - like $email->body, qr/sak p=E5 FiksGataMi/, 'email contains encoded character from template'; - is $email->header('Content-Type'), 'text/plain; charset="windows-1252"', 'email is in right encoding'; + like $email->body_str, qr/Testing \x{2013} Detail/, 'email contains encoded character from user'; + like $email->body_str, qr/sak p\xe5 FiksGataMi/, 'email contains encoded character from template'; + is $email->header('Content-Type'), 'text/plain; charset="utf-8"', 'email is in right encoding'; }; $mech->delete_user('test@example.com'); diff --git a/t/app/helpers/send_email.t b/t/app/helpers/send_email.t index f60f7fa5a..e2c8688a8 100644 --- a/t/app/helpers/send_email.t +++ b/t/app/helpers/send_email.t @@ -41,8 +41,7 @@ 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'); -$name = "\"$name\"" if $name =~ / /; -my $sender = $name . ' <' . FixMyStreet->config('DO_NOT_REPLY_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); diff --git a/t/app/helpers/send_email_sample.txt b/t/app/helpers/send_email_sample.txt index 1ccce6a23..0f7406172 100644 --- a/t/app/helpers/send_email_sample.txt +++ b/t/app/helpers/send_email_sample.txt @@ -1,5 +1,5 @@ MIME-Version: 1.0 -Subject: test email =?utf-8?Q?=E2=98=BA?= +Subject: =?UTF-8?B?dGVzdCBlbWFpbCDimLo=?= Content-Type: text/plain; charset="utf-8" To: test@recipient.com Content-Transfer-Encoding: quoted-printable @@ -24,5 +24,3 @@ culpa qui officia deserunt mollit anim id est laborum. Yours,=20=20 FixMyStreet.=20= - - diff --git a/t/app/helpers/send_email_sample_mime.txt b/t/app/helpers/send_email_sample_mime.txt index c4ca97bcc..0649d1ceb 100644 --- a/t/app/helpers/send_email_sample_mime.txt +++ b/t/app/helpers/send_email_sample_mime.txt @@ -1,57 +1,49 @@ -MIME-Version: 1.0 -Subject: test email =?utf-8?Q?=E2=98=BA?= -Content-Type: multipart/mixed; boundary="BOUNDARY" -To: test@recipient.com -Content-Transfer-Encoding: 7bit -From: CONTACT_EMAIL - - ---BOUNDARY -MIME-Version: 1.0 -Subject: test email =?utf-8?Q?=E2=98=BA?= -Content-Type: text/plain; charset="utf-8" -To: test@recipient.com -Content-Transfer-Encoding: quoted-printable -From: CONTACT_EMAIL - -Hello, - -This is a test email where foo: bar. - -utf8: =E6=88=91=E4=BB=AC=E5=BA=94=E8=AF=A5=E8=83=BD=E5=A4=9F=E6=97=A0=E7=BC= -=9D=E5=A4=84=E7=90=86UTF8=E7=BC=96=E7=A0=81 - - indented_text - -long line: Lorem ipsum dolor sit amet, consectetur adipisicing elit, -sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. -Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris -nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in -reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla -pariatur. Excepteur sint occaecat cupidatat non proident, sunt in -culpa qui officia deserunt mollit anim id est laborum. - -Yours,=20=20 -FixMyStreet.=20= - - - ---BOUNDARY -MIME-Version: 1.0 -Content-Type: image/gif; name="foo.gif" -Content-Disposition: inline; filename="foo.gif" -Content-Transfer-Encoding: quoted-printable - -GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00= -=02=01L=00;= - ---BOUNDARY -MIME-Version: 1.0 -Content-Type: image/gif; name="bar.gif" -Content-Disposition: inline; filename="bar.gif" -Content-Transfer-Encoding: quoted-printable - -GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00= -=02=01L=00;= - ---BOUNDARY-- +MIME-Version: 1.0 +Subject: =?UTF-8?B?dGVzdCBlbWFpbCDimLo=?= +Content-Type: multipart/mixed; boundary="BOUNDARY" +To: test@recipient.com +Content-Transfer-Encoding: 7bit +From: CONTACT_EMAIL + + +--BOUNDARY +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +Hello, + +This is a test email where foo: bar. + +utf8: =E6=88=91=E4=BB=AC=E5=BA=94=E8=AF=A5=E8=83=BD=E5=A4=9F=E6=97=A0=E7=BC= +=9D=E5=A4=84=E7=90=86UTF8=E7=BC=96=E7=A0=81 + + indented_text + +long line: Lorem ipsum dolor sit amet, consectetur adipisicing elit, +sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris +nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in +reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla +pariatur. Excepteur sint occaecat cupidatat non proident, sunt in +culpa qui officia deserunt mollit anim id est laborum. + +Yours,=20=20 +FixMyStreet.=20= + +--BOUNDARY +Content-Type: image/gif; name="foo.gif" +Content-Disposition: inline; filename="foo.gif" +Content-Transfer-Encoding: quoted-printable + +GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00= +=02=01L=00;= + +--BOUNDARY +Content-Type: image/gif; name="bar.gif" +Content-Disposition: inline; filename="bar.gif" +Content-Transfer-Encoding: quoted-printable + +GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00= +=02=01L=00;= + +--BOUNDARY-- diff --git a/t/app/model/alert_type.t b/t/app/model/alert_type.t index 0130f404e..e94ee8ce1 100644 --- a/t/app/model/alert_type.t +++ b/t/app/model/alert_type.t @@ -287,7 +287,7 @@ foreach my $test ( desc => 'address only', addressLine => '18 North Bridge', locality => undef, - nearest => qr/: 18 North Bridge\n/, + nearest => qr/: 18 North Bridge\r?\n/, }, { desc => 'no fields', diff --git a/t/cobrand/fixamingata.t b/t/cobrand/fixamingata.t index 50b7713d1..0cf7a31fe 100644 --- a/t/cobrand/fixamingata.t +++ b/t/cobrand/fixamingata.t @@ -46,10 +46,10 @@ FixMyStreet::override_config { FixMyStreet::DB->resultset('Problem')->send_reports(); }; my $email = $mech->get_email; -like $email->header('Content-Type'), qr/iso-8859-1/, 'encoding looks okay'; +like $email->header('Content-Type'), qr/utf-8/, 'encoding looks okay'; like $email->header('Subject'), qr/Ny rapport: Test Test/, 'subject looks okay'; like $email->header('To'), qr/other\@example.org/, 'to line looks correct'; -like $email->body, qr/V=E4nligen,/, 'signature looks correct'; +like $email->body_str, qr/V\xe4nligen,/, 'signature looks correct'; $mech->clear_emails_ok; my $user = @@ -91,8 +91,8 @@ FixMyStreet::override_config { $mech->email_count_is(1); $email = $mech->get_email; -like $email->header('Content-Type'), qr/iso-8859-1/, 'encoding looks okay'; -like $email->body, qr/V=E4nligen,/, 'signature looks correct'; +like $email->header('Content-Type'), qr/utf-8/, 'encoding looks okay'; +like $email->body_str, qr/V\xe4nligen,/, 'signature looks correct'; $mech->clear_emails_ok; subtest "Test ajax decimal points" => sub { diff --git a/t/cobrand/zurich.t b/t/cobrand/zurich.t index 4734dc837..cf66136e5 100644 --- a/t/cobrand/zurich.t +++ b/t/cobrand/zurich.t @@ -661,7 +661,7 @@ subtest "external report triggers email" => sub { }; $email = $mech->get_email; my $report_id = $report->id; - like $email->header('Subject'), qr/Meldung #$report_id/, 'subject looks okay'; + like Encode::decode('MIME-Header', $email->header('Subject')), qr/Meldung #$report_id/, 'subject looks okay'; like $email->header('To'), qr/test\@example.com/, 'to line looks correct'; like $email->body, qr/$PUBLIC_RESPONSE/, 'public_response was passed on' or die $email->body; $mech->clear_emails_ok; @@ -894,6 +894,11 @@ subtest 'email images to external partners' => sub { my $expected_email_content = path(__FILE__)->parent->child('zurich_attachments.txt')->slurp; my $REPORT_ID = $report->id; + $expected_email_content =~ s{Subject: (.*?)\r?\n}{ + my $subj = Encode::decode('MIME-Header', $1); + $subj =~ s{REPORT_ID}{$REPORT_ID}g; + 'Subject: ' . Email::MIME::Encode::mime_encode($subj, "utf-8") . "\n"; + }eg; $expected_email_content =~ s{REPORT_ID}{$REPORT_ID}g; $expected_email_content =~ s{BOUNDARY}{$boundary}g; my $expected_email = Email::MIME->new($expected_email_content); diff --git a/t/cobrand/zurich_attachments.txt b/t/cobrand/zurich_attachments.txt index 4ccc90205..bdc4333bf 100644 --- a/t/cobrand/zurich_attachments.txt +++ b/t/cobrand/zurich_attachments.txt @@ -1,40 +1,33 @@ -MIME-Version: 1.0 -Subject: =?iso-8859-1?Q?Z=FCri?= wie neu: Weitergeleitete Meldung #REPORT_ID -Content-Type: multipart/mixed; boundary="BOUNDARY" -To: "External Body" -Content-Transfer-Encoding: 7bit -From: FixMyStreet - - ---BOUNDARY -MIME-Version: 1.0 -Subject: =?iso-8859-1?Q?Z=FCri?= wie neu: Weitergeleitete Meldung #REPORT_ID -Content-Type: text/plain; charset="iso-8859-1" -To: "External Body" -Content-Transfer-Encoding: quoted-printable -From: FixMyStreet - -Gr=FCezi External Body, - -=D6ffentliche URL: http://www.example.org/report/REPORT_ID - -Bei Fragen zu "Z=FCri wie neu" wenden Sie sich bitte an -gis-zentrum@zuerich.ch.= - - - ---BOUNDARY -MIME-Version: 1.0 -Content-Type: image/jpeg; name="REPORT_ID.0.jpeg" -Content-Disposition: inline; filename="REPORT_ID.0.jpeg" -Content-Transfer-Encoding: base64 - -/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP -ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e -Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABTAAEDAREA -AhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIIB//EAB8QAQAABAcAAAAAAAAAAAAAAAADBAbT -BxcYVVaUpf/EABcBAQEBAQAAAAAAAAAAAAAAAAAFBgT/xAAgEQEAAAQHAQAAAAAAAAAAAAAAAwQV -UgECFlNhodGx/9oADAMBAAIRAxEAPwCywAIozyxS5R58tbbujSW33j6zFRj3fGbKbjAGAgAACs9N -FCbtUfYg2mO1BM25e/V+lQeW3ISo/9k= - ---BOUNDARY-- +MIME-Version: 1.0 +Subject: =?iso-8859-1?Q?Z=FCri?= wie neu: Weitergeleitete Meldung #REPORT_ID +Content-Type: multipart/mixed; boundary="BOUNDARY" +To: "External Body" +Content-Transfer-Encoding: 7bit +From: "FixMyStreet" + + +--BOUNDARY +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +Gr=C3=BCezi External Body, + +=C3=96ffentliche URL: http://www.example.org/report/REPORT_ID + +Bei Fragen zu "Z=C3=BCri wie neu" wenden Sie sich bitte an +gis-zentrum@zuerich.ch.= + +--BOUNDARY +Content-Type: image/jpeg; name="REPORT_ID.0.jpeg" +Content-Disposition: inline; filename="REPORT_ID.0.jpeg" +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP +ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e +Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABTAAEDAREA +AhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIIB//EAB8QAQAABAcAAAAAAAAAAAAAAAADBAbT +BxcYVVaUpf/EABcBAQEBAQAAAAAAAAAAAAAAAAAFBgT/xAAgEQEAAAQHAQAAAAAAAAAAAAAAAwQV +UgECFlNhodGx/9oADAMBAAIRAxEAPwCywAIozyxS5R58tbbujSW33j6zFRj3fGbKbjAGAgAACs9N +FCbtUfYg2mO1BM25e/V+lQeW3ISo/9k= + +--BOUNDARY-- -- cgit v1.2.3 From e4707406bd816fb9b1bb2077b7452cc77dec3d94 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 25 Mar 2016 21:33:27 +0000 Subject: Fix/skip locale tests that don't pass on Mac OS X. --- t/app/01app.t | 4 ++++ t/i18n.t | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 't') diff --git a/t/app/01app.t b/t/app/01app.t index eb98b6319..df562b829 100644 --- a/t/app/01app.t +++ b/t/app/01app.t @@ -16,12 +16,16 @@ use Encode qw(encode); ok( request('/')->is_success, 'Request should succeed' ); +SKIP: { FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'tester' ], }, sub { + skip 'Test will not pass on Mac OS', 1 if $^O eq 'darwin'; + my $page = get('/'); my $num = encode('UTF-8', "12\N{NO-BREAK SPACE}345"); like $page, qr/$num/; }; +} done_testing(); diff --git a/t/i18n.t b/t/i18n.t index 3337f1a7f..550bc2358 100644 --- a/t/i18n.t +++ b/t/i18n.t @@ -56,7 +56,7 @@ my @EN_sorted = qw( A Å Ø Z ); my @NO_sorted = qw( A Z Ø Å ); my @default_sorted = qw( A Z Å Ø ); -{ +SKIP: { mySociety::Locale::negotiate_language( # 'en-gb,English,en_GB|cy,Cymraeg,cy_GB', 'en_GB' @@ -71,12 +71,16 @@ my @default_sorted = qw( A Z Å Ø ); is_deeply( [ keysort { $_ } @random_sorted ], \@default_sorted, "keysort correctly with no locale" ); + skip 'Will not pass on Mac', 1 if $^O eq 'darwin'; + # Note - this obeys the locale is_deeply( [ sort { strcoll( $a, $b ) } @random_sorted ], \@EN_sorted, "sort strcoll correctly with no locale (to 'en_GB')" ); } -{ +SKIP: { + skip 'Will not pass on Mac', 2 if $^O eq 'darwin'; + mySociety::Locale::negotiate_language( # 'en-gb,English,en_GB|cy,Cymraeg,cy_GB', 'en_GB' ); @@ -93,7 +97,9 @@ my @default_sorted = qw( A Z Å Ø ); \@EN_sorted, "sort strcoll correctly with use locale 'en_GB'" ); } -{ +SKIP: { + skip 'Will not pass on Mac', 2 if $^O eq 'darwin'; + mySociety::Locale::negotiate_language( # 'nb-no,Norwegian,nb_NO', 'nb_NO' ); -- cgit v1.2.3