# -*- coding: utf-8 -*- require 'spec_helper' require 'pp' describe MailAddress do it "normal case (commonly used)" do # address only line = 'johndoe@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('johndoe@example.com') expect(results[0].format(true)).to eq('johndoe@example.com') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) #
only line = '' results = MailAddress.parse(line) expect(results[0].format).to eq('johndoe@example.com') expect(results[0].format(true)).to eq('johndoe@example.com') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # name +
(single byte only) line = 'John Doe ' results = MailAddress.parse(line) expect(results[0].format).to eq('John Doe ') expect(results[0].format(true)).to eq('John Doe ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('John Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # name +
(multi byte) line = 'ジョン ドゥ ' results = MailAddress.parse(line) expect(results[0].format).to eq('"ジョン ドゥ" ') expect(results[0].format(true)).to eq('"ジョン ドゥ" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('ジョン ドゥ') expect(results[0].phrase).to eq('ジョン ドゥ') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) line = 'Amazon.co.jp アソシエイト・プログラム ' results = MailAddress.parse(line) expect(results[0].format).to eq('"Amazon.co.jp アソシエイト・プログラム" ') expect(results[0].format(true)).to eq('"Amazon.co.jp アソシエイト・プログラム" ') expect(results[0].address).to eq('associates@amazon.co.jp') expect(results[0].name).to eq('Amazon.co.jp アソシエイト・プログラム') expect(results[0].phrase).to eq('Amazon.co.jp アソシエイト・プログラム') expect(results[0].host).to eq('amazon.co.jp') expect(results[0].user).to eq('associates') expect(results[0].original).to eq(line) # name (includes parens) +
line = 'Example (Twitterより) ' results = MailAddress.parse(line) expect(results[0].format).to eq('"Example (Twitterより)" ') expect(results[0].format(true)).to eq('"Example (Twitterより)" ') expect(results[0].address).to eq('notify@twitter.com') expect(results[0].name).to eq('Example (Twitterより)') expect(results[0].phrase).to eq('Example (Twitterより)') expect(results[0].host).to eq('twitter.com') expect(results[0].user).to eq('notify') expect(results[0].original).to eq(line) # name +
(multi byte) name is quoted line = '"ジョン ドゥ" ' results = MailAddress.parse(line) expect(results[0].format).to eq('"ジョン ドゥ" ') expect(results[0].format(true)).to eq('"ジョン ドゥ" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('ジョン ドゥ') expect(results[0].phrase).to eq('ジョン ドゥ') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # address + (note) line = 'johndoe@example.com (John Doe)' results = MailAddress.parse(line) # expect(results[0].format).to eq('johndoe@example.com (John Doe)') # expect(results[0].format(true)).to eq('johndoe@example.com (John Doe)') expect(results[0].format).to eq('"(John Doe)" ') expect(results[0].format(true)).to eq('"(John Doe)" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('(John Doe)') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # address + (note) # nested paren line = 'johndoe@example.com (John (Mid) Doe)' results = MailAddress.parse(line) # expect(results[0].format).to eq('johndoe@example.com (John (Mid) Doe)') # expect(results[0].format(true)).to eq('johndoe@example.com (John (Mid) Doe)') expect(results[0].format).to eq('"(John (Mid) Doe)" ') expect(results[0].format(true)).to eq('"(John (Mid) Doe)" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John (Mid) Doe') expect(results[0].phrase).to eq('(John (Mid) Doe)') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # address + (note) # note has special char line = 'johndoe@example.com (John@Doe)' results = MailAddress.parse(line) # expect(results[0].format).to eq('johndoe@example.com (John@Doe)') # expect(results[0].format(true)).to eq('johndoe@example.com (John@Doe)') expect(results[0].format).to eq('"(John@Doe)" ') expect(results[0].format(true)).to eq('"(John@Doe)" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John@Doe') expect(results[0].phrase).to eq('(John@Doe)') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) line = 'johndoe@example.com (John, Doe)' results = MailAddress.parse(line) # expect(results[0].format).to eq('johndoe@example.com (John, Doe)') # expect(results[0].format(true)).to eq('johndoe@example.com (John, Doe)') expect(results[0].format).to eq('"(John, Doe)" ') expect(results[0].format(true)).to eq('"(John, Doe)" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John, Doe') expect(results[0].phrase).to eq('(John, Doe)') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # name +
+ (note) line = 'John Doe (Extra)' results = MailAddress.parse(line) expect(results[0].format).to eq('"John Doe (Extra)" ') expect(results[0].format(true)).to eq('"John Doe (Extra)" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John Doe (Extra)') expect(results[0].phrase).to eq('John Doe (Extra)') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # name +
(name has starting paren but doesn't have ending paren) line = 'John(Doe ' results = MailAddress.parse(line) expect(results[0].format).to eq('"John(Doe" ') expect(results[0].format(true)).to eq('"John(Doe" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John(Doe') expect(results[0].phrase).to eq('John(Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # ditto line = 'John ( Doe ' results = MailAddress.parse(line) expect(results[0].format).to eq('"John ( Doe" ') expect(results[0].format(true)).to eq('"John ( Doe" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('John ( Doe') expect(results[0].phrase).to eq('John ( Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) # "address1" line = '"michael@example.jp" ' results = MailAddress.parse(line) expect(results[0].format).to eq('"michael@example.jp" ') expect(results[0].format(true)).to eq('"michael@example.jp" ') expect(results[0].address).to eq('johndoe@example.com') expect(results[0].name).to eq('michael@example.jp') expect(results[0].phrase).to eq('michael@example.jp') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe') expect(results[0].original).to eq(line) end it "normal case (multiple address)" do line = "John 'M' Doe , 大阪 太郎 , localpartonly" results = MailAddress.parse(line) expect(results[0].format).to eq("John 'M' Doe ") expect(results[0].address).to eq("john@example.com") expect(results[0].name).to eq("John 'M' Doe") expect(results[0].phrase).to eq("John 'M' Doe") expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john') expect(results[0].original).to eq("John 'M' Doe ") # Perl module Mail::Address returns '大阪 太郎 ' (no double quote) # because regular expression \w matches even multibyte characters. expect(results[1].format).to eq('"大阪 太郎" ') expect(results[1].address).to eq('osaka@example.jp') expect(results[1].name).to eq('大阪 太郎') expect(results[1].phrase).to eq('大阪 太郎') expect(results[1].host).to eq('example.jp') expect(results[1].user).to eq('osaka') expect(results[1].original).to eq('大阪 太郎 ') expect(results[2].format).to eq('localpartonly') expect(results[2].address).to be_nil expect(results[2].name).to eq('localpartonly') expect(results[2].phrase).to eq('localpartonly') expect(results[2].host).to be_nil expect(results[2].user).to eq('') expect(results[2].original).to eq('localpartonly') end it "normal case (rfc-violated(RFC822) but commonly used in AU/DoCoMo)" do # dot before @ line = 'johndoe.@example.com' # no double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('johndoe.@example.com') expect(results[0].format(true)).to eq('"johndoe."@example.com') expect(results[0].address).to eq('johndoe.@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe.') expect(results[0].original).to eq(line) line = '"johndoe."@example.com' # enclosed with double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('"johndoe."@example.com') expect(results[0].format(true)).to eq('"johndoe."@example.com') expect(results[0].address).to eq('"johndoe."@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('"johndoe."') expect(results[0].original).to eq(line) line = 'John Doe ' # no double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('John Doe ') expect(results[0].format(true)).to eq('John Doe <"johndoe."@example.com>') expect(results[0].address).to eq('johndoe.@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('John Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('johndoe.') expect(results[0].original).to eq(line) line = 'John Doe <"johndoe."@example.com>' # enclosed with double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('John Doe <"johndoe."@example.com>') expect(results[0].format(true)).to eq('John Doe <"johndoe."@example.com>') expect(results[0].address).to eq('"johndoe."@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('John Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('"johndoe."') expect(results[0].original).to eq(line) # contains '..' line = 'john..doe@example.com' # enclosed with double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('john..doe@example.com') expect(results[0].format(true)).to eq('"john..doe"@example.com') expect(results[0].address).to eq('john..doe@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john..doe') expect(results[0].original).to eq(line) line = '"john..doe"@example.com' # enclosed with double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('"john..doe"@example.com') expect(results[0].format(true)).to eq('"john..doe"@example.com') expect(results[0].address).to eq('"john..doe"@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('"john..doe"') expect(results[0].original).to eq(line) line = 'John Doe ' # no double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('John Doe ') expect(results[0].format(true)).to eq('John Doe <"john..doe"@example.com>') expect(results[0].address).to eq('john..doe@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('John Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john..doe') expect(results[0].original).to eq(line) line = 'John Doe <"john..doe"@example.com>' # enclosed with double quotes results = MailAddress.parse(line) expect(results[0].format).to eq('John Doe <"john..doe"@example.com>') expect(results[0].format(true)).to eq('John Doe <"john..doe"@example.com>') expect(results[0].address).to eq('"john..doe"@example.com') expect(results[0].name).to eq('John Doe') expect(results[0].phrase).to eq('John Doe') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('"john..doe"') expect(results[0].original).to eq(line) end it "Unclosed double quotes" do line = '"john..doe@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('"john..doe@example.com') expect(results[0].format(true)).to eq('"john..doe@example.com') expect(results[0].address).to be_nil expect(results[0].name).to eq('john..doe@example.com') ## IRREGULAR PATTERN expect(results[0].phrase).to eq('"john..doe@example.com') ## IRREGULAR PATTERN expect(results[0].host).to be_nil expect(results[0].user).to eq("") expect(results[0].original).to eq(line) line = 'john..doe"@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('john..doe"@example.com') expect(results[0].format(true)).to eq('john..doe"@example.com') expect(results[0].address).to be_nil expect(results[0].name).to eq('john..doe"@example.com') ## IRREGULAR PATTERN expect(results[0].phrase).to eq('john..doe"@example.com') ## IRREGULAR PATTERN expect(results[0].host).to be_nil expect(results[0].user).to eq("") expect(results[0].original).to eq(line) # # it takes about 1 minutes in v1.4.5 # line = '"ooooooooooooooooo@docomo.ne.jp' results = MailAddress.parse(line) expect(results[0].format).to eq('"ooooooooooooooooo@docomo.ne.jp') expect(results[0].address).to be_nil expect(results[0].name).to eq('ooooooooooooooooo@docomo.ne.jp') ## IRREGULAR PATTERN expect(results[0].phrase).to eq('"ooooooooooooooooo@docomo.ne.jp') ## IRREGULAR PATTERN expect(results[0].host).to be_nil expect(results[0].user).to eq("") expect(results[0].original).to eq(line) end it "unparsable with mail gem (includes non-permitted char'[')" do line = "Ello [Do Not Reply] " results = MailAddress.parse(line) expect(results[0].format).to eq('"Ello [Do Not Reply]" ') expect(results[0].address).to eq('do-not-reply@ello.co') expect(results[0].name).to eq('Ello') expect(results[0].phrase).to eq('Ello [Do Not Reply]') expect(results[0].host).to eq('ello.co') expect(results[0].user).to eq('do-not-reply') expect(results[0].original).to eq(line) line = 'MM[天文雑学」編集部 mag2 0000290852 ' results = MailAddress.parse(line) expect(results[0].format).to eq('"MM[天文雑学」編集部 mag2 0000290852" ') expect(results[0].address).to eq('mailmag@mag2.com') expect(results[0].name).to eq('MM[天文雑学」編集部 mag2 0000290852') expect(results[0].phrase).to eq('MM[天文雑学」編集部 mag2 0000290852') expect(results[0].host).to eq('mag2.com') expect(results[0].user).to eq('mailmag') expect(results[0].original).to eq(line) end it "unparsable with mail gem (no whitespace before <)" do line = "大阪 太郎" results = MailAddress.parse(line) expect(results[0].format).to eq('"大阪 太郎" ') expect(results[0].address).to eq('osaka@example.jp') expect(results[0].name).to eq('大阪 太郎') expect(results[0].phrase).to eq('大阪 太郎') expect(results[0].host).to eq('example.jp') expect(results[0].user).to eq('osaka') expect(results[0].original).to eq(line) end it "local part only(treated as invalid)" do # if local part only, do not treat as an email address line = "localpartonly" results = MailAddress.parse(line) expect(results[0].format).to eq('localpartonly') expect(results[0].address).to be_nil expect(results[0].name).to eq('localpartonly') expect(results[0].phrase).to eq('localpartonly') expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) end it "includes invalid addresses only among valid addresses " do line = "aaaa, xyz@example.com, bbbb" results = MailAddress.parse(line) expect(results[0].format).to eq('aaaa') expect(results[0].address).to be_nil expect(results[0].name).to eq('aaaa') expect(results[0].phrase).to eq('aaaa') expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq('aaaa') expect(results[1].format).to eq('xyz@example.com') expect(results[1].address).to eq('xyz@example.com') expect(results[1].name).to be_nil expect(results[1].phrase).to eq('') expect(results[1].host).to eq('example.com') expect(results[1].user).to eq('xyz') expect(results[1].original).to eq('xyz@example.com') expect(results[2].format).to eq('bbbb') expect(results[2].address).to be_nil expect(results[2].name).to eq('bbbb') expect(results[2].phrase).to eq('bbbb') expect(results[2].host).to be_nil expect(results[2].user).to eq('') expect(results[2].original).to eq('bbbb') end it "a lot of types of undisclosed recipients" do array = [ 'undisclosed-recipients: ;', 'undisclosed-recipients:;', 'undisclosed recipients: ;', 'Undisclosed recipients: ;', 'Undisclosed recipients:;', 'Undisclosed-recipients: ;', 'Undisclosed-recipients:;', ] array.each do |line| results = MailAddress.parse(line) expect(results[0].format).to eq(line.gsub(/[;,]/, '')) expect(results[0].address).to be_nil expect(results[0].name).to eq(line) expect(results[0].phrase).to eq(line) expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) end array = [ '<"Undisclosed-Recipient:;"@587.jah.ne.jp>', '<"Undisclosed-Recipient:"@nifty.com;>', ] array.each do |line| results = MailAddress.parse(line) expect(results[0].format).to eq(line.gsub(/[;,]/, '')) expect(results[0].address).to be_nil expect(results[0].name).to eq(line) expect(results[0].phrase).to eq(line) expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) end # a seemingly valid address # line = '"Undisclosed" <"recipients:"@nifty.com>' # results = MailAddress.parse(line) # expect(results[0].format).to eq(line) # expect(results[0].address).to eq('"recipients:"@nifty.com') # expect(results[0].name).to eq("Undisclosed") # expect(results[0].phrase).to eq('"Undisclosed"') # expect(results[0].host).to eq("nifty.com") # expect(results[0].user).to eq('"recipients:"') # expect(results[0].original).to eq(line) end it "specify mime-encoded address" do line = "=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?= " results = MailAddress.parse(line) expect(results[0].format).to eq('=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?= ') expect(results[0].address).to eq('osaka@example.jp') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?=') expect(results[0].host).to eq('example.jp') expect(results[0].user).to eq('osaka') expect(results[0].original).to eq(line) end it "obviously invalid address (has no '@')" do array = [ 'recipient list not shown: ;', '各位:;', '<>', '<', '>', ] array.each do |line| results = MailAddress.parse(line) line.gsub!(';', '') expect(results[0].format).to eq(line) expect(results[0].address).to be_nil expect(results[0].name).to eq(line.strip) expect(results[0].phrase).to eq(line) expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) end end it "only separator" do array = [',', ';', ',;', ',,', ';;;', '<;,>, <>'] array.each do |line| results = MailAddress.parse(line) expect(results[0].format).to eq(line.gsub(/[;,]/, '')) expect(results[0].address).to be_nil expect(results[0].name).to eq(line.strip) expect(results[0].phrase).to eq(line) expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) end end it "all are invalid" do line = 'aa aa, bb (bb), cccc' results = MailAddress.parse(line) expect(results[0].format).to eq('aa aa') expect(results[0].address).to be_nil expect(results[0].name).to eq('aa aa') expect(results[0].phrase).to eq('aa aa') expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq('aa aa') expect(results[1].format).to eq('bb (bb)') expect(results[1].address).to be_nil expect(results[1].name).to eq('bb (bb)') expect(results[1].phrase).to eq('bb (bb)') expect(results[1].host).to be_nil expect(results[1].user).to eq('') expect(results[1].original).to eq('bb (bb)') expect(results[2].format).to eq('cccc') expect(results[2].address).to be_nil expect(results[2].name).to eq('cccc') expect(results[2].phrase).to eq('cccc') expect(results[2].host).to be_nil expect(results[2].user).to eq('') expect(results[2].original).to eq('cccc') end it "empty string or nil" do # empty string line = '' results = MailAddress.parse(line) expect(results[0].format).to eq('') expect(results[0].address).to be_nil expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq(line) # nil line = nil results = MailAddress.parse(line) expect(results[0].format).to eq('') expect(results[0].address).to be_nil expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq('') # Note that it returns empty string NOT nil end it "includes backslash" do line = '\"jjjjjjjjjjjj\" ' results = MailAddress.parse(line) expect(results[0].format).to eq('jjjjjjjjjjjj ') expect(results[0].address).to eq('john_doe@example.com') expect(results[0].name).to eq("jjjjjjjjjjjj") expect(results[0].phrase).to eq('jjjjjjjjjjjj') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john_doe') expect(results[0].original).to eq('"jjjjjjjjjjjj" ') # TO BE EXACT, NOT ORIGINAL. line = '\"jjjjjjjjjjjj" ' results = MailAddress.parse(line) expect(results[0].format).to eq('jjjjjjjjjjjj ') expect(results[0].address).to eq('john_doe@example.com') expect(results[0].name).to eq("jjjjjjjjjjjj") expect(results[0].phrase).to eq('jjjjjjjjjjjj') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john_doe') expect(results[0].original).to eq('"jjjjjjjjjjjj" ') # TO BE EXACT, NOT ORIGINAL. line = '"jjjjjjjjjjjj\" ' results = MailAddress.parse(line) expect(results[0].format).to eq('jjjjjjjjjjjj ') expect(results[0].address).to eq('john_doe@example.com') expect(results[0].name).to eq("jjjjjjjjjjjj") expect(results[0].phrase).to eq('jjjjjjjjjjjj') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john_doe') expect(results[0].original).to eq('"jjjjjjjjjjjj" ') # TO BE EXACT, NOT ORIGINAL. end it "suppress too much extraction" do line = 'john_doe@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('john_doe@example.com') expect(results[0].address).to eq('john_doe@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john_doe') expect(results[0].original).to eq(line) line = 'john.doe@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('john.doe@example.com') expect(results[0].address).to eq('john.doe@example.com') expect(results[0].name).to be_nil expect(results[0].phrase).to eq('') expect(results[0].host).to eq('example.com') expect(results[0].user).to eq('john.doe') expect(results[0].original).to eq(line) end it "corrupted address" do line = 'john (last') expect(results[1].original).to eq('Mary ') end it "unbelievable but existed address" do line = 'Sf 山田 太郎@example.com, valid@example.com' results = MailAddress.parse(line) expect(results[0].format).to eq('Sf 山田 太郎@example.com') expect(results[0].address).not_to eq("Sf@example.com") ## important! expect(results[0].address).to be_nil ## important! expect(results[0].name).to eq('Sf 山田 太郎@example.com') ## I don't care whatever returns expect(results[0].phrase).to eq('Sf 山田 太郎@example.com') ## I don't care whatever returns expect(results[0].host).to be_nil expect(results[0].user).to eq('') expect(results[0].original).to eq('Sf 山田 太郎@example.com') end it 'Perl Module TAP test data' do data = [ # [ '"Joe & J. Harvey" , JJV @ BBN', # '"Joe & J. Harvey" ', # 'Joe & J. Harvey'], # [ '"Joe & J. Harvey" ', # '"Joe & J. Harvey" ', # 'Joe & J. Harvey'], # [ 'JJV @ BBN', # 'JJV@BBN', # ''], # [ '"spickett@tiac.net" ', # '"spickett@tiac.net" ', # 'Spickett@Tiac.Net'], # [ 'rls@intgp8.ih.att.com (-Schieve,R.L.)', # 'rls@intgp8.ih.att.com (-Schieve,R.L.)', # 'R.L. -Schieve'], # [ 'bodg fred@tiuk.ti.com', #### doesn't support this type of email address # 'bodg', # ''], [ 'm-sterni@mars.dsv.su.se', 'm-sterni@mars.dsv.su.se', ''], # [ 'jrh%cup.portal.com@portal.unix.portal.com', # 'jrh%cup.portal.com@portal.unix.portal.com', # 'Cup Portal Com'], # [ "astrachan@austlcm.sps.mot.com ('paul astrachan/xvt3')", # "astrachan@austlcm.sps.mot.com ('paul astrachan/xvt3')", # 'Paul Astrachan/Xvt3'], # [ 'TWINE57%SDELVB.decnet@SNYBUFVA.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)', # 'TWINE57%SDELVB.decnet@SNYBUFVA.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)', # 'James R. Twine - The Nerd'], [ 'David Apfelbaum ', 'David Apfelbaum ', 'David Apfelbaum'], # [ '"JAMES R. TWINE - THE NERD" ', # '"JAMES R. TWINE - THE NERD" ', # 'James R. Twine - The Nerd'], [ 'bilsby@signal.dra (Fred C. M. Bilsby)', '"(Fred C. M. Bilsby)" ', 'Fred C. M. Bilsby'], # [ '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk', ### not supported # '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk', # 'Owen Smith'], [ 'apardon@rc1.vub.ac.be (Antoon Pardon)', '"(Antoon Pardon)" ', 'Antoon Pardon'], # ['"Stephen Burke, Liverpool" ', # '"Stephen Burke, Liverpool" ', # 'Stephen Burke'], ['Andy Duplain ', 'Andy Duplain ', 'Andy Duplain'], ['Gunnar Zoetl ', 'Gunnar Zoetl ', 'Gunnar Zoetl'], ['The Newcastle Info-Server ', 'The Newcastle Info-Server ', 'The Newcastle Info-Server'], ['wsinda@nl.tue.win.info (Dick Alstein)', '"(Dick Alstein)" ', 'Dick Alstein'], ['mserv@rusmv1.rus.uni-stuttgart.de (RUS Mail Server)', '"(RUS Mail Server)" ', 'RUS Mail Server'], ['Suba.Peddada@eng.sun.com (Suba Peddada [CONTRACTOR])', '"(Suba Peddada [CONTRACTOR])" ', 'Suba Peddada'], ['ftpmail-adm@info2.rus.uni-stuttgart.de', 'ftpmail-adm@info2.rus.uni-stuttgart.de', ''], # ['Paul Manser (0032 memo) ', # 'Paul Manser (0032 memo)', # 'Paul Manser'], # ['"gregg (g.) woodcock" ', # '"gregg (g.) woodcock" ', # 'Gregg Woodcock'], ['Clive Bittlestone ', 'Clive Bittlestone ', 'Clive Bittlestone'], # ['Graham.Barr@tiuk.ti.com', # 'Graham.Barr@tiuk.ti.com', # 'Graham Barr'], # ['"Graham Bisset, UK Net Support, +44 224 728109" ', # '"Graham Bisset, UK Net Support, +44 224 728109" ', # 'Graham Bisset'], # ['a909937 (Graham Barr (0004 bodg))', # 'a909937 (Graham Barr (0004 bodg))', # 'Graham Barr'], # ['a909062@node_cb83.node_cb83 (Colin x Maytum (0013 bro5))', # 'a909062@node_cb83.node_cb83 (Colin x Maytum (0013 bro5))', # 'Colin x Maytum'], # ['a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))', # 'a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))', # 'Colin Maytum'], # ['Derek.Roskell%dero@msg.ti.com', # 'Derek.Roskell%dero@msg.ti.com', # 'Derek Roskell'], # ['":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA', # '":sysmail"@Some-Group.Some-Org', # ''], # ["david d `zoo' zuhn ", # "david d `zoo' zuhn ", # "David D `Zoo' Zuhn"], ['"Christopher S. Arthur" ', '"Christopher S. Arthur" ', 'Christopher S. Arthur'], ['Jeffrey A Law ', 'Jeffrey A Law ', 'Jeffrey A Law'], ['lidl@uunet.uu.net (Kurt J. Lidl)', '"(Kurt J. Lidl)" ', 'Kurt J. Lidl'], ['Kresten_Thorup@NeXT.COM (Kresten Krab Thorup)', '"(Kresten Krab Thorup)" ', 'Kresten Krab Thorup'], ['hjl@nynexst.com (H.J. Lu)', '"(H.J. Lu)" ', 'H.J. Lu'], # ['@oleane.net:hugues@afp.com a!b@c.d foo!bar!foobar!root', # '@oleane.net:hugues@afp.com', # 'Oleane Net:Hugues'], # ['(foo@bar.com (foobar), ned@foo.com (nedfoo) ) ', # 'kevin@goess.org (foo@bar.com (foobar), ned@foo.com (nedfoo) )', # ''], ["eBay's Half ", "eBay's Half ", "eBay's Half"], ['outlook@example.com; semicolons@example.com', 'outlook@example.com', ''], ['"Foo; Bar" , Baz ', '"Foo; Bar" ', 'Foo; Bar'] ] data.each_with_index do |d, i| test_src = d[0] exp_format = d[1] exp_name = d[2] # p "#{i} #{test_src}" result = MailAddress.parse(test_src)[0] result_format = result.format || '' result_name = result.name || '' expect(result_name).to eq(exp_name) expect(result_format).to eq(exp_format) end end end