2013-02-05 14:16:51 -05:00
|
|
|
require 'spec_helper'
|
|
|
|
require 'pretty_text'
|
|
|
|
|
|
|
|
describe PrettyText do
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
describe "Cooking" do
|
2013-02-05 14:16:51 -05:00
|
|
|
it "should support github style code blocks" do
|
|
|
|
PrettyText.cook("```
|
|
|
|
test
|
2013-04-09 23:27:33 -04:00
|
|
|
```").should match_html "<pre><code class=\"lang-auto\">test \n</code></pre>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should support quoting [] " do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.cook("[quote=\"EvilTrout, post:123, topic:456, full:true\"][sam][/quote]").should =~ /\[sam\]/
|
|
|
|
end
|
|
|
|
|
2013-08-13 16:08:29 -04:00
|
|
|
describe "with avatar" do
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-08-13 16:08:29 -04: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-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
|
|
|
|
PrettyText.cook("[quote=\"EvilTrout, post:123, topic:456, full:true\"]ddd\n[/quote]").should match_html "<p></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\">\n EvilTrout said:\n </div>\n <blockquote>ddd</blockquote>\n</aside><p></p>"
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-08-13 16:08:29 -04:00
|
|
|
it "should produce a quote" do
|
|
|
|
PrettyText.cook("[quote=\"EvilTrout, post:123, topic:456, full:true\"]ddd[/quote]").should match_html "<p></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\">\n EvilTrout said:\n </div>\n <blockquote>ddd</blockquote>\n</aside><p></p>"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "trims spaces on quote params" do
|
|
|
|
PrettyText.cook("[quote=\"EvilTrout, post:555, topic: 666\"]ddd[/quote]").should match_html "<p></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\">\n EvilTrout said:\n </div>\n <blockquote>ddd</blockquote>\n</aside><p></p>"
|
|
|
|
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
|
2013-04-09 23:27:33 -04: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-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should not do weird @ mention stuff inside a pre block" do
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.cook("```
|
|
|
|
a @test
|
2013-04-09 23:27:33 -04:00
|
|
|
```").should match_html "<pre><code class=\"lang-auto\">a @test \n</code></pre>"
|
2013-02-25 11:42:20 -05:00
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it "should sanitize the html" do
|
2013-04-09 23:27:33 -04:00
|
|
|
PrettyText.cook("<script>alert(42)</script>").should match_html "alert(42)"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should escape html within the code block" do
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.cook("```text
|
|
|
|
<header>hello</header>
|
2013-04-09 23:27:33 -04:00
|
|
|
```").should match_html "<pre><code class=\"text\"><header>hello</header> \n</code></pre>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should support language choices" do
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.cook("```ruby
|
|
|
|
test
|
2013-04-09 23:27:33 -04:00
|
|
|
```").should match_html "<pre><code class=\"ruby\">test \n</code></pre>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should decorate @mentions' do
|
2013-04-09 23:27:33 -04:00
|
|
|
PrettyText.cook("Hello @eviltrout").should match_html "<p>Hello <span class=\"mention\">@eviltrout</span></p>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should allow for @mentions to have punctuation' do
|
2013-04-09 23:27:33 -04: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-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should add spoiler tags' do
|
2013-04-09 23:27:33 -04:00
|
|
|
PrettyText.cook("[spoiler]hello[/spoiler]").should match_html "<p><span class=\"spoiler\">hello</span></p>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should only detect ``` at the begining of lines" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.cook(" ```\n hello\n ```")
|
2013-04-09 23:27:33 -04:00
|
|
|
.should match_html "<pre><code>```\nhello\n```\n</code></pre>"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
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)
|
2013-02-11 02:58:19 -05: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
|
2013-02-10 19:43:07 -05:00
|
|
|
PrettyText.cook('<a href="http://cnn.com">cnn</a>').should =~ /nofollow/
|
|
|
|
end
|
2013-02-25 11:42:20 -05: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-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
|
|
|
|
(PrettyText.cook("<a href='#{Discourse.base_url.sub('http://', 'http://bla.')}/test.html'>cnn</a>") !~ /nofollow/).should be_true
|
2013-02-10 19:43:07 -05:00
|
|
|
end
|
2013-02-11 02:58:19 -05:00
|
|
|
|
|
|
|
it "should not inject nofollow for foo.com" do
|
2013-02-25 11:42:20 -05:00
|
|
|
(PrettyText.cook("<a href='http://foo.com/test.html'>cnn</a>") !~ /nofollow/).should be_true
|
2013-02-11 02:58:19 -05:00
|
|
|
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
|
2013-02-25 11:42:20 -05:00
|
|
|
(PrettyText.cook("<a href='http://bar.foo.com/test.html'>cnn</a>") !~ /nofollow/).should be_true
|
2013-02-11 02:58:19 -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
|
|
|
|
2013-06-05 18:54:46 -04:00
|
|
|
context "images" do
|
|
|
|
it "should dump images" do
|
|
|
|
PrettyText.excerpt("<img src='http://cnn.com/a.gif'>",100).should == "[image]"
|
|
|
|
end
|
2013-04-29 23:25:55 -04:00
|
|
|
|
2013-06-05 18:54:46 -04: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-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
|
|
|
|
PrettyText.excerpt("<a href='http://cnn.com'>cnn</a>",100, strip_links: true).should == "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
|
|
|
|
PrettyText.excerpt("<a href='http://cnn.com'>cnn</a>",100).should == "<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
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.excerpt("<pre><b></pre>",100).should == ""
|
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should truncate stuff properly" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.excerpt("hello world",5).should == "hello…"
|
2013-05-10 06:28:17 -04:00
|
|
|
PrettyText.excerpt("<p>hello</p><p>world</p>",6).should == "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
|
2013-06-04 12:05:36 -04:00
|
|
|
PrettyText.excerpt("<p>a</p><p>b</p>",5).should == "a b"
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should strip quotes" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.excerpt("<aside class='quote'><p>a</p><p>b</p></aside>boom",5).should == "boom"
|
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should not count the surrounds of a link" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.excerpt("<a href='http://cnn.com'>cnn</a>",3).should == "<a href='http://cnn.com'>cnn</a>"
|
|
|
|
end
|
|
|
|
|
2013-06-03 16:12:24 -04: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-25 11:42:20 -05:00
|
|
|
it "should truncate links" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.excerpt("<a href='http://cnn.com'>cnn</a>",2).should == "<a href='http://cnn.com'>cn…</a>"
|
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should be able to extract links" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.extract_links("<a href='http://cnn.com'>http://bla.com</a>").to_a.should == ["http://cnn.com"]
|
|
|
|
end
|
|
|
|
|
2013-02-13 15:22:04 -05: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-05 14:53:07 -04:00
|
|
|
it "should not extract links inside quotes" do
|
|
|
|
PrettyText.extract_links("
|
|
|
|
<a href='http://body_only.com'>http://useless1.com</a>
|
|
|
|
<aside class=\"quote\" data-topic=\"1234\">
|
|
|
|
<a href='http://body_and_quote.com'>http://useless3.com</a>
|
|
|
|
<a href='http://quote_only.com'>http://useless4.com</a>
|
|
|
|
</aside>
|
|
|
|
<a href='http://body_and_quote.com'>http://useless2.com</a>
|
|
|
|
").to_a.should == ["http://body_only.com", "http://body_and_quote.com", "/t/topic/1234"]
|
|
|
|
end
|
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should not preserve tags in code blocks" do
|
2013-02-05 14:16:51 -05: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 06:28:17 -04:00
|
|
|
|
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
|
|
|
|
end
|
2013-02-10 19:43:07 -05:00
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
describe "apply cdn" do
|
2013-02-05 14:16:51 -05:00
|
|
|
it "should detect bare links to images and apply a CDN" do
|
|
|
|
PrettyText.apply_cdn("<a href='/hello.png'>hello</a><img src='/a.jpeg'>","http://a.com").should ==
|
|
|
|
"<a href=\"http://a.com/hello.png\">hello</a><img src=\"http://a.com/a.jpeg\">"
|
|
|
|
end
|
2013-07-16 16:16:33 -04:00
|
|
|
|
2013-02-25 11:42:20 -05:00
|
|
|
it "should not touch non images" do
|
2013-02-05 14:16:51 -05:00
|
|
|
PrettyText.apply_cdn("<a href='/hello'>hello</a>","http://a.com").should ==
|
|
|
|
"<a href=\"/hello\">hello</a>"
|
|
|
|
end
|
2013-07-16 16:16:33 -04:00
|
|
|
|
|
|
|
it "should not touch schemaless links" do
|
|
|
|
PrettyText.apply_cdn("<a href='//hello'>hello</a>","http://a.com").should ==
|
|
|
|
"<a href=\"//hello\">hello</a>"
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
end
|