|  | # encoding: utf-8
 | 
  
    |  | require File.expand_path(File.dirname(__FILE__)) + '/helper'
 | 
  
    |  | 
 | 
  
    |  | class TestHtmlToPlainText < Premailer::TestCase
 | 
  
    |  |   include HtmlToPlainText
 | 
  
    |  | 
 | 
  
    |  |   def test_to_plain_text_with_fragment
 | 
  
    |  |     premailer = Premailer.new('<p>Test</p>', :with_html_string => true)
 | 
  
    |  |     assert_match /Test/, premailer.to_plain_text
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_to_plain_text_with_body
 | 
  
    |  |     html = <<END_HTML
 | 
  
    |  |     <html>
 | 
  
    |  |     <title>Ignore me</title>
 | 
  
    |  |     <body>
 | 
  
    |  | 		<p>Test</p>
 | 
  
    |  | 		</body>
 | 
  
    |  | 		</html>
 | 
  
    |  | END_HTML
 | 
  
    |  | 
 | 
  
    |  |     premailer = Premailer.new(html, :with_html_string => true)
 | 
  
    |  |     assert_match /Test/, premailer.to_plain_text
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_to_plain_text_with_malformed_body
 | 
  
    |  |     html = <<END_HTML
 | 
  
    |  |     <html>
 | 
  
    |  |     <title>Ignore me</title>
 | 
  
    |  |     <body>
 | 
  
    |  | 		<p>Test
 | 
  
    |  | END_HTML
 | 
  
    |  | 
 | 
  
    |  |     premailer = Premailer.new(html, :with_html_string => true)
 | 
  
    |  |     assert_match /Test/, premailer.to_plain_text
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_specialchars
 | 
  
    |  |     assert_plaintext 'cédille garçon & à ñ', 'cédille garçon & à ñ'
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_stripping_whitespace
 | 
  
    |  |     assert_plaintext "text\ntext", "  \ttext\ntext\n"
 | 
  
    |  |     assert_plaintext "a\na", "  \na \n a \t"
 | 
  
    |  |     assert_plaintext "a\n\na", "  \na \n\t \n \n a \t"
 | 
  
    |  |     assert_plaintext "test text", "test text "
 | 
  
    |  |     assert_plaintext "test text", "test        text"
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_wrapping_spans
 | 
  
    |  |     html = <<END_HTML
 | 
  
    |  |     <html>
 | 
  
    |  |     <body>
 | 
  
    |  | 		<p><span>Test</span>
 | 
  
    |  | 		<span>line 2</span>
 | 
  
    |  | 		</p>
 | 
  
    |  | END_HTML
 | 
  
    |  | 
 | 
  
    |  |     premailer = Premailer.new(html, :with_html_string => true)
 | 
  
    |  |     assert_match /Test line 2/, premailer.to_plain_text
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_line_breaks
 | 
  
    |  |     assert_plaintext "Test text\nTest text", "Test text\r\nTest text"
 | 
  
    |  |     assert_plaintext "Test text\nTest text", "Test text\rTest text"
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_lists
 | 
  
    |  |     assert_plaintext "* item 1\n* item 2", "<li class='123'>item 1</li> <li>item 2</li>\n"
 | 
  
    |  |     assert_plaintext "* item 1\n* item 2\n* item 3", "<li>item 1</li> \t\n <li>item 2</li> <li> item 3</li>\n"
 | 
  
    |  |   end
 | 
  
    |  |   
 | 
  
    |  |   def test_stripping_html
 | 
  
    |  |     assert_plaintext 'test text', "<p class=\"123'45 , att\" att=tester>test <span class='te\"st'>text</span>\n"
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_paragraphs_and_breaks
 | 
  
    |  |     assert_plaintext "Test text\n\nTest text", "<p>Test text</p><p>Test text</p>"
 | 
  
    |  |     assert_plaintext "Test text\n\nTest text", "\n<p>Test text</p>\n\n\n\t<p>Test text</p>\n"
 | 
  
    |  |     assert_plaintext "Test text\nTest text", "\n<p>Test text<br/>Test text</p>\n"
 | 
  
    |  |     assert_plaintext "Test text\nTest text", "\n<p>Test text<br> \tTest text<br></p>\n"
 | 
  
    |  |     assert_plaintext "Test text\n\nTest text", "Test text<br><BR />Test text"
 | 
  
    |  |   end
 | 
  
    |  |   
 | 
  
    |  |   def test_headings
 | 
  
    |  |     assert_plaintext "****\nTest\n****", "<h1>Test</h1>"
 | 
  
    |  |     assert_plaintext "****\nTest\n****", "\t<h1>\nTest</h1> "
 | 
  
    |  |     assert_plaintext "***********\nTest line 1\nTest 2\n***********", "\t<h1>\nTest line 1<br>Test 2</h1> "
 | 
  
    |  |     assert_plaintext "****\nTest\n****\n\n****\nTest\n****", "<h1>Test</h1> <h1>Test</h1>"
 | 
  
    |  |     assert_plaintext "----\nTest\n----", "<h2>Test</h2>"
 | 
  
    |  |     assert_plaintext "Test\n----", "<h3> <span class='a'>Test </span></h3>"
 | 
  
    |  |   end
 | 
  
    |  |   
 | 
  
    |  |   def test_wrapping_lines
 | 
  
    |  |     raw = ''
 | 
  
    |  |     100.times { raw += 'test ' }
 | 
  
    |  | 
 | 
  
    |  |     txt = convert_to_text(raw, 20)
 | 
  
    |  | 
 | 
  
    |  |     lens = []
 | 
  
    |  |     txt.each_line { |l| lens << l.length }
 | 
  
    |  |     assert lens.max <= 20
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def test_links
 | 
  
    |  |     # basic
 | 
  
    |  |     assert_plaintext 'Link ( http://example.com/ )', '<a href="http://example.com/">Link</a>'
 | 
  
    |  |     
 | 
  
    |  |     # nested html
 | 
  
    |  |     assert_plaintext 'Link ( http://example.com/ )', '<a href="http://example.com/"><span class="a">Link</span></a>'
 | 
  
    |  |     
 | 
  
    |  |     # complex link
 | 
  
    |  |     assert_plaintext 'Link ( http://example.com:80/~user?aaa=bb&c=d,e,f#foo )', '<a href="http://example.com:80/~user?aaa=bb&c=d,e,f#foo">Link</a>'
 | 
  
    |  |     
 | 
  
    |  |     # attributes
 | 
  
    |  |     assert_plaintext 'Link ( http://example.com/ )', '<a title=\'title\' href="http://example.com/">Link</a>'
 | 
  
    |  |     
 | 
  
    |  |     # spacing
 | 
  
    |  |     assert_plaintext 'Link ( http://example.com/ )', '<a href="   http://example.com/ "> Link </a>'
 | 
  
    |  |     
 | 
  
    |  |     # multiple
 | 
  
    |  |     assert_plaintext 'Link A ( http://example.com/a/ ) Link B ( http://example.com/b/ )', '<a href="http://example.com/a/">Link A</a> <a href="http://example.com/b/">Link B</a>'
 | 
  
    |  | 
 | 
  
    |  |     # merge links
 | 
  
    |  |     assert_plaintext 'Link ( %%LINK%% )', '<a href="%%LINK%%">Link</a>'
 | 
  
    |  |     assert_plaintext 'Link ( [LINK] )', '<a href="[LINK]">Link</a>'
 | 
  
    |  |     assert_plaintext 'Link ( {LINK} )', '<a href="{LINK}">Link</a>'
 | 
  
    |  |     
 | 
  
    |  |     # unsubscribe
 | 
  
    |  |     assert_plaintext 'Link ( [[!unsubscribe]] )', '<a href="[[!unsubscribe]]">Link</a>'
 | 
  
    |  |   end
 | 
  
    |  |   
 | 
  
    |  |   # see https://github.com/alexdunae/premailer/issues/72
 | 
  
    |  |   def test_multiple_links_per_line
 | 
  
    |  |     assert_plaintext 'This is link1 ( http://www.google.com ) and link2 ( http://www.google.com ) is next.', 
 | 
  
    |  |                      '<p>This is <a href="http://www.google.com" >link1</a> and <a href="http://www.google.com" >link2 </a> is next.</p>',
 | 
  
    |  |                      nil, 10000
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   # see https://github.com/alexdunae/premailer/issues/72
 | 
  
    |  |   def test_links_within_headings
 | 
  
    |  |     assert_plaintext "****************************\nTest ( http://example.com/ )\n****************************", 
 | 
  
    |  |                      "<h1><a href='http://example.com/'>Test</a></h1>"
 | 
  
    |  |   end
 | 
  
    |  | 
 | 
  
    |  |   def assert_plaintext(out, raw, msg = nil, line_length = 65)
 | 
  
    |  |     assert_equal out, convert_to_text(raw, line_length), msg
 | 
  
    |  |   end
 | 
  
    |  | end
 |