2013-02-06 03:16:51 +08:00
require 'spec_helper'
require 'pretty_text'
describe PrettyText do
2013-02-26 00:42:20 +08:00
describe " Cooking " do
2013-02-06 03:16:51 +08:00
2013-08-14 04:08:29 +08:00
describe " with avatar " do
2013-02-06 03:16:51 +08:00
2013-08-14 04:08:29 +08:00
before ( :each ) do
eviltrout = User . new
eviltrout . stubs ( :avatar_template ) . returns ( " http://test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/{size}.png " )
User . expects ( :where ) . with ( username_lower : " eviltrout " ) . returns ( [ eviltrout ] )
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
2013-09-28 03:08:30 +08:00
PrettyText . cook ( " [quote= \" EvilTrout, post:123, topic:456, full:true \" ]ddd \n [/quote] " ) . should match_html " <p><aside class= \" quote \" data-post= \" 123 \" data-topic= \" 456 \" data-full= \" true \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img width= \" 20 \" height= \" 20 \" src= \" http://test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout said:</div> \n <blockquote><p>ddd</p></blockquote></aside></p> "
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
2013-09-28 03:08:30 +08:00
PrettyText . cook ( " [quote= \" EvilTrout, post:123, topic:456, full:true \" ]ddd[/quote] " ) . should match_html " <p><aside class= \" quote \" data-post= \" 123 \" data-topic= \" 456 \" data-full= \" true \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img width= \" 20 \" height= \" 20 \" src= \" http://test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout said:</div> \n <blockquote><p>ddd</p></blockquote></aside></p> "
2013-08-14 04:08:29 +08:00
end
it " trims spaces on quote params " do
2013-09-28 03:08:30 +08:00
PrettyText . cook ( " [quote= \" EvilTrout, post:555, topic: 666 \" ]ddd[/quote] " ) . should match_html " <p><aside class= \" quote \" data-post= \" 555 \" data-topic= \" 666 \" ><div class= \" title \" > \n <div class= \" quote-controls \" ></div> \n <img width= \" 20 \" height= \" 20 \" src= \" http://test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/40.png \" class= \" avatar \" >EvilTrout said:</div> \n <blockquote><p>ddd</p></blockquote></aside></p> "
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
2013-04-10 11:27:33 +08:00
PrettyText . cook ( '@hello @hello @hello' ) . should 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
it " should sanitize the html " do
2013-10-19 03:20:27 +08:00
PrettyText . cook ( " <script>alert(42)</script> " ) . should match_html " <p></p> "
2013-02-06 03:16:51 +08:00
end
it 'should allow for @mentions to have punctuation' do
2013-04-10 11:27:33 +08:00
PrettyText . cook ( " hello @bob's @bob,@bob; @bob \" " ) . should
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
it 'should add spoiler tags' do
2013-04-10 11:27:33 +08:00
PrettyText . cook ( " [spoiler]hello[/spoiler] " ) . should match_html " <p><span class= \" spoiler \" >hello</span></p> "
2013-02-06 03:16:51 +08:00
end
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 )
2013-02-11 15:58:19 +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
2013-02-11 08:43:07 +08:00
PrettyText . cook ( '<a href="http://cnn.com">cnn</a>' ) . should =~ / nofollow /
end
2013-02-26 00:42:20 +08:00
it " should not inject nofollow in all local links " do
( PrettyText . cook ( " <a href=' #{ Discourse . base_url } /test.html'>cnn</a> " ) !~ / nofollow / ) . should be_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
( PrettyText . cook ( " <a href=' #{ Discourse . base_url . sub ( 'http://' , 'http://bla.' ) } /test.html'>cnn</a> " ) !~ / nofollow / ) . should be_true
2013-02-11 08:43:07 +08:00
end
2013-02-11 15:58:19 +08:00
it " should not inject nofollow for foo.com " do
2013-02-26 00:42:20 +08:00
( PrettyText . cook ( " <a href='http://foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . should be_true
2013-02-11 15:58:19 +08:00
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
2013-02-26 00:42:20 +08:00
( PrettyText . cook ( " <a href='http://bar.foo.com/test.html'>cnn</a> " ) !~ / nofollow / ) . should be_true
2013-02-11 15:58:19 +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
2013-06-06 06:54:46 +08:00
context " images " do
it " should dump images " do
PrettyText . excerpt ( " <img src='http://cnn.com/a.gif'> " , 100 ) . should == " [image] "
end
2013-04-30 11:25:55 +08:00
2013-06-06 06:54:46 +08:00
it " should keep alt tags " do
PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' alt='car' title='my big car'> " , 100 ) . should == " [car] "
end
it " should keep title tags " do
PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' title='car'> " , 100 ) . should == " [car] "
end
it " should convert images to markdown if the option is set " do
PrettyText . excerpt ( " <img src='http://cnn.com/a.gif' title='car'> " , 100 , markdown_images : true ) . should == " ![car](http://cnn.com/a.gif) "
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
PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 , strip_links : true ) . should == " 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
PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 100 ) . should == " <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
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " <pre><b></pre> " , 100 ) . should == " "
end
2013-02-26 00:42:20 +08:00
it " should truncate stuff properly " do
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " hello world " , 5 ) . should == " hello… "
2013-05-10 18:28:17 +08:00
PrettyText . excerpt ( " <p>hello</p><p>world</p> " , 6 ) . should == " 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
2013-06-05 00:05:36 +08:00
PrettyText . excerpt ( " <p>a</p><p>b</p> " , 5 ) . should == " a b "
2013-02-06 03:16:51 +08:00
end
2013-02-26 00:42:20 +08:00
it " should strip quotes " do
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " <aside class='quote'><p>a</p><p>b</p></aside>boom " , 5 ) . should == " boom "
end
2013-02-26 00:42:20 +08:00
it " should not count the surrounds of a link " do
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 3 ) . should == " <a href='http://cnn.com'>cnn</a> "
end
2013-06-04 04:12:24 +08:00
it " uses an ellipsis instead of html entities if provided with the option " do
PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 2 , text_entities : true ) . should == " <a href='http://cnn.com'>cn...</a> "
end
2013-02-26 00:42:20 +08:00
it " should truncate links " do
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " <a href='http://cnn.com'>cnn</a> " , 2 ) . should == " <a href='http://cnn.com'>cn…</a> "
end
2013-02-26 00:42:20 +08:00
it " should be able to extract links " do
2013-02-06 03:16:51 +08:00
PrettyText . extract_links ( " <a href='http://cnn.com'>http://bla.com</a> " ) . to_a . should == [ " http://cnn.com " ]
end
2013-02-14 04:22:04 +08:00
it " should extract links to topics " do
PrettyText . extract_links ( " <aside class= \" quote \" data-topic= \" 321 \" >aside</aside> " ) . to_a . should == [ " /t/topic/321 " ]
end
it " should extract links to posts " do
PrettyText . extract_links ( " <aside class= \" quote \" data-topic= \" 1234 \" data-post= \" 4567 \" >aside</aside> " ) . to_a . should == [ " /t/topic/1234/4567 " ]
end
2013-06-06 02:53:07 +08:00
it " should not extract links inside quotes " do
PrettyText . extract_links ( "
< 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>
" ).to_a.should == [ " http : / / body_only . com " , " http : / / body_and_quote . com " , " / t / topic / 1234 " ]
end
2013-02-26 00:42:20 +08:00
it " should not preserve tags in code blocks " do
2013-02-06 03:16:51 +08:00
PrettyText . excerpt ( " <pre><code class='handlebars'><h3>Hours</h3></code></pre> " , 100 ) . should == " <h3>Hours</h3> "
end
it " should handle nil " do
PrettyText . excerpt ( nil , 100 ) . should == ''
end
2013-05-10 18:28:17 +08:00
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
end
2013-02-11 08:43:07 +08:00
2013-11-29 04:57:21 +08:00
describe " make_all_links_absolute " do
let ( :base_url ) { " http://baseurl.net " }
before do
Discourse . stubs ( :base_url ) . returns ( base_url )
end
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> "
output = described_class . make_all_links_absolute ( html )
output . should == " <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> "
end
it " doesn't change external absolute links " do
html = " <p>Check out <a href= \" http://mywebsite.com/users/boss \" >this guy</a>.</p> "
described_class . make_all_links_absolute ( html ) . should == html
end
it " doesn't change internal absolute links " do
html = " <p>Check out <a href= \" #{ base_url } /users/boss \" >this guy</a>.</p> "
described_class . make_all_links_absolute ( html ) . should == html
end
it " can tolerate invalid URLs " do
html = " <p>Check out <a href= \" not a real url \" >this guy</a>.</p> "
expect { described_class . make_all_links_absolute ( html ) } . to_not raise_error
end
end
2013-02-06 03:16:51 +08:00
end