$:.unshift File.dirname(__FILE__) require 'test_helper' require 'tmail' require 'kcode' require 'time' class TestMail < Test::Unit::TestCase include TMail::TextUtils def setup @mail = TMail::Mail.new end def lf( str ) str.gsub(/\n|\r\n|\r/) { "\n" } end def crlf( str ) str.gsub(/\n|\r\n|\r/) { "\r\n" } end def test_MIME # FIXME: test more. kcode('EUC') { mail = TMail::Mail.parse('From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)') assert_not_nil mail['From'] assert_equal ["\245\306\245\271\245\310"], mail['From'].comments assert_equal "From: hoge@example.jp (\245\306\245\271\245\310)\n\n", mail.to_s assert_equal "From: hoge@example.jp (\245\306\245\271\245\310)\n\n", mail.decoded assert_equal "From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)\r\n\r\n", mail.encoded } end def test_to_s time = Time.parse('Tue, 4 Dec 2001 10:49:58 +0900').strftime("%a,%e %b %Y %H:%M:%S %z") str =< Subject: This is test message. This is body. EOS str = crlf(str) m = TMail::Mail.parse(str) # strip to avoid error by body's line terminator. assert_equal lf(str).strip, m.decoded.strip assert_equal crlf(str).strip, m.encoded.strip end def test__empty_return_path str = "Return-Path: <>\r\n\r\n" assert_equal str, TMail::Mail.parse(str).encoded end def test_date t = Time.now @mail.date = t assert_equal t.to_i, @mail.date.to_i # avoid usec comparison assert_equal time2str(t), @mail['date'].to_s str = "Date: #{time2str(t)}\n\n" assert_equal str, TMail::Mail.parse(str).to_s end def test_strftime t = Time.now fmt = '%A%a%B%b%c%d%H%I%j%M%m%p%S%U%W%w%X%x%Y%y%Z%%' @mail.date = t assert_equal t.strftime(fmt), @mail.strftime(fmt) end def test_to addr = 'Minero Aoki ' @mail.to = addr assert_equal 1, @mail['to'].addrs.size assert_equal 'aamine@loveruby.net', @mail['to'].addrs[0].spec assert_equal 'Minero Aoki', @mail['to'].addrs[0].phrase a = @mail.to_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.to assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] addr = TMail::Address.parse('Minero Aoki ') @mail.to_addrs = addr assert_equal 1, @mail['to'].addrs.size assert_equal 'aamine@loveruby.net', @mail['to'].addrs[0].spec assert_equal 'Minero Aoki', @mail['to'].addrs[0].phrase a = @mail.to_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.to assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] @mail.to = '' assert_equal nil, @mail.to assert_equal 'DEFAULT VALUE', @mail.to('DEFAULT VALUE') @mail.to = 'undisclosed-recipients: ;' a = @mail.to assert_equal nil, @mail.to assert_equal 'DEFAULT VALUE', @mail.to('DEFAULT VALUE') str = "\"Aoki, Minero\" \n\n" @mail.to_addrs = a = TMail::Address.parse(str) assert_equal ['aamine@loveruby.net'], @mail.to assert_equal [a], @mail.to_addrs assert_equal '"Aoki, Minero" ', @mail.to_addrs[0].to_s assert_equal '"Aoki, Minero" ', @mail['to'].to_s end def test_cc addr = 'Minero Aoki ' @mail.cc = addr assert_equal 1, @mail['cc'].addrs.size assert_equal 'aamine@loveruby.net', @mail['cc'].addrs[0].spec assert_equal 'Minero Aoki', @mail['cc'].addrs[0].phrase a = @mail.cc_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.cc assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] addr = TMail::Address.parse('Minero Aoki ') @mail.cc_addrs = addr assert_equal 1, @mail['cc'].addrs.size assert_equal 'aamine@loveruby.net', @mail['cc'].addrs[0].spec assert_equal 'Minero Aoki', @mail['cc'].addrs[0].phrase a = @mail.cc_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.cc assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] @mail.cc = '' assert_equal nil, @mail.cc assert_equal 'DEFAULT VALUE', @mail.cc('DEFAULT VALUE') @mail.cc = 'undisclosed-recipients: ;' a = @mail.cc assert_equal nil, @mail.cc assert_equal 'DEFAULT VALUE', @mail.cc('DEFAULT VALUE') end def test_bcc addr = 'Minero Aoki ' @mail.bcc = addr assert_equal 1, @mail['bcc'].addrs.size assert_equal 'aamine@loveruby.net', @mail['bcc'].addrs[0].spec assert_equal 'Minero Aoki', @mail['bcc'].addrs[0].phrase a = @mail.bcc_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.bcc assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] addr = TMail::Address.parse('Minero Aoki ') @mail.bcc_addrs = addr assert_equal 1, @mail['bcc'].addrs.size assert_equal 'aamine@loveruby.net', @mail['bcc'].addrs[0].spec assert_equal 'Minero Aoki', @mail['bcc'].addrs[0].phrase a = @mail.bcc_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.bcc assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] @mail.bcc = '' assert_equal nil, @mail.bcc assert_equal 'DEFAULT VALUE', @mail.bcc('DEFAULT VALUE') @mail.bcc = 'undisclosed-recipients: ;' a = @mail.bcc assert_equal nil, @mail.bcc assert_equal 'DEFAULT VALUE', @mail.bcc('DEFAULT VALUE') end def test_from addr = 'Minero Aoki ' @mail.from = addr assert_equal 1, @mail['from'].addrs.size assert_equal 'aamine@loveruby.net', @mail['from'].addrs[0].spec assert_equal 'Minero Aoki', @mail['from'].addrs[0].phrase a = @mail.from_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.from assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] addr = TMail::Address.parse('Minero Aoki ') @mail.from_addrs = addr assert_equal 1, @mail['from'].addrs.size assert_equal 'aamine@loveruby.net', @mail['from'].addrs[0].spec assert_equal 'Minero Aoki', @mail['from'].addrs[0].phrase a = @mail.from_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.from assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] @mail.from = '' assert_equal nil, @mail.from assert_equal 'DEFAULT VALUE', @mail.from('DEFAULT VALUE') @mail.from = 'undisclosed-recipients: ;' a = @mail.from assert_equal nil, @mail.from assert_equal 'DEFAULT VALUE', @mail.from('DEFAULT VALUE') end def test_reply_to addr = 'Minero Aoki ' @mail.reply_to = addr assert_equal 1, @mail['reply-to'].addrs.size assert_equal 'aamine@loveruby.net', @mail['reply-to'].addrs[0].spec assert_equal 'Minero Aoki', @mail['reply-to'].addrs[0].phrase a = @mail.reply_to_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.reply_to assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] addr = TMail::Address.parse('Minero Aoki ') @mail.reply_to_addrs = addr assert_equal 1, @mail['reply-to'].addrs.size assert_equal 'aamine@loveruby.net', @mail['reply-to'].addrs[0].spec assert_equal 'Minero Aoki', @mail['reply-to'].addrs[0].phrase a = @mail.reply_to_addrs assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.reply_to assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] @mail.reply_to = '' assert_equal nil, @mail.reply_to assert_equal 'DEFAULT VALUE', @mail.reply_to('DEFAULT VALUE') @mail.reply_to = 'undisclosed-recipients: ;' a = @mail.reply_to assert_equal nil, @mail.reply_to assert_equal 'DEFAULT VALUE', @mail.reply_to('DEFAULT VALUE') end def test_reply_to_with_blank_reply_to @mail = TMail::Mail.new from_addr = TMail::Address.parse("Mikel Lindsaar ") @mail.from = from_addr # No reply_to set, should return from address assert_equal([from_addr], @mail.reply_addresses) # reply_to and from set, should return reply_to reply_addr = TMail::Address.parse("Bob ") @mail.reply_to = reply_addr assert_equal([reply_addr], @mail.reply_addresses) # reply_to set but nil, should return from address @mail.reply_to = nil assert_equal([from_addr], @mail.reply_addresses) # from and reply_to set, but nil, should return empty array @mail.from = nil assert_equal([], @mail.reply_addresses) end def do_test_address_attr( name ) addr = 'Minero Aoki ' @mail.__send__( name + '=', addr ) a = @mail.__send__( name + '_addrs' ) assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0].spec assert_equal 'Minero Aoki', a[0].phrase a = @mail.__send__( name ) assert_equal 1, a.size assert_equal 'aamine@loveruby.net', a[0] end def test_subject s = 'This is test subject!' @mail.subject = s assert_equal s, @mail.subject assert_equal s, @mail['subject'].to_s end def test_unquote_quoted_printable_subject msg = <'sample.rb' assert_equal 'attachment', @mail.disposition assert_equal 'sample.rb', @mail.disposition_param('filename') end def test_receive_attachments fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email2") mail = TMail::Mail.parse(fixture) attachment = mail.attachments.last assert_equal "smime.p7s", attachment.original_filename assert_equal "application/pkcs7-signature", attachment.content_type end def test_body_with_underscores m = TMail::Mail.new expected = 'something_with_underscores' m.encoding = 'quoted-printable' quoted_body = [expected].pack('*M') m.body = quoted_body assert_equal "something_with_underscores=\n", m.quoted_body assert_equal expected, m.body end def test_nested_attachments_are_recognized_correctly mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email_with_nested_attachment") assert_equal 2, mail.attachments.length assert_equal "image/png", mail.attachments.first.content_type assert_equal 1902, mail.attachments.first.length assert_equal "application/pkcs7-signature", mail.attachments.last.content_type end def test_decode_attachment_without_charset mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email3") attachment = mail.attachments.last assert_equal 1026, attachment.read.length end def test_attachment_using_content_location fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email12") mail = TMail::Mail.parse(fixture) assert_equal 1, mail.attachments.length assert_equal "Photo25.jpg", mail.attachments.first.original_filename end def test_attachment_with_text_type fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email13") mail = TMail::Mail.parse(fixture) assert mail.has_attachments? assert_equal 1, mail.attachments.length assert_equal "hello.rb", mail.attachments.first.original_filename end def test_decode_part_without_content_type fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4") mail = TMail::Mail.parse(fixture) assert_nothing_raised { mail.body } end def test_decode_message_without_content_type mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email4") assert_nothing_raised { mail.body } end def test_decode_message_with_incorrect_charset fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email6") mail = TMail::Mail.parse(fixture) assert_nothing_raised { mail.body } end def test_quoting_of_illegal_boundary_when_doing_mail_to_s mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email_with_illegal_boundary") assert_equal(true, mail.multipart?) assert_equal('multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"', mail['content-type'].to_s) end def test_quoted_illegal_boundary_when_doing_mail_to_s mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email_with_quoted_illegal_boundary") assert_equal(true, mail.multipart?) assert_equal('multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"', mail['content-type'].to_s) end def test_quoted_illegal_boundary_with_multipart_mixed_when_doing_mail_to_s mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email_with_multipart_mixed_quoted_boundary") assert_equal(true, mail.multipart?) assert_equal('multipart/mixed; boundary="----=_Part_2192_32400445.1115745999735"', mail['content-type'].to_s) end def test_when_opening_a_base64_encoded_email_and_re_parsing_it_keeps_the_transfer_encoding_correct mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_base64_email") assert_equal("Base64", mail['Content-Transfer-Encoding'].to_s) decoded_mail = TMail::Mail.parse(mail.to_s) assert_equal("Base64", decoded_mail['Content-Transfer-Encoding'].to_s) end def test_create_reply mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email") reply = mail.create_reply assert_equal([""], reply.in_reply_to) assert_equal([""], reply.references) assert_equal(TMail::Mail, mail.create_reply.class) end def test_create_forward mail = TMail::Mail.load("#{File.dirname(__FILE__)}/fixtures/raw_email") forward = mail.create_forward assert_equal(true, forward.multipart?) assert_equal(TMail::Mail, forward.class) end def test_body m = TMail::Mail.new expected = 'something_with_underscores' m.encoding = 'quoted-printable' quoted_body = [expected].pack('*M') m.body = quoted_body assert_equal "something_with_underscores=\n", m.quoted_body assert_equal expected, m.body end def test_nested_attachments_are_recognized_correctly fixture = File.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_nested_attachment") mail = TMail::Mail.parse(fixture) assert_equal 2, mail.attachments.length assert_equal "image/png", mail.attachments.first.content_type assert_equal 1902, mail.attachments.first.length assert_equal "application/pkcs7-signature", mail.attachments.last.content_type end end