# encoding: utf-8 require 'spec_helper' describe Postmark::MailMessageConverter do subject { Postmark::MailMessageConverter } let(:mail_message) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" body "Hello Sheldon!" end end let(:mail_html_message) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" content_type 'text/html; charset=UTF-8' body "Hello Sheldon!" end end let(:mail_message_with_open_tracking) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" content_type 'text/html; charset=UTF-8' body "Hello Sheldon!" track_opens true end end let(:mail_message_with_open_tracking_disabled) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" content_type 'text/html; charset=UTF-8' body "Hello Sheldon!" track_opens false end end let(:mail_message_with_open_tracking_set_variable) do mail = mail_html_message mail.track_opens=true mail end let(:mail_message_with_open_tracking_disabled_set_variable) do mail = mail_html_message mail.track_opens=false mail end let(:mail_message_with_link_tracking_all) do mail = mail_html_message mail.track_links :html_and_text mail end let(:mail_message_with_link_tracking_html) do mail = mail_html_message mail.track_links = :html_only mail end let(:mail_message_with_link_tracking_text) do mail = mail_html_message mail.track_links = :text_only mail end let(:mail_message_with_link_tracking_none) do mail = mail_html_message mail.track_links = :none mail end let(:tagged_mail_message) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" body "Hello Sheldon!" tag "sheldon" end end let(:mail_message_without_body) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" end end let(:mail_multipart_message) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" text_part do body "Hello Sheldon!" end html_part do body "Hello Sheldon!" end end end let(:mail_message_with_attachment) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" body "Hello Sheldon!" add_file empty_gif_path end end let(:mail_message_with_named_addresses) do Mail.new do from "Sheldon " to "\"Leonard Hofstadter\" " subject "Hello!" body "Hello Sheldon!" reply_to '"Penny The Neighbor" ' end end let(:mail_message_quoted_printable) do Mail.new do from "Sheldon " to "\"Leonard Hofstadter\" " subject "Hello!" content_type 'text/plain; charset=utf-8' content_transfer_encoding 'quoted-printable' body 'Он здесь бывал: еще не в галифе.' reply_to '"Penny The Neighbor" ' end end let(:multipart_message_quoted_printable) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" subject "Hello!" text_part do content_type 'text/plain; charset=utf-8' content_transfer_encoding 'quoted-printable' body 'Загадочное послание.' end html_part do content_type 'text/html; charset=utf-8' content_transfer_encoding 'quoted-printable' body 'Загадочное послание.' end end end let(:templated_message) do Mail.new do from "sheldon@bigbangtheory.com" to "lenard@bigbangtheory.com" template_alias "hello" template_model :name => "Sheldon" end end it 'converts plain text messages correctly' do subject.new(mail_message).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "TextBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com"} end it 'converts tagged text messages correctly' do subject.new(tagged_mail_message).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "TextBody" => "Hello Sheldon!", "Tag" => "sheldon", "To"=>"lenard@bigbangtheory.com"} end it 'converts plain text messages without body correctly' do subject.new(mail_message_without_body).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "To" => "lenard@bigbangtheory.com"} end it 'converts html messages correctly' do subject.new(mail_html_message).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com"} end it 'converts multipart messages correctly' do subject.new(mail_multipart_message).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "TextBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com"} end it 'converts messages with attachments correctly' do subject.new(mail_message_with_attachment).run.should == { "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "Attachments" => [{"Name"=>"empty.gif", "Content"=>encoded_empty_gif_data, "ContentType"=>"image/gif"}], "TextBody"=>"Hello Sheldon!", "To"=>"lenard@bigbangtheory.com"} end it 'converts messages with named addresses correctly' do subject.new(mail_message_with_named_addresses).run.should == { "From" => "Sheldon ", "Subject" => "Hello!", "TextBody" => "Hello Sheldon!", "To" => "Leonard Hofstadter ", "ReplyTo" => 'Penny The Neighbor '} end it 'convertes templated messages correctly' do expect(subject.new(templated_message).run). to eq("From" => "sheldon@bigbangtheory.com", "TemplateAlias" => "hello", "TemplateModel" => { :name => "Sheldon" }, "To" => "lenard@bigbangtheory.com") end context 'open tracking' do context 'setup inside of mail' do it 'converts open tracking enabled messages correctly' do expect(subject.new(mail_message_with_open_tracking).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackOpens" => true}) end it 'converts open tracking disabled messages correctly' do expect(subject.new(mail_message_with_open_tracking_disabled).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackOpens" => false}) end end context 'setup with tracking variable' do it 'converts open tracking enabled messages correctly' do expect(subject.new(mail_message_with_open_tracking_set_variable).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackOpens" => true}) end it 'converts open tracking disabled messages correctly' do expect(subject.new(mail_message_with_open_tracking_disabled_set_variable).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackOpens" => false}) end end end context 'link tracking' do it 'converts html and text link tracking enabled messages correctly' do expect(subject.new(mail_message_with_link_tracking_all).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackLinks" => 'HtmlAndText'}) end it 'converts html only link tracking enabled messages correctly' do expect(subject.new(mail_message_with_link_tracking_html).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackLinks" => 'HtmlOnly'}) end it 'converts text only link tracking enabled messages correctly' do expect(subject.new(mail_message_with_link_tracking_text).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackLinks" => 'TextOnly'}) end it 'converts link tracking disabled messages correctly' do expect(subject.new(mail_message_with_link_tracking_none).run).to eq ({ "From" => "sheldon@bigbangtheory.com", "Subject" => "Hello!", "HtmlBody" => "Hello Sheldon!", "To" => "lenard@bigbangtheory.com", "TrackLinks" => 'None'}) end it 'converts link tracking options when set via header' do msg = mail_html_message msg[:track_links] = :html_and_text expect(subject.new(msg).run).to include('TrackLinks' => 'HtmlAndText') end end context 'metadata' do it 'converts single metadata field' do metadata = {:test => 'test'} msg = mail_html_message msg.metadata = metadata expect(subject.new(msg).run).to include('Metadata' => metadata) end it 'converts unicode metadata field metadata' do metadata = {:test => "Велик"} msg = mail_html_message msg.metadata = metadata expect(subject.new(msg).run).to include('Metadata' => metadata) end it 'converts multiple metadata fields' do metadata = {} 10.times { |i| metadata["test#{i+1}"] = "t"*80 } msg = mail_html_message msg.metadata = metadata expect(subject.new(msg).run).to include('Metadata' => metadata) end end it 'correctly decodes unicode in messages transfered as quoted-printable' do subject.new(mail_message_quoted_printable).run.should \ include('TextBody' => 'Он здесь бывал: еще не в галифе.') end it 'correctly decodes unicode in multipart quoted-printable messages' do subject.new(multipart_message_quoted_printable).run.should \ include('TextBody' => 'Загадочное послание.', 'HtmlBody' => 'Загадочное послание.') end context 'when bcc is empty' do it 'excludes bcc from message' do mail_message.bcc = nil mail_message.to_postmark_hash.keys.should_not include('Bcc') end end context 'when cc is empty' do it 'excludes cc from message' do mail_message.cc = nil mail_message.to_postmark_hash.keys.should_not include('Cc') end end end