2015-10-11 17:41:23 +08:00
require 'rails_helper'
2013-02-06 03:16:51 +08:00
require 'pretty_text'
describe PrettyText do
2014-11-06 03:37:00 +08:00
let ( :wrapped_image ) { " <div class= \" lightbox-wrapper \" ><a href= \" //localhost:3000/uploads/default/4399/33691397e78b4d75.png \" class= \" lightbox \" title= \" Screen Shot 2014-04-14 at 9.47.10 PM.png \" ><img src= \" //localhost:3000/uploads/default/_optimized/bd9/b20/bbbcd6a0c0_655x500.png \" width= \" 655 \" height= \" 500 \" ><div class= \" meta \" > \n <span class= \" filename \" >Screen Shot 2014-04-14 at 9.47.10 PM.png</span><span class= \" informations \" >966x737 1.47 MB</span><span class= \" expand \" ></span> \n </div></a></div> " }
let ( :wrapped_image_excerpt ) { }
2013-02-26 00:42:20 +08:00
describe " Cooking " do
2013-02-06 03:16:51 +08:00
2015-09-25 11:35:14 +08:00
describe " off topic quoting " do
it " can correctly populate topic title " do
topic = Fabricate ( :topic , title : " this is a test topic " )
expected = <<HTML
< aside class = " quote " data - post = " 2 " data - topic = " #{ topic . id } " > < div class = " title " >
2015-09-25 12:18:18 +08:00
< div class = " quote-controls " > < / div><a href="http: / / test . localhost / t / this - is - a - test - topic / #{topic.id}/2">This is a test topic</a>
2015-09-25 11:35:14 +08:00
< / div>
< blockquote > < p > ddd < / p>< / blockquote > < / aside>
HTML
expect ( PrettyText . cook ( " [quote= \" EvilTrout, post:2, topic: #{ topic . id } \" ]ddd \n [/quote] " , topic_id : 1 ) ) . to match_html expected
end
end
2013-08-14 04:08:29 +08:00
describe " with avatar " do
2015-06-27 01:37:50 +08:00
let ( :default_avatar ) { " //test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/{size}.png " }
2013-02-06 03:16:51 +08:00
2015-09-25 11:35:14 +08:00
before do
2013-08-14 04:08:29 +08:00
eviltrout = User . new
2015-06-27 01:37:50 +08:00
User . stubs ( :default_template ) . returns ( default_avatar )
2014-05-06 21:41:59 +08:00
User . expects ( :find_by ) . with ( username_lower : " eviltrout " ) . returns ( eviltrout )
2013-08-14 04:08:29 +08:00
end
2013-02-06 03:16:51 +08:00
2013-08-14 04:08:29 +08:00
it " produces a quote even with new lines in it " do
2015-12-15 16:56:45 +08:00
expect ( PrettyText . cook ( " [quote= \" EvilTrout, post:123, topic:456, full:true \" ]ddd \n [/quote] " ) ) . to match_html " <aside class= \" quote \" data-post= \" 123 \" data-topic= \" 456 \" data-full= \" true \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img alt='' width= \" 20 \" height= \" 20 \" src= \" //test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout:</div> \n <blockquote><p>ddd</p></blockquote></aside> "
2013-08-14 04:08:29 +08:00
end
2013-02-06 03:16:51 +08:00
2013-08-14 04:08:29 +08:00
it " should produce a quote " do
2015-12-15 16:56:45 +08:00
expect ( PrettyText . cook ( " [quote= \" EvilTrout, post:123, topic:456, full:true \" ]ddd[/quote] " ) ) . to match_html " <aside class= \" quote \" data-post= \" 123 \" data-topic= \" 456 \" data-full= \" true \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img alt='' width= \" 20 \" height= \" 20 \" src= \" //test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout:</div> \n <blockquote><p>ddd</p></blockquote></aside> "
2013-08-14 04:08:29 +08:00
end
it " trims spaces on quote params " do
2015-12-15 16:56:45 +08:00
expect ( PrettyText . cook ( " [quote= \" EvilTrout, post:555, topic: 666 \" ]ddd[/quote] " ) ) . to match_html " <aside class= \" quote \" data-post= \" 555 \" data-topic= \" 666 \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img alt='' width= \" 20 \" height= \" 20 \" src= \" //test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout:</div> \n <blockquote><p>ddd</p></blockquote></aside> "
2013-08-14 04:08:29 +08:00
end
end
2013-02-06 03:16:51 +08:00
2013-02-26 00:42:20 +08:00
it " should handle 3 mentions in a row " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( '@hello @hello @hello' ) ) . to match_html " <p><span class= \" mention \" >@hello</span> <span class= \" mention \" >@hello</span> <span class= \" mention \" >@hello</span></p> "
2013-02-06 03:16:51 +08:00
end
2016-02-24 03:57:54 +08:00
it " should handle group mentions with a hyphen and without " do
expect ( PrettyText . cook ( '@hello @hello-hello' ) ) . to match_html " <p><span class= \" mention \" >@hello</span> <span class= \" mention \" >@hello-hello</span></p> "
end
2013-02-06 03:16:51 +08:00
it " should sanitize the html " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " <script>alert(42)</script> " ) ) . to match_html " <p></p> "
2013-02-06 03:16:51 +08:00
end
it 'should allow for @mentions to have punctuation' do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " hello @bob's @bob,@bob; @bob \" " ) ) . to match_html (
" <p>hello <span class= \" mention \" >@bob</span>'s <span class= \" mention \" >@bob</span>,<span class= \" mention \" >@bob</span>; <span class= \" mention \" >@bob</span> \" </p> "
)
2013-02-06 03:16:51 +08:00
end
2014-10-03 10:37:07 +08:00
# see: https://github.com/sparklemotion/nokogiri/issues/1173
2014-10-29 23:06:50 +08:00
skip 'allows html entities correctly' do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " ℵ£& # 162; " ) ) . to eq ( " <p>ℵ£& # 162;</p> " )
2014-10-03 10:37:07 +08:00
end
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
2013-02-11 08:43:07 +08:00
describe " rel nofollow " do
2013-02-26 00:42:20 +08:00
before do
2013-02-11 08:43:07 +08:00
SiteSetting . stubs ( :add_rel_nofollow_to_user_content ) . returns ( true )
2014-03-30 07:50:44 +08:00
SiteSetting . stubs ( :exclude_rel_nofollow_domains ) . returns ( " foo.com|bar.com " )
2013-02-11 08:43:07 +08:00
end
2013-02-26 00:42:20 +08:00
it " should inject nofollow in all user provided links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( '<a href="http://cnn.com">cnn</a>' ) ) . to match ( / nofollow / )
2013-02-11 08:43:07 +08:00
end
2013-02-26 00:42:20 +08:00
it " should not inject nofollow in all local links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " <a href=' #{ Discourse . base_url } /test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 08:43:07 +08:00
end
2013-02-26 00:42:20 +08:00
it " should not inject nofollow in all subdomain links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " <a href=' #{ Discourse . base_url . sub ( 'http://' , 'http://bla.' ) } /test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 08:43:07 +08:00
end
2013-02-11 15:58:19 +08:00
2015-05-27 12:31:01 +08:00
it " should inject nofollow in all non subdomain links " do
expect ( PrettyText . cook ( " <a href=' #{ Discourse . base_url . sub ( 'http://' , 'http://bla' ) } /test.html'>cnn</a> " ) ) . to match ( / nofollow / )
end
2013-02-11 15:58:19 +08:00
it " should not inject nofollow for foo.com " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " <a href='http://foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 15:58:19 +08:00
end
2015-05-27 12:31:01 +08:00
it " should inject nofollow for afoo.com " do
expect ( PrettyText . cook ( " <a href='http://afoo.com/test.html'>cnn</a> " ) ) . to match ( / nofollow / )
end
2013-02-26 00:42:20 +08:00
2013-02-11 15:58:19 +08:00
it " should not inject nofollow for bar.foo.com " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " <a href='http://bar.foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 15:58:19 +08:00
end
2014-01-16 00:34:17 +08:00
it " should not inject nofollow if omit_nofollow option is given " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( '<a href="http://cnn.com">cnn</a>' , omit_nofollow : true ) !~ / nofollow / ) . to eq ( true )
2014-01-16 00:34:17 +08:00
end
2013-02-11 08:43:07 +08:00
end
2013-02-06 03:16:51 +08:00
2013-02-26 00:42:20 +08:00
describe " Excerpt " do
2013-04-30 11:25:55 +08:00
2014-07-25 10:15:43 +08:00
it " sanitizes attempts to inject invalid attributes " do
spinner = " <a href= \" http://thedailywtf.com/ \" data-bbcode= \" ' class='fa fa-spin \" >WTF</a> "
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( spinner , 20 ) ) . to match_html spinner
2014-07-25 10:15:43 +08:00
spinner = %q{ <a href="http://thedailywtf.com/" title="' class="fa fa-spin"><img src='http://thedailywtf.com/Resources/Images/Primary/logo.gif"></a> }
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( spinner , 20 ) ) . to match_html spinner
2014-07-25 10:15:43 +08:00
end
2013-06-06 06:54:46 +08:00
context " images " do
2014-07-17 13:40:19 +08:00
2013-06-06 06:54:46 +08:00
it " should dump images " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif'> " , 100 ) ) . to eq ( " [image] " )
2013-06-06 06:54:46 +08:00
end
2013-04-30 11:25:55 +08:00
2013-06-06 06:54:46 +08:00
it " should keep alt tags " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' alt='car' title='my big car'> " , 100 ) ) . to eq ( " [car] " )
2013-06-06 06:54:46 +08:00
end
it " should keep title tags " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' title='car'> " , 100 ) ) . to eq ( " [car] " )
2013-06-06 06:54:46 +08:00
end
it " should convert images to markdown if the option is set " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' title='car'> " , 100 , markdown_images : true ) ) . to eq ( " ![car](http://cnn.com/a.gif) " )
2013-06-06 06:54:46 +08:00
end
2013-02-06 03:16:51 +08:00
2014-02-20 16:48:30 +08:00
it " should keep spoilers " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <div class='spoiler'><img src='http://cnn.com/a.gif'></div> " , 100 ) ) . to match_html " <span class='spoiler'>[image]</span> "
expect ( PrettyText . excerpt ( " <span class='spoiler'>spoiler</div> " , 100 ) ) . to match_html " <span class='spoiler'>spoiler</span> "
2014-02-20 16:48:30 +08:00
end
2014-11-06 03:37:00 +08:00
it " should remove meta informations " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( wrapped_image , 100 ) ) . to match_html " <a href='//localhost:3000/uploads/default/4399/33691397e78b4d75.png' class='lightbox' title='Screen Shot 2014-04-14 at 9.47.10 PM.png'>[image]</a> "
2014-11-06 03:37:00 +08:00
end
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
2013-06-06 06:54:46 +08:00
it " should have an option to strip links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 , strip_links : true ) ) . to eq ( " cnn " )
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
2013-06-06 06:54:46 +08:00
it " should preserve links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 ) ) . to match_html " <a href='http://cnn.com'>cnn</a> "
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should deal with special keys properly " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <pre><b></pre> " , 100 ) ) . to eq ( " " )
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should truncate stuff properly " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " hello world " , 5 ) ) . to eq ( " hello… " )
expect ( PrettyText . excerpt ( " <p>hello</p><p>world</p> " , 6 ) ) . to eq ( " hello w… " )
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should insert a space between to Ps " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <p>a</p><p>b</p> " , 5 ) ) . to eq ( " a b " )
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should strip quotes " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <aside class='quote'><p>a</p><p>b</p></aside>boom " , 5 ) ) . to eq ( " boom " )
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should not count the surrounds of a link " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 3 ) ) . to match_html " <a href='http://cnn.com'>cnn</a> "
2013-02-06 03:16:51 +08:00
end
2013-06-04 04:12:24 +08:00
it " uses an ellipsis instead of html entities if provided with the option " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 2 , text_entities : true ) ) . to match_html " <a href='http://cnn.com'>cn...</a> "
2013-06-04 04:12:24 +08:00
end
2013-02-26 00:42:20 +08:00
it " should truncate links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 2 ) ) . to match_html " <a href='http://cnn.com'>cn…</a> "
2013-02-06 03:16:51 +08:00
end
2014-05-21 05:20:52 +08:00
it " doesn't extract empty quotes as links " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . extract_links ( " <aside class='quote'>not a linked quote</aside> \n " ) . to_a ) . to be_empty
2014-05-21 05:20:52 +08:00
end
2016-03-17 05:35:08 +08:00
it " doesn't extract links from elided parts " do
expect ( PrettyText . extract_links ( " <details class='elided'><a href='http://cnn.com'>cnn</a></details> \n " ) . to_a ) . to be_empty
end
2014-07-11 12:17:01 +08:00
def extract_urls ( text )
PrettyText . extract_links ( text ) . map ( & :url ) . to_a
end
2013-02-26 00:42:20 +08:00
it " should be able to extract links " do
2015-01-10 00:34:37 +08:00
expect ( extract_urls ( " <a href='http://cnn.com'>http://bla.com</a> " ) ) . to eq ( [ " http://cnn.com " ] )
2013-02-06 03:16:51 +08:00
end
2013-02-14 04:22:04 +08:00
it " should extract links to topics " do
2015-01-10 00:34:37 +08:00
expect ( extract_urls ( " <aside class= \" quote \" data-topic= \" 321 \" >aside</aside> " ) ) . to eq ( [ " /t/topic/321 " ] )
2013-02-14 04:22:04 +08:00
end
it " should extract links to posts " do
2015-01-10 00:34:37 +08:00
expect ( extract_urls ( " <aside class= \" quote \" data-topic= \" 1234 \" data-post= \" 4567 \" >aside</aside> " ) ) . to eq ( [ " /t/topic/1234/4567 " ] )
2013-02-14 04:22:04 +08:00
end
2016-04-16 02:02:18 +08:00
it " should not extract links to anchors " do
expect ( extract_urls ( " <a href=' # tos'>TOS</a> " ) ) . to eq ( [ ] )
end
2013-06-06 02:53:07 +08:00
it " should not extract links inside quotes " do
2014-07-11 12:17:01 +08:00
links = PrettyText . extract_links ( "
2013-06-06 02:53:07 +08:00
< a href = 'http://body_only.com' > http : / /use less1 . com < / a>
< aside class = \ " quote \" data-topic= \" 1234 \" >
< a href = 'http://body_and_quote.com' > http : / /use less3 . com < / a>
< a href = 'http://quote_only.com' > http : / /use less4 . com < / a>
< / aside>
< a href = 'http://body_and_quote.com' > http : / /use less2 . com < / a>
2014-07-11 12:17:01 +08:00
" )
2015-01-10 00:34:37 +08:00
expect ( links . map { | l | [ l . url , l . is_quote ] } . to_a . sort ) . to eq (
2014-07-11 12:17:01 +08:00
[ [ " http://body_only.com " , false ] ,
[ " http://body_and_quote.com " , false ] ,
[ " /t/topic/1234 " , true ]
] . sort
2015-01-10 00:34:37 +08:00
)
2013-06-06 02:53:07 +08:00
end
2013-02-26 00:42:20 +08:00
it " should not preserve tags in code blocks " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <pre><code class='handlebars'><h3>Hours</h3></code></pre> " , 100 ) ) . to eq ( " <h3>Hours</h3> " )
2013-02-06 03:16:51 +08:00
end
it " should handle nil " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( nil , 100 ) ) . to eq ( '' )
2013-02-06 03:16:51 +08:00
end
2013-05-10 18:28:17 +08:00
2014-09-03 15:12:56 +08:00
it " handles span excerpt at the beginning of a post " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " <span class='excerpt'>hi</span> test " , 100 ) ) . to eq ( 'hi' )
2014-07-17 19:32:17 +08:00
post = Fabricate ( :post , raw : " <span class='excerpt'>hi</span> test " )
2015-01-10 00:34:37 +08:00
expect ( post . excerpt ) . to eq ( " hi " )
2014-07-17 19:32:17 +08:00
end
2014-09-04 13:03:12 +08:00
it " ignores max excerpt length if a span excerpt is specified " do
two_hundred = " 123456789 " * 20 + " . "
text = two_hundred + " <span class='excerpt'> #{ two_hundred } </span> " + two_hundred
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( text , 100 ) ) . to eq ( two_hundred )
2014-09-03 15:12:56 +08:00
post = Fabricate ( :post , raw : text )
2015-01-10 00:34:37 +08:00
expect ( post . excerpt ) . to eq ( two_hundred )
2014-09-03 15:12:56 +08:00
end
2014-12-10 19:52:51 +08:00
it " unescapes html entities when we want text entities " do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . excerpt ( " & # 39; " , 500 , text_entities : true ) ) . to eq ( " ' " )
2014-12-10 19:52:51 +08:00
end
2015-12-14 21:46:15 +08:00
it " should have an option to preserve emoji images " do
2015-12-23 06:36:21 +08:00
emoji_image = " <img src='/images/emoji/emoji_one/heart.png?v=1' title=':heart:' class='emoji' alt='heart'> "
2015-12-14 21:46:15 +08:00
expect ( PrettyText . excerpt ( emoji_image , 100 , { keep_emoji_images : true } ) ) . to match_html ( emoji_image )
end
it " should have an option to preserve emoji codes " do
emoji_code = " <img src='/images/emoji/emoji_one/heart.png?v=1' title=':heart:' class='emoji' alt=':heart:'> "
2016-06-02 10:29:25 +08:00
expect ( PrettyText . excerpt ( emoji_code , 100 ) ) . to eq ( " :heart: " )
2015-07-23 23:02:03 +08:00
end
2013-02-06 03:16:51 +08:00
end
2013-06-06 03:28:10 +08:00
describe " strip links " do
it " returns blank for blank input " do
expect ( PrettyText . strip_links ( " " ) ) . to be_blank
end
it " does nothing to a string without links " do
expect ( PrettyText . strip_links ( " I'm the <b>batman</b> " ) ) . to eq ( " I'm the <b>batman</b> " )
end
it " strips links but leaves the text content " do
expect ( PrettyText . strip_links ( " I'm the linked <a href='http://en.wikipedia.org/wiki/Batman'>batman</a> " ) ) . to eq ( " I'm the linked batman " )
end
2014-09-18 00:08:00 +08:00
it " escapes the text content " do
expect ( PrettyText . strip_links ( " I'm the linked <a href='http://en.wikipedia.org/wiki/Batman'><batman></a> " ) ) . to eq ( " I'm the linked <batman> " )
end
2013-06-06 03:28:10 +08:00
end
2013-02-11 08:43:07 +08:00
2016-05-21 21:17:54 +08:00
describe " strip_image_wrapping " do
def strip_image_wrapping ( html )
2014-04-18 00:32:51 +08:00
doc = Nokogiri :: HTML . fragment ( html )
2016-05-21 21:17:54 +08:00
described_class . strip_image_wrapping ( doc )
2014-04-18 00:32:51 +08:00
doc . to_html
end
2016-05-21 21:17:54 +08:00
it " doesn't change HTML when there's no wrapped image " do
html = " <img src= \" wat.png \" > "
expect ( strip_image_wrapping ( html ) ) . to eq ( html )
end
it " strips the metadata " do
expect ( strip_image_wrapping ( wrapped_image ) ) . to match_html " <div class= \" lightbox-wrapper \" ><a href= \" //localhost:3000/uploads/default/4399/33691397e78b4d75.png \" class= \" lightbox \" title= \" Screen Shot 2014-04-14 at 9.47.10 PM.png \" ><img src= \" //localhost:3000/uploads/default/_optimized/bd9/b20/bbbcd6a0c0_655x500.png \" width= \" 655 \" height= \" 500 \" ></a></div> "
end
end
describe 'format_for_email' do
let ( :base_url ) { " http://baseurl.net " }
let ( :post ) { Fabricate ( :post ) }
2013-11-29 04:57:21 +08:00
before do
Discourse . stubs ( :base_url ) . returns ( base_url )
end
2016-05-21 21:17:54 +08:00
it 'does not crash' do
PrettyText . format_for_email ( '<a href="mailto:michael.brown@discourse.org?subject=Your%20post%20at%20http://try.discourse.org/t/discussion-happens-so-much/127/1000?u=supermathie">test</a>' , post )
end
2013-11-29 04:57:21 +08:00
it " adds base url to relative links " do
html = " <p><a class= \" mention \" href= \" /users/wiseguy \" >@wiseguy</a>, <a class= \" mention \" href= \" /users/trollol \" >@trollol</a> what do you guys think? </p> "
2016-05-21 21:17:54 +08:00
output = described_class . format_for_email ( html , post )
expect ( output ) . to eq ( " <p><a href= \" #{ base_url } /users/wiseguy \" >@wiseguy</a>, <a href= \" #{ base_url } /users/trollol \" >@trollol</a> what do you guys think? </p> " )
2013-11-29 04:57:21 +08:00
end
it " doesn't change external absolute links " do
html = " <p>Check out <a href= \" http://mywebsite.com/users/boss \" >this guy</a>.</p> "
2016-05-21 21:17:54 +08:00
expect ( described_class . format_for_email ( html , post ) ) . to eq ( html )
2013-11-29 04:57:21 +08:00
end
it " doesn't change internal absolute links " do
html = " <p>Check out <a href= \" #{ base_url } /users/boss \" >this guy</a>.</p> "
2016-05-21 21:17:54 +08:00
expect ( described_class . format_for_email ( html , post ) ) . to eq ( html )
2013-11-29 04:57:21 +08:00
end
it " can tolerate invalid URLs " do
html = " <p>Check out <a href= \" not a real url \" >this guy</a>.</p> "
2016-05-21 21:17:54 +08:00
expect { described_class . format_for_email ( html , post ) } . to_not raise_error
2014-07-30 15:09:55 +08:00
end
end
2014-12-23 15:25:10 +08:00
it 'can escape *' do
2015-01-10 00:34:37 +08:00
expect ( PrettyText . cook ( " ***a***a " ) ) . to match_html ( " <p><strong><em>a</em></strong>a</p> " )
expect ( PrettyText . cook ( " *** \\ ****a " ) ) . to match_html ( " <p><strong><em>*</em></strong>a</p> " )
2014-12-23 15:25:10 +08:00
end
2015-03-13 13:15:13 +08:00
it 'can include code class correctly' do
expect ( PrettyText . cook ( " ```cpp \n cpp \n ``` " ) ) . to match_html ( " <p></p><pre><code class='lang-cpp'>cpp</code></pre> " )
end
2015-07-31 15:53:20 +08:00
it 'indents code correctly' do
code = " X \n ``` \n \n # \n x \n ``` "
cooked = PrettyText . cook ( code )
expect ( cooked ) . to match_html ( " <p>X<br></p> \n \n <p></p><pre><code class= \" lang-auto \" > # \n x</code></pre> " )
end
2015-05-26 09:13:12 +08:00
it 'can substitute s3 cdn correctly' do
SiteSetting . enable_s3_uploads = true
SiteSetting . s3_access_key_id = " XXX "
SiteSetting . s3_secret_access_key = " XXX "
SiteSetting . s3_upload_bucket = " test "
SiteSetting . s3_cdn_url = " https://awesome.cdn "
2015-06-10 16:56:44 +08:00
# add extra img tag to ensure it does not blow up
raw = " <img><img src=' #{ Discourse . store . absolute_base_url } /original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg' "
cooked = " <p><img><img src='https://awesome.cdn/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg'></p> "
2015-05-26 09:13:12 +08:00
expect ( PrettyText . cook ( raw ) ) . to match_html ( cooked )
end
2015-07-20 14:56:32 +08:00
describe 'tables' do
before do
PrettyText . reset_context
end
after do
PrettyText . reset_context
end
it 'allows table html' do
SiteSetting . allow_html_tables = true
PrettyText . reset_context
2015-07-20 15:06:00 +08:00
table = " <table class='fa-spin'><thead><tr> \n <th class='fa-spin'>test</th></tr></thead><tbody><tr><td>a</td></tr></tbody></table> "
2015-07-20 14:56:32 +08:00
match = " <table class= \" md-table \" ><thead><tr> <th>test</th> </tr></thead><tbody><tr><td>a</td></tr></tbody></table> "
expect ( PrettyText . cook ( table ) ) . to match_html ( match )
end
it 'allows no tables when not enabled' do
SiteSetting . allow_html_tables = false
table = " <table><thead><tr><th>test</th></tr></thead><tbody><tr><td>a</td></tr></tbody></table> "
expect ( PrettyText . cook ( table ) ) . to match_html ( " " )
end
2015-12-30 05:27:56 +08:00
end
describe " emoji " do
it " replaces unicode emoji with our emoji sets if emoji is enabled " do
expect ( PrettyText . cook ( " 💣 " ) ) . to match ( / \ :bomb \ : / )
end
2015-07-20 14:56:32 +08:00
2016-03-03 03:31:32 +08:00
it " doesn't replace emoji in inline code blocks with our emoji sets if emoji is enabled " do
expect ( PrettyText . cook ( " `💣` " ) ) . not_to match ( / \ :bomb \ : / )
end
it " doesn't replace emoji in code blocks with our emoji sets if emoji is enabled " do
expect ( PrettyText . cook ( " ``` \n 💣` \n ``` \n " ) ) . not_to match ( / \ :bomb \ : / )
end
2015-12-31 03:46:52 +08:00
it " replaces some glyphs that are not in the emoji range " do
2016-03-05 03:20:44 +08:00
expect ( PrettyText . cook ( " ☺ " ) ) . to match ( / \ :slight_smile \ : / )
2015-12-31 03:46:52 +08:00
end
2015-12-30 05:27:56 +08:00
it " doesn't replace unicode emoji if emoji is disabled " do
2015-12-14 21:46:15 +08:00
SiteSetting . enable_emoji = false
2015-12-30 05:27:56 +08:00
expect ( PrettyText . cook ( " 💣 " ) ) . not_to match ( / \ :bomb \ : / )
end
2015-07-20 14:56:32 +08:00
end
2016-05-02 09:36:09 +08:00
describe " tag and category links " do
it " produces tag links " do
2016-05-05 02:02:47 +08:00
Fabricate ( :topic , { tags : [ Fabricate ( :tag , name : 'known' ) ] } )
2016-05-02 09:36:09 +08:00
expect ( PrettyText . cook ( " # unknown::tag # known::tag " ) ) . to match_html ( " <p> <span class= \" hashtag \" > # unknown::tag</span> <a class= \" hashtag \" href= \" http://test.localhost/tags/known \" > # <span>known</span></a></p> " )
end
2016-05-05 02:02:47 +08:00
# TODO does it make sense to generate hashtags for tags that are missing in action?
2016-05-02 09:36:09 +08:00
end
2013-02-06 03:16:51 +08:00
end