2015-10-11 05:41:23 -04:00
require 'rails_helper'
2013-02-05 14:16:51 -05:00
require 'pretty_text'
describe PrettyText do
2014-11-05 14:37:00 -05: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-25 11:42:20 -05:00
describe " Cooking " do
2013-02-05 14:16:51 -05:00
2015-09-24 23:35:14 -04: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 00:18:18 -04: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-24 23:35:14 -04: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-13 16:08:29 -04:00
describe " with avatar " do
2015-06-26 13:37:50 -04:00
let ( :default_avatar ) { " //test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/{size}.png " }
2013-02-05 14:16:51 -05:00
2015-09-24 23:35:14 -04:00
before do
2013-08-13 16:08:29 -04:00
eviltrout = User . new
2015-06-26 13:37:50 -04:00
User . stubs ( :default_template ) . returns ( default_avatar )
2014-05-06 09:41:59 -04:00
User . expects ( :find_by ) . with ( username_lower : " eviltrout " ) . returns ( eviltrout )
2013-08-13 16:08:29 -04:00
end
2013-02-05 14:16:51 -05:00
2013-08-13 16:08:29 -04:00
it " produces a quote even with new lines in it " do
2015-12-15 03:56:45 -05: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-13 16:08:29 -04:00
end
2013-02-05 14:16:51 -05:00
2013-08-13 16:08:29 -04:00
it " should produce a quote " do
2015-12-15 03:56:45 -05: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-13 16:08:29 -04:00
end
it " trims spaces on quote params " do
2015-12-15 03:56:45 -05: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-13 16:08:29 -04:00
end
end
2013-02-05 14:16:51 -05:00
2013-02-25 11:42:20 -05:00
it " should handle 3 mentions in a row " do
2015-01-09 11:34:37 -05: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-05 14:16:51 -05:00
end
2016-02-23 14:57:54 -05: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-05 14:16:51 -05:00
it " should sanitize the html " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " <script>alert(42)</script> " ) ) . to match_html " <p></p> "
2013-02-05 14:16:51 -05:00
end
it 'should allow for @mentions to have punctuation' do
2015-01-09 11:34:37 -05: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-05 14:16:51 -05:00
end
2014-10-02 22:37:07 -04:00
# see: https://github.com/sparklemotion/nokogiri/issues/1173
2014-10-29 11:06:50 -04:00
skip 'allows html entities correctly' do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " ℵ£& # 162; " ) ) . to eq ( " <p>ℵ£& # 162;</p> " )
2014-10-02 22:37:07 -04:00
end
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
2013-02-10 19:43:07 -05:00
describe " rel nofollow " do
2013-02-25 11:42:20 -05:00
before do
2013-02-10 19:43:07 -05:00
SiteSetting . stubs ( :add_rel_nofollow_to_user_content ) . returns ( true )
2014-03-29 19:50:44 -04:00
SiteSetting . stubs ( :exclude_rel_nofollow_domains ) . returns ( " foo.com|bar.com " )
2013-02-10 19:43:07 -05:00
end
2013-02-25 11:42:20 -05:00
it " should inject nofollow in all user provided links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( '<a href="http://cnn.com">cnn</a>' ) ) . to match ( / nofollow / )
2013-02-10 19:43:07 -05:00
end
2013-02-25 11:42:20 -05:00
it " should not inject nofollow in all local links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " <a href=' #{ Discourse . base_url } /test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-10 19:43:07 -05:00
end
2013-02-25 11:42:20 -05:00
it " should not inject nofollow in all subdomain links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " <a href=' #{ Discourse . base_url . sub ( 'http://' , 'http://bla.' ) } /test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-10 19:43:07 -05:00
end
2013-02-11 02:58:19 -05:00
2015-05-27 00:31:01 -04: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 02:58:19 -05:00
it " should not inject nofollow for foo.com " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " <a href='http://foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 02:58:19 -05:00
end
2015-05-27 00:31:01 -04: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-25 11:42:20 -05:00
2013-02-11 02:58:19 -05:00
it " should not inject nofollow for bar.foo.com " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( " <a href='http://bar.foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . to eq ( true )
2013-02-11 02:58:19 -05:00
end
2014-01-15 11:34:17 -05:00
it " should not inject nofollow if omit_nofollow option is given " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . cook ( '<a href="http://cnn.com">cnn</a>' , omit_nofollow : true ) !~ / nofollow / ) . to eq ( true )
2014-01-15 11:34:17 -05:00
end
2013-02-10 19:43:07 -05:00
end
2013-02-05 14:16:51 -05:00
2013-02-25 11:42:20 -05:00
describe " Excerpt " do
2013-04-29 23:25:55 -04:00
2014-07-24 22:15:43 -04: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-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( spinner , 20 ) ) . to match_html spinner
2014-07-24 22:15:43 -04: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-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( spinner , 20 ) ) . to match_html spinner
2014-07-24 22:15:43 -04:00
end
2013-06-05 18:54:46 -04:00
context " images " do
2014-07-17 01:40:19 -04:00
2013-06-05 18:54:46 -04:00
it " should dump images " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif'> " , 100 ) ) . to eq ( " [image] " )
2013-06-05 18:54:46 -04:00
end
2013-04-29 23:25:55 -04:00
2013-06-05 18:54:46 -04:00
it " should keep alt tags " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' alt='car' title='my big car'> " , 100 ) ) . to eq ( " [car] " )
2013-06-05 18:54:46 -04:00
end
it " should keep title tags " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' title='car'> " , 100 ) ) . to eq ( " [car] " )
2013-06-05 18:54:46 -04:00
end
it " should convert images to markdown if the option is set " do
2015-01-09 11:34:37 -05: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-05 18:54:46 -04:00
end
2013-02-05 14:16:51 -05:00
2014-02-20 03:48:30 -05:00
it " should keep spoilers " do
2015-01-09 11:34:37 -05: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 03:48:30 -05:00
end
2014-11-05 14:37:00 -05:00
it " should remove meta informations " do
2015-01-09 11:34:37 -05: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-05 14:37:00 -05:00
end
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
2013-06-05 18:54:46 -04:00
it " should have an option to strip links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 , strip_links : true ) ) . to eq ( " cnn " )
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
2013-06-05 18:54:46 -04:00
it " should preserve links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 ) ) . to match_html " <a href='http://cnn.com'>cnn</a> "
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
it " should deal with special keys properly " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <pre><b></pre> " , 100 ) ) . to eq ( " " )
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
it " should truncate stuff properly " do
2015-01-09 11:34:37 -05: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-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
it " should insert a space between to Ps " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <p>a</p><p>b</p> " , 5 ) ) . to eq ( " a b " )
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
it " should strip quotes " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <aside class='quote'><p>a</p><p>b</p></aside>boom " , 5 ) ) . to eq ( " boom " )
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
it " should not count the surrounds of a link " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 3 ) ) . to match_html " <a href='http://cnn.com'>cnn</a> "
2013-02-05 14:16:51 -05:00
end
2013-06-03 16:12:24 -04:00
it " uses an ellipsis instead of html entities if provided with the option " do
2015-01-09 11:34:37 -05: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-03 16:12:24 -04:00
end
2013-02-25 11:42:20 -05:00
it " should truncate links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 2 ) ) . to match_html " <a href='http://cnn.com'>cn…</a> "
2013-02-05 14:16:51 -05:00
end
2014-05-20 17:20:52 -04:00
it " doesn't extract empty quotes as links " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . extract_links ( " <aside class='quote'>not a linked quote</aside> \n " ) . to_a ) . to be_empty
2014-05-20 17:20:52 -04:00
end
2016-03-16 17:35:08 -04: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 00:17:01 -04:00
def extract_urls ( text )
PrettyText . extract_links ( text ) . map ( & :url ) . to_a
end
2013-02-25 11:42:20 -05:00
it " should be able to extract links " do
2015-01-09 11:34:37 -05:00
expect ( extract_urls ( " <a href='http://cnn.com'>http://bla.com</a> " ) ) . to eq ( [ " http://cnn.com " ] )
2013-02-05 14:16:51 -05:00
end
2013-02-13 15:22:04 -05:00
it " should extract links to topics " do
2015-01-09 11:34:37 -05:00
expect ( extract_urls ( " <aside class= \" quote \" data-topic= \" 321 \" >aside</aside> " ) ) . to eq ( [ " /t/topic/321 " ] )
2013-02-13 15:22:04 -05:00
end
2016-09-22 16:50:05 -04:00
it " should lazyYT videos " do
expect ( extract_urls ( " <div class= \" lazyYT \" data-youtube-id= \" yXEuEUQIP3Q \" data-youtube-title= \" Mister Rogers defending PBS to the US Senate \" data-width= \" 480 \" data-height= \" 270 \" data-parameters= \" feature=oembed&wmode=opaque \" ></div> " ) ) . to eq ( [ " https://www.youtube.com/watch?v=yXEuEUQIP3Q " ] )
end
2013-02-13 15:22:04 -05:00
it " should extract links to posts " do
2015-01-09 11:34:37 -05:00
expect ( extract_urls ( " <aside class= \" quote \" data-topic= \" 1234 \" data-post= \" 4567 \" >aside</aside> " ) ) . to eq ( [ " /t/topic/1234/4567 " ] )
2013-02-13 15:22:04 -05:00
end
2016-04-15 14:02:18 -04:00
it " should not extract links to anchors " do
expect ( extract_urls ( " <a href=' # tos'>TOS</a> " ) ) . to eq ( [ ] )
end
2013-06-05 14:53:07 -04:00
it " should not extract links inside quotes " do
2014-07-11 00:17:01 -04:00
links = PrettyText . extract_links ( "
2013-06-05 14:53:07 -04: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 00:17:01 -04:00
" )
2015-01-09 11:34:37 -05:00
expect ( links . map { | l | [ l . url , l . is_quote ] } . to_a . sort ) . to eq (
2014-07-11 00:17:01 -04:00
[ [ " http://body_only.com " , false ] ,
[ " http://body_and_quote.com " , false ] ,
[ " /t/topic/1234 " , true ]
] . sort
2015-01-09 11:34:37 -05:00
)
2013-06-05 14:53:07 -04:00
end
2013-02-25 11:42:20 -05:00
it " should not preserve tags in code blocks " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <pre><code class='handlebars'><h3>Hours</h3></code></pre> " , 100 ) ) . to eq ( " <h3>Hours</h3> " )
2013-02-05 14:16:51 -05:00
end
it " should handle nil " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( nil , 100 ) ) . to eq ( '' )
2013-02-05 14:16:51 -05:00
end
2013-05-10 06:28:17 -04:00
2014-09-03 03:12:56 -04:00
it " handles span excerpt at the beginning of a post " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " <span class='excerpt'>hi</span> test " , 100 ) ) . to eq ( 'hi' )
2014-07-17 07:32:17 -04:00
post = Fabricate ( :post , raw : " <span class='excerpt'>hi</span> test " )
2015-01-09 11:34:37 -05:00
expect ( post . excerpt ) . to eq ( " hi " )
2014-07-17 07:32:17 -04:00
end
2014-09-04 01:03:12 -04: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-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( text , 100 ) ) . to eq ( two_hundred )
2014-09-03 03:12:56 -04:00
post = Fabricate ( :post , raw : text )
2015-01-09 11:34:37 -05:00
expect ( post . excerpt ) . to eq ( two_hundred )
2014-09-03 03:12:56 -04:00
end
2014-12-10 06:52:51 -05:00
it " unescapes html entities when we want text entities " do
2015-01-09 11:34:37 -05:00
expect ( PrettyText . excerpt ( " & # 39; " , 500 , text_entities : true ) ) . to eq ( " ' " )
2014-12-10 06:52:51 -05:00
end
2015-12-14 08:46:15 -05:00
it " should have an option to preserve emoji images " do
2015-12-22 17:36:21 -05:00
emoji_image = " <img src='/images/emoji/emoji_one/heart.png?v=1' title=':heart:' class='emoji' alt='heart'> "
2015-12-14 08:46:15 -05:00
expect ( PrettyText . excerpt ( emoji_image , 100 , { keep_emoji_images : true } ) ) . to match_html ( emoji_image )
end
2016-10-10 22:03:21 -04:00
it " should have an option to remap emoji to code points " do
emoji_image = " I <img src='/images/emoji/emoji_one/heart.png?v=1' title=':heart:' class='emoji' alt=':heart:'> you <img src='/images/emoji/emoji_one/heart.png?v=1' title=':unknown:' class='emoji' alt=':unknown:'> "
expect ( PrettyText . excerpt ( emoji_image , 100 , { remap_emoji : true } ) ) . to match_html ( " I ❤ you :unknown: " )
end
2015-12-14 08:46:15 -05:00
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-01 22:29:25 -04:00
expect ( PrettyText . excerpt ( emoji_code , 100 ) ) . to eq ( " :heart: " )
2015-07-23 11:02:03 -04:00
end
2013-02-05 14:16:51 -05:00
end
2013-06-05 15:28:10 -04: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-17 12:08:00 -04: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-05 15:28:10 -04:00
end
2013-02-10 19:43:07 -05:00
2016-05-21 09:17:54 -04:00
describe " strip_image_wrapping " do
def strip_image_wrapping ( html )
2014-04-17 12:32:51 -04:00
doc = Nokogiri :: HTML . fragment ( html )
2016-05-21 09:17:54 -04:00
described_class . strip_image_wrapping ( doc )
2014-04-17 12:32:51 -04:00
doc . to_html
end
2016-05-21 09:17:54 -04: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-28 15:57:21 -05:00
before do
Discourse . stubs ( :base_url ) . returns ( base_url )
end
2016-05-21 09:17:54 -04: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-28 15:57:21 -05: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 09:17:54 -04:00
output = described_class . format_for_email ( html , post )
2016-06-21 11:12:30 -04:00
expect ( output ) . to eq ( " <p><a class= \" mention \" href= \" #{ base_url } /users/wiseguy \" >@wiseguy</a>, <a class= \" mention \" href= \" #{ base_url } /users/trollol \" >@trollol</a> what do you guys think? </p> " )
2013-11-28 15:57:21 -05: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 09:17:54 -04:00
expect ( described_class . format_for_email ( html , post ) ) . to eq ( html )
2013-11-28 15:57:21 -05: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 09:17:54 -04:00
expect ( described_class . format_for_email ( html , post ) ) . to eq ( html )
2013-11-28 15:57:21 -05: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 09:17:54 -04:00
expect { described_class . format_for_email ( html , post ) } . to_not raise_error
2014-07-30 03:09:55 -04:00
end
end
2014-12-23 02:25:10 -05:00
it 'can escape *' do
2015-01-09 11:34:37 -05: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 02:25:10 -05:00
end
2015-03-13 01:15:13 -04: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 03:53:20 -04: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-25 21:13:12 -04: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 04:56:44 -04:00
# add extra img tag to ensure it does not blow up
2016-06-30 04:58:12 -04:00
raw = <<HTML
< img >
< img src = 'https:#{Discourse.store.absolute_base_url}/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg' >
< img src = 'http:#{Discourse.store.absolute_base_url}/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg' >
< img src = '#{Discourse.store.absolute_base_url}/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg' >
HTML
cooked = <<HTML
< p > < img > < br > < img src = " https://awesome.cdn/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg " > < br > < img src = " https://awesome.cdn/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg " > < br > < img src = " https://awesome.cdn/original/9/9/99c9384b8b6d87f8509f8395571bc7512ca3cad1.jpg " > < / p>
HTML
2015-05-25 21:13:12 -04:00
expect ( PrettyText . cook ( raw ) ) . to match_html ( cooked )
end
2015-07-20 02:56:32 -04:00
describe 'tables' do
it 'allows table html' do
SiteSetting . allow_html_tables = true
2015-07-20 03:06:00 -04: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 02:56:32 -04: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-29 16:27:56 -05: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 02:56:32 -04:00
2016-03-02 14:31:32 -05: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-30 14:46:52 -05:00
it " replaces some glyphs that are not in the emoji range " do
2016-03-04 14:20:44 -05:00
expect ( PrettyText . cook ( " ☺ " ) ) . to match ( / \ :slight_smile \ : / )
2015-12-30 14:46:52 -05:00
end
2015-12-29 16:27:56 -05:00
it " doesn't replace unicode emoji if emoji is disabled " do
2015-12-14 08:46:15 -05:00
SiteSetting . enable_emoji = false
2015-12-29 16:27:56 -05:00
expect ( PrettyText . cook ( " 💣 " ) ) . not_to match ( / \ :bomb \ : / )
end
2015-07-20 02:56:32 -04:00
end
2016-05-01 21:36:09 -04:00
describe " tag and category links " do
it " produces tag links " do
2016-05-04 14:02:47 -04:00
Fabricate ( :topic , { tags : [ Fabricate ( :tag , name : 'known' ) ] } )
2016-05-01 21:36:09 -04: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-04 14:02:47 -04:00
# TODO does it make sense to generate hashtags for tags that are missing in action?
2016-06-14 14:31:51 -04:00
end
2016-05-04 14:02:47 -04:00
2016-06-14 14:31:51 -04:00
describe " custom emoji " do
it " replaces the custom emoji " do
Emoji . stubs ( :custom ) . returns ( [ Emoji . create_from_path ( 'trout' ) ] )
expect ( PrettyText . cook ( " hello :trout: " ) ) . to match ( / <img src[^>]+trout[^>]+> / )
end
2016-05-01 21:36:09 -04:00
end
2016-11-08 16:36:34 -05:00
describe " censored_pattern site setting " do
it " can be cleared if it causes cooking to timeout " do
SiteSetting . censored_pattern = " evilregex "
described_class . stubs ( :markdown ) . raises ( MiniRacer :: ScriptTerminatedError )
PrettyText . cook ( " Protect against it plz. " ) rescue nil
expect ( SiteSetting . censored_pattern ) . to be_blank
end
end
2013-02-05 14:16:51 -05:00
end