2015-10-11 05:41:23 -04:00
require 'rails_helper'
2013-06-03 16:12:24 -04:00
require 'email'
2013-06-10 15:33:37 -04:00
describe Email :: Styles do
2013-06-03 16:12:24 -04:00
2016-01-19 19:42:56 -05:00
def basic_doc ( html )
2013-06-13 12:15:05 -04:00
styler = Email :: Styles . new ( html )
styler . format_basic
2016-01-19 19:42:56 -05:00
Nokogiri :: HTML ( styler . to_html )
2013-06-03 16:12:24 -04:00
end
2016-01-19 19:42:56 -05:00
def html_doc ( html )
2013-06-13 12:15:05 -04:00
styler = Email :: Styles . new ( html )
styler . format_basic
styler . format_html
2016-01-19 19:42:56 -05:00
Nokogiri :: HTML ( styler . to_html )
2013-06-03 16:12:24 -04:00
end
2016-01-27 18:44:49 -05:00
def notification_doc ( html )
styler = Email :: Styles . new ( html )
styler . format_basic
styler . format_notification
styler . format_html
Nokogiri :: HTML ( styler . to_html )
end
2013-06-13 12:15:05 -04:00
context " basic formatter " do
2013-06-03 16:12:24 -04:00
2013-06-13 12:15:05 -04:00
it " works with an empty string " do
style = Email :: Styles . new ( " " )
style . format_basic
expect ( style . to_html ) . to be_blank
end
2013-06-03 16:12:24 -04:00
2016-01-27 18:44:49 -05:00
it " adds a max-width to big images " do
doc = basic_doc ( " <img src='gigantic.jpg' width='1230' height='720'> " )
2016-01-19 19:42:56 -05:00
expect ( doc . at ( " img " ) [ " style " ] ) . to match ( " max-width " )
2013-06-13 12:15:05 -04:00
end
2013-06-03 16:12:24 -04:00
2016-01-27 18:44:49 -05:00
it " doesn't add a maz-width to small images " do
doc = basic_doc ( " <img src='gigantic.jpg' width='120' height='80'> " )
expect ( doc . at ( " img " ) [ " style " ] ) . not_to match ( " max-width " )
end
2013-06-13 12:15:05 -04:00
it " adds a width and height to images with an emoji path " do
2016-01-19 19:42:56 -05:00
doc = basic_doc ( " <img src='/images/emoji/fish.png' class='emoji'> " )
expect ( doc . at ( " img " ) [ " width " ] ) . to eq ( " 20 " )
expect ( doc . at ( " img " ) [ " height " ] ) . to eq ( " 20 " )
2013-06-13 12:15:05 -04:00
end
it " converts relative paths to absolute paths " do
2016-01-19 19:42:56 -05:00
doc = basic_doc ( " <img src='/some-image.png'> " )
expect ( doc . at ( " img " ) [ " src " ] ) . to eq ( " #{ Discourse . base_url } /some-image.png " )
2013-06-13 12:15:05 -04:00
end
2013-06-03 16:12:24 -04:00
2013-07-26 03:27:46 -04:00
it " strips classes and ids " do
2016-01-19 19:42:56 -05:00
doc = basic_doc ( " <div class='foo' id='bar'><div class='foo' id='bar'></div></div> " )
expect ( doc . to_html ) . to match ( / <div><div>< \/ div>< \/ div> / )
2013-07-26 03:27:46 -04:00
end
2013-06-03 16:12:24 -04:00
end
2013-06-13 12:15:05 -04:00
context " html template formatter " do
it " works with an empty string " do
style = Email :: Styles . new ( " " )
style . format_html
expect ( style . to_html ) . to be_blank
end
it " attaches a style to h3 tags " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <h3>hello</h3> " )
expect ( doc . at ( 'h3' ) [ 'style' ] ) . to be_present
2013-06-13 12:15:05 -04:00
end
it " attaches a style to hr tags " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( " hello<hr> " )
expect ( doc . at ( 'hr' ) [ 'style' ] ) . to be_present
2013-06-13 12:15:05 -04:00
end
it " attaches a style to a tags " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <a href>wat</a> " )
expect ( doc . at ( 'a' ) [ 'style' ] ) . to be_present
2013-06-13 12:15:05 -04:00
end
it " attaches a style to a tags " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <a href>wat</a> " )
expect ( doc . at ( 'a' ) [ 'style' ] ) . to be_present
2013-06-13 12:15:05 -04:00
end
it " attaches a style to ul and li tags " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <ul><li>hello</li></ul> " )
expect ( doc . at ( 'ul' ) [ 'style' ] ) . to be_present
expect ( doc . at ( 'li' ) [ 'style' ] ) . to be_present
2013-06-13 12:15:05 -04:00
end
2014-07-14 16:41:05 -04:00
it " converts iframes to links " do
iframe_url = " http://www.youtube.com/embed/7twifrxOTQY?feature=oembed&wmode=opaque "
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <iframe src= \" #{ iframe_url } \" ></iframe> " )
expect ( doc . at ( 'iframe' ) ) . to be_blank
expect ( doc . at ( 'a' ) ) . to be_present
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( iframe_url )
2014-07-14 16:41:05 -04:00
end
it " won't allow non URLs in iframe src, strips them with no link " do
iframe_url = " alert('xss hole') "
2016-01-19 19:42:56 -05:00
doc = html_doc ( " <iframe src= \" #{ iframe_url } \" ></iframe> " )
expect ( doc . at ( 'iframe' ) ) . to be_blank
expect ( doc . at ( 'a' ) ) . to be_blank
2014-07-14 16:41:05 -04:00
end
2014-06-13 17:11:04 -04:00
end
2016-01-27 18:44:49 -05:00
context " format notifications " do
it " adds both styles and attributes " do
doc = notification_doc ( " <table><tr><td class='body'>hello</td></tr></table> " )
expect ( doc . at ( 'td' ) [ 'style' ] ) . to eq ( 'padding-top:5px;' )
expect ( doc . at ( 'td' ) [ 'colspan' ] ) . to eq ( '2' )
end
it " adds attributes when no styles are present " do
doc = notification_doc ( " <div class='user-avatar'><img src='/some-image.png'></div> " )
expect ( doc . at ( 'img' ) [ 'width' ] ) . to eq ( '45' )
end
2016-01-27 22:07:21 -05:00
it " adds correct styles to the wrapper " do
doc = notification_doc ( '<center class="wrapper"></center>' )
expect ( doc . at ( 'center' ) [ 'style' ] ) . to eq ( 'width:100%;table-layout:fixed;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;' )
end
it " doesn't override inline attributes " do
doc = notification_doc ( '<table width="600" align="center"><tr><td>test</td></tr></table>' )
expect ( doc . at ( 'table' ) [ 'align' ] ) . to eq ( 'center' )
expect ( doc . at ( 'table' ) [ 'width' ] ) . to eq ( '600' )
end
2016-01-27 18:44:49 -05:00
end
2014-06-13 17:11:04 -04:00
context " rewriting protocol relative URLs to the forum " do
it " doesn't rewrite a url to another site " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<a href="//youtube.com/discourse">hello</a>' )
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( " //youtube.com/discourse " )
2014-06-13 17:11:04 -04:00
end
context " without https " do
before do
SiteSetting . stubs ( :use_https ) . returns ( false )
end
it " rewrites the href to have http " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<a href="//test.localhost/discourse">hello</a>' )
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( " http://test.localhost/discourse " )
2014-06-13 17:11:04 -04:00
end
2014-10-27 14:21:55 -04:00
it " rewrites the href for attachment files to have http " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<a class="attachment" href="//try-discourse.global.ssl.fastly.net/uploads/default/368/40b610b0aa90cfcf.txt">attachment_file.txt</a>' )
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( " http://try-discourse.global.ssl.fastly.net/uploads/default/368/40b610b0aa90cfcf.txt " )
2014-10-27 14:21:55 -04:00
end
2014-06-13 17:11:04 -04:00
it " rewrites the src to have http " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<img src="//test.localhost/blah.jpg">' )
expect ( doc . at ( 'img' ) [ 'src' ] ) . to eq ( " http://test.localhost/blah.jpg " )
2014-06-13 17:11:04 -04:00
end
end
context " with https " do
before do
SiteSetting . stubs ( :use_https ) . returns ( true )
end
2014-10-27 14:21:55 -04:00
it " rewrites the forum URL to have https " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<a href="//test.localhost/discourse">hello</a>' )
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( " https://test.localhost/discourse " )
2014-06-13 17:11:04 -04:00
end
2014-10-27 14:21:55 -04:00
it " rewrites the href for attachment files to have https " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<a class="attachment" href="//try-discourse.global.ssl.fastly.net/uploads/default/368/40b610b0aa90cfcf.txt">attachment_file.txt</a>' )
expect ( doc . at ( 'a' ) [ 'href' ] ) . to eq ( " https://try-discourse.global.ssl.fastly.net/uploads/default/368/40b610b0aa90cfcf.txt " )
2014-10-27 14:21:55 -04:00
end
2014-06-13 17:11:04 -04:00
it " rewrites the src to have https " do
2016-01-19 19:42:56 -05:00
doc = html_doc ( '<img src="//test.localhost/blah.jpg">' )
expect ( doc . at ( 'img' ) [ 'src' ] ) . to eq ( " https://test.localhost/blah.jpg " )
2014-06-13 17:11:04 -04:00
end
end
2013-06-13 12:15:05 -04:00
2013-06-03 16:12:24 -04:00
end
2015-08-18 19:12:08 -04:00
context " strip_avatars_and_emojis " do
it " works for lonesome emoji with no title " do
emoji = " <img src='/images/emoji/emoji_one/crying_cat_face.png'> "
style = Email :: Styles . new ( emoji )
style . strip_avatars_and_emojis
2016-01-19 19:42:56 -05:00
expect ( style . to_html ) . to match_html ( " <!DOCTYPE html PUBLIC \" -//W3C//DTD HTML 4.0 Transitional//EN \" \" http://www.w3.org/TR/REC-html40/loose.dtd \" ><html><body> #{ emoji } </body></html> " )
2015-08-18 19:12:08 -04:00
end
it " works for lonesome emoji with title " do
emoji = " <img title='cry_cry' src='/images/emoji/emoji_one/crying_cat_face.png'> "
style = Email :: Styles . new ( emoji )
style . strip_avatars_and_emojis
2016-01-19 19:42:56 -05:00
expect ( style . to_html ) . to match_html ( " <!DOCTYPE html PUBLIC \" -//W3C//DTD HTML 4.0 Transitional//EN \" \" http://www.w3.org/TR/REC-html40/loose.dtd \" ><html><body>cry_cry</body></html> " )
2015-08-18 19:12:08 -04:00
end
end
2013-06-03 16:12:24 -04:00
end