require 'spec_helper' require 'pretty_text' describe PrettyText do describe "Cooking" do describe "with avatar" do before(:each) do eviltrout = User.new eviltrout.stubs(:avatar_template).returns("http://test.localhost/uploads/default/avatars/42d/57c/46ce7ee487/{size}.png") User.expects(:find_by).with(username_lower: "eviltrout").returns(eviltrout) end 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 "" end it "should produce a quote" do PrettyText.cook("[quote=\"EvilTrout, post:123, topic:456, full:true\"]ddd[/quote]").should match_html "" end it "trims spaces on quote params" do PrettyText.cook("[quote=\"EvilTrout, post:555, topic: 666\"]ddd[/quote]").should match_html "" end end it "should handle 3 mentions in a row" do PrettyText.cook('@hello @hello @hello').should match_html "

@hello @hello @hello

" end it "should sanitize the html" do PrettyText.cook("").should match_html "

" end it 'should allow for @mentions to have punctuation' do PrettyText.cook("hello @bob's @bob,@bob; @bob\"").should match_html "

hello @bob's @bob,@bob; @bob\"

" end end describe "rel nofollow" do before do SiteSetting.stubs(:add_rel_nofollow_to_user_content).returns(true) SiteSetting.stubs(:exclude_rel_nofollow_domains).returns("foo.com|bar.com") end it "should inject nofollow in all user provided links" do PrettyText.cook('cnn').should =~ /nofollow/ end it "should not inject nofollow in all local links" do (PrettyText.cook("cnn") !~ /nofollow/).should be_true end it "should not inject nofollow in all subdomain links" do (PrettyText.cook("cnn") !~ /nofollow/).should be_true end it "should not inject nofollow for foo.com" do (PrettyText.cook("cnn") !~ /nofollow/).should be_true end it "should not inject nofollow for bar.foo.com" do (PrettyText.cook("cnn") !~ /nofollow/).should be_true end it "should not inject nofollow if omit_nofollow option is given" do (PrettyText.cook('cnn', omit_nofollow: true) !~ /nofollow/).should be_true end end describe "Excerpt" do context "images" do it "should dump images" do PrettyText.excerpt("",100).should == "[image]" end it "should keep alt tags" do PrettyText.excerpt("car",100).should == "[car]" end it "should keep title tags" do PrettyText.excerpt("",100).should == "[car]" end it "should convert images to markdown if the option is set" do PrettyText.excerpt("", 100, markdown_images: true).should == "![car](http://cnn.com/a.gif)" end it "should keep spoilers" do PrettyText.excerpt("
", 100).should == "[image]" PrettyText.excerpt("spoiler", 100).should == "spoiler" end end it "should have an option to strip links" do PrettyText.excerpt("cnn",100, strip_links: true).should == "cnn" end it "should preserve links" do PrettyText.excerpt("cnn",100).should == "cnn" end it "should deal with special keys properly" do PrettyText.excerpt("
",100).should == "" end it "should truncate stuff properly" do PrettyText.excerpt("hello world",5).should == "hello…" PrettyText.excerpt("

hello

world

",6).should == "hello w…" end it "should insert a space between to Ps" do PrettyText.excerpt("

a

b

",5).should == "a b" end it "should strip quotes" do PrettyText.excerpt("boom",5).should == "boom" end it "should not count the surrounds of a link" do PrettyText.excerpt("cnn",3).should == "cnn" end it "uses an ellipsis instead of html entities if provided with the option" do PrettyText.excerpt("cnn", 2, text_entities: true).should == "cn..." end it "should truncate links" do PrettyText.excerpt("cnn",2).should == "cn…" end it "doesn't extract empty quotes as links" do PrettyText.extract_links("\n").to_a.should be_empty end it "should be able to extract links" do PrettyText.extract_links("http://bla.com").to_a.should == ["http://cnn.com"] end it "should extract links to topics" do PrettyText.extract_links("").to_a.should == ["/t/topic/321"] end it "should extract links to posts" do PrettyText.extract_links("").to_a.should == ["/t/topic/1234/4567"] end it "should not extract links inside quotes" do PrettyText.extract_links(" http://useless1.com http://useless2.com ").to_a.should == ["http://body_only.com", "http://body_and_quote.com", "/t/topic/1234"] end it "should not preserve tags in code blocks" do PrettyText.excerpt("
<h3>Hours</h3>
",100).should == "<h3>Hours</h3>" end it "should handle nil" do PrettyText.excerpt(nil,100).should == '' end end 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 batman")).to eq("I'm the batman") end it "strips links but leaves the text content" do expect(PrettyText.strip_links("I'm the linked batman")).to eq("I'm the linked batman") end end describe "make_all_links_absolute" do let(:base_url) { "http://baseurl.net" } def make_abs_string(html) doc = Nokogiri::HTML.fragment(html) described_class.make_all_links_absolute(doc) doc.to_html end before do Discourse.stubs(:base_url).returns(base_url) end it "adds base url to relative links" do html = "

@wiseguy, @trollol what do you guys think?

" output = make_abs_string(html) output.should == "

@wiseguy, @trollol what do you guys think?

" end it "doesn't change external absolute links" do html = "

Check out this guy.

" make_abs_string(html).should == html end it "doesn't change internal absolute links" do html = "

Check out this guy.

" make_abs_string(html).should == html end it "can tolerate invalid URLs" do html = "

Check out this guy.

" expect { make_abs_string(html) }.to_not raise_error end end describe "strip_image_wrapping" do def strip_image_wrapping(html) doc = Nokogiri::HTML.fragment(html) described_class.strip_image_wrapping(doc) doc.to_html end it "doesn't change HTML when there's no wrapped image" do html = "" strip_image_wrapping(html).should == html end let(:wrapped_image) { "" } it "strips the metadata" do strip_image_wrapping(wrapped_image).should == "
" end end describe "markdown quirks" do it "sanitizes spans" do PrettyText.cook("a").should match_html "

a

" end it "bolds stuff in parens" do PrettyText.cook("a \"**hello**\"").should match_html "

a "hello"

" PrettyText.cook("(**hello**)").should match_html "

(hello)

" # is it me your looking for? end it "allows for newline after bold" do PrettyText.cook("**hello**\nworld").should match_html "

hello
world

" end it "allows for newline for 2 bolds" do PrettyText.cook("**hello**\n**world**").should match_html "

hello
world

" end it "allows for * and _ in bold" do PrettyText.cook("**a*_b**").should match_html "

a*_b

" end it "does not apply italics when there is a space inside" do PrettyText.cook("** hello**").should match_html "

** hello**

" PrettyText.cook("**hello **").should match_html "

**hello **

" end it "allows does not bold chinese intra word" do PrettyText.cook("你**hello**").should match_html "

你**hello**

" end it "allows bold chinese" do PrettyText.cook("**你hello**").should match_html "

你hello

" end end end