Added even more tests.

This commit is contained in:
Martin Edenhofer 2014-12-30 15:08:20 +01:00
parent ac3b76fe30
commit 35da82aa16
2 changed files with 152 additions and 11 deletions

View file

@ -44,7 +44,7 @@ module Channel::EmailBuild
# add html part
if attr[:content_type] && attr[:content_type] == 'text/html'
mail.html_part = Mail::Part.new do
html_alternative = Mail::Part.new do
content_type 'text/html; charset=UTF-8'
# complete check
@ -58,19 +58,46 @@ module Channel::EmailBuild
end
# add plain text part
mail.text_part = Mail::Part.new do
text_alternative = Mail::Part.new do
content_type 'text/plain; charset=UTF-8'
body attr[:body]
end
# build email without any attachments
if !html_alternative && ( !attr[:attachments] || attr[:attachments].empty? )
mail.content_type 'text/plain; charset=UTF-8'
mail.body attr[:body]
return mail
end
# build email with attachments
alternative_bodies = Mail::Part.new { content_type 'multipart/alternative' }
alternative_bodies.add_part text_alternative
if html_alternative
html_container = Mail::Part.new { content_type 'multipart/related' }
html_container.add_part html_alternative
alternative_bodies.add_part html_container
# place to add inline attachments related to html alternative
end
mail.add_part alternative_bodies
# add attachments
if attr[:attachments]
attr[:attachments].each do |attachment|
mail.attachments[attachment.filename] = {
:content_type => attachment.preferences['Content-Type'],
:mime_type => attachment.preferences['Mime-Type'],
:content => attachment.content
}
if attachment.class == Hash
attachment['content-id'] = nil
mail.attachments[ attachment[:filename] ] = attachment
else
mail.attachments[attachment.filename] = {
:content_type => attachment.preferences['Content-Type'],
:mime_type => attachment.preferences['Mime-Type'],
:content => attachment.content,
'content-id' => nil,
}
end
end
end
mail

View file

@ -25,14 +25,14 @@ class EmailBuildTest < ActiveSupport::TestCase
end
test 'html email check' do
test 'html email + attachment check' do
html = '<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<body style="font-family:Geneva,Helvetica,Arial,sans-serif; font-size: 12px;">
<div>&gt; Welcome!</div><div>&gt;</div><div>&gt; Thank you for installing Zammad.</div><div>&gt;</div>
<div>&gt; Welcome!</div><div>&gt;</div><div>&gt; Thank you for installing Zammad. äöüß</div><div>&gt;</div>
</body>
</html>'
mail = Channel::EmailBuild.build(
@ -40,18 +40,133 @@ class EmailBuildTest < ActiveSupport::TestCase
:to => 'recipient@example.com',
:body => html,
:content_type => 'text/html',
:attachments => [
{
'Mime-Type' => 'image/png',
:content => 'xxx',
:filename => 'somename.png',
},
],
)
should = '> Welcome!
>
> Thank you for installing Zammad.
> Thank you for installing Zammad. äöüß
>
'
assert_equal( should, mail.text_part.body.to_s )
assert_equal( html, mail.html_part.body.to_s )
parser = Channel::EmailParser.new
data = parser.parse( mail.to_s )
# check body
assert_equal( should, data[:body] )
# check count of attachments, only 2, because 3 part is text message and is already in body
assert_equal( 2, data[:attachments].length )
# check attachments
if data[:attachments]
data[:attachments].each { |attachment|
if attachment[:filename] == 'message.html'
assert_equal( nil, attachment[:preferences]['Content-ID'] )
assert_equal( true, attachment[:preferences]['content-alternative'] )
assert_equal( 'text/html', attachment[:preferences]['Mime-Type'] )
assert_equal( 'UTF-8', attachment[:preferences]['Charset'] )
elsif attachment[:filename] == 'somename.png'
assert_equal( nil, attachment[:preferences]['Content-ID'] )
assert_equal( nil, attachment[:preferences]['content-alternative'] )
assert_equal( 'image/png', attachment[:preferences]['Mime-Type'] )
assert_equal( 'UTF-8', attachment[:preferences]['Charset'] )
else
assert( false, "invalid attachment, should not be there, #{attachment.inspect}" )
end
}
end
end
test 'plain email + attachment check' do
text = '> Welcome!
>
> Thank you for installing Zammad. äöüß
>
'
mail = Channel::EmailBuild.build(
:from => 'sender@example.com',
:to => 'recipient@example.com',
:body => text,
:attachments => [
{
'Mime-Type' => 'image/png',
:content => 'xxx',
:filename => 'somename.png',
},
],
)
should = '> Welcome!
>
> Thank you for installing Zammad. äöüß
>
'
assert_equal( should, mail.text_part.body.to_s )
assert_equal( nil, mail.html_part )
parser = Channel::EmailParser.new
data = parser.parse( mail.to_s )
# check body
assert_equal( should, data[:body] )
# check count of attachments, 2
assert_equal( 1, data[:attachments].length )
# check attachments
if data[:attachments]
data[:attachments].each { |attachment|
if attachment[:filename] == 'somename.png'
assert_equal( nil, attachment[:preferences]['Content-ID'] )
assert_equal( nil, attachment[:preferences]['content-alternative'] )
assert_equal( 'image/png', attachment[:preferences]['Mime-Type'] )
assert_equal( 'UTF-8', attachment[:preferences]['Charset'] )
else
assert( false, "invalid attachment, should not be there, #{attachment.inspect}" )
end
}
end
end
test 'plain email + without attachment check' do
text = '> Welcome!
>
> Thank you for installing Zammad. äöüß
>
'
mail = Channel::EmailBuild.build(
:from => 'sender@example.com',
:to => 'recipient@example.com',
:body => text,
)
should = '> Welcome!
>
> Thank you for installing Zammad. äöüß
>
'
assert_equal( should, mail.body.to_s )
assert_equal( nil, mail.html_part )
parser = Channel::EmailParser.new
data = parser.parse( mail.to_s )
# check body
assert_equal( should, data[:body] )
# check count of attachments, 0
assert_equal( 0, data[:attachments].length )
end
test 'html2text' do
html = '<!DOCTYPE html>
@ -85,6 +200,5 @@ you
* #2'
assert_equal( should, html.html2text )
end
end