mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 02:43:43 +08:00
b3d769ff4f
update rspec syntax to v3 change syntax to rspec v3 oops. fix typo mailers classes with rspec3 syntax helpers with rspec3 syntax jobs with rspec3 syntax serializers with rspec3 syntax views with rspec3 syntax support to rspec3 syntax category spec with rspec3 syntax
207 lines
7.9 KiB
Ruby
207 lines
7.9 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe PostAnalyzer do
|
|
|
|
let(:default_topic_id) { 12 }
|
|
|
|
describe '#cook' do
|
|
let(:post_analyzer) {PostAnalyzer.new nil, nil }
|
|
|
|
let(:raw) { "Here's a tweet:\n#{url}" }
|
|
let(:options) { {} }
|
|
let(:args) { [raw, options] }
|
|
|
|
let(:url) {
|
|
'https://twitter.com/evil_trout/status/345954894420787200'
|
|
}
|
|
|
|
before { Oneboxer.stubs(:onebox) }
|
|
|
|
it 'fetches the cached onebox for any urls in the post' do
|
|
Oneboxer.expects(:cached_onebox).with url
|
|
post_analyzer.cook(*args)
|
|
end
|
|
|
|
it 'does not invalidate the onebox cache' do
|
|
Oneboxer.expects(:invalidate).with(url).never
|
|
post_analyzer.cook(*args)
|
|
end
|
|
|
|
context 'when invalidating oneboxes' do
|
|
let(:options) {{ invalidate_oneboxes: true }}
|
|
|
|
it 'invalidates the oneboxes for urls in the post' do
|
|
Oneboxer.expects(:invalidate).with url
|
|
post_analyzer.cook(*args)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "links" do
|
|
let(:raw_no_links) { "hello world my name is evil trout" }
|
|
let(:raw_one_link_md) { "[jlawr](http://www.imdb.com/name/nm2225369)" }
|
|
let(:raw_two_links_html) { "<a href='http://disneyland.disney.go.com/'>disney</a> <a href='http://reddit.com'>reddit</a>"}
|
|
let(:raw_three_links) { "http://discourse.org and http://discourse.org/another_url and http://www.imdb.com/name/nm2225369"}
|
|
|
|
describe "raw_links" do
|
|
it "returns a blank collection for a post with no links" do
|
|
post_analyzer = PostAnalyzer.new(raw_no_links, default_topic_id)
|
|
expect(post_analyzer.raw_links).to be_blank
|
|
end
|
|
|
|
it "finds a link within markdown" do
|
|
post_analyzer = PostAnalyzer.new(raw_one_link_md, default_topic_id)
|
|
expect(post_analyzer.raw_links).to eq(["http://www.imdb.com/name/nm2225369"])
|
|
end
|
|
|
|
it "can find two links from html" do
|
|
post_analyzer = PostAnalyzer.new(raw_two_links_html, default_topic_id)
|
|
expect(post_analyzer.raw_links).to eq(["http://disneyland.disney.go.com/", "http://reddit.com"])
|
|
end
|
|
|
|
it "can find three links without markup" do
|
|
post_analyzer = PostAnalyzer.new(raw_three_links, default_topic_id)
|
|
expect(post_analyzer.raw_links).to eq(["http://discourse.org", "http://discourse.org/another_url", "http://www.imdb.com/name/nm2225369"])
|
|
end
|
|
end
|
|
|
|
describe "linked_hosts" do
|
|
it "returns blank with no links" do
|
|
post_analyzer = PostAnalyzer.new(raw_no_links, default_topic_id)
|
|
expect(post_analyzer.linked_hosts).to be_blank
|
|
end
|
|
|
|
it "returns the host and a count for links" do
|
|
post_analyzer = PostAnalyzer.new(raw_two_links_html, default_topic_id)
|
|
expect(post_analyzer.linked_hosts).to eq({"disneyland.disney.go.com" => 1, "reddit.com" => 1})
|
|
end
|
|
|
|
it "it counts properly with more than one link on the same host" do
|
|
post_analyzer = PostAnalyzer.new(raw_three_links, default_topic_id)
|
|
expect(post_analyzer.linked_hosts).to eq({"discourse.org" => 1, "www.imdb.com" => 1})
|
|
end
|
|
|
|
it 'returns blank for ipv6 output' do
|
|
post_analyzer = PostAnalyzer.new('PING www.google.com(lb-in-x93.1e100.net) 56 data bytes', default_topic_id)
|
|
expect(post_analyzer.linked_hosts).to be_blank
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "image_count" do
|
|
let(:raw_post_one_image_md) { "![sherlock](http://bbc.co.uk/sherlock.jpg)" }
|
|
let(:raw_post_two_images_html) { "<img src='http://discourse.org/logo.png'> <img src='http://bbc.co.uk/sherlock.jpg'>" }
|
|
let(:raw_post_with_avatars) { '<img alt="smiley" title=":smiley:" src="/assets/emoji/smiley.png" class="avatar"> <img alt="wink" title=":wink:" src="/assets/emoji/wink.png" class="avatar">' }
|
|
let(:raw_post_with_favicon) { '<img src="/assets/favicons/wikipedia.png" class="favicon">' }
|
|
let(:raw_post_with_thumbnail) { '<img src="/assets/emoji/smiley.png" class="thumbnail">' }
|
|
let(:raw_post_with_two_classy_images) { "<img src='http://discourse.org/logo.png' class='classy'> <img src='http://bbc.co.uk/sherlock.jpg' class='classy'>" }
|
|
|
|
it "returns 0 images for an empty post" do
|
|
post_analyzer = PostAnalyzer.new("Hello world", nil)
|
|
expect(post_analyzer.image_count).to eq(0)
|
|
end
|
|
|
|
it "finds images from markdown" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_one_image_md, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(1)
|
|
end
|
|
|
|
it "finds images from HTML" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_two_images_html, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(2)
|
|
end
|
|
|
|
it "doesn't count avatars as images" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_with_avatars, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(0)
|
|
end
|
|
|
|
it "doesn't count favicons as images" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_with_favicon, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(0)
|
|
end
|
|
|
|
it "doesn't count thumbnails as images" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_with_thumbnail, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(0)
|
|
end
|
|
|
|
it "doesn't count whitelisted images" do
|
|
Post.stubs(:white_listed_image_classes).returns(["classy"])
|
|
post_analyzer = PostAnalyzer.new(raw_post_with_two_classy_images, default_topic_id)
|
|
expect(post_analyzer.image_count).to eq(0)
|
|
end
|
|
end
|
|
|
|
describe "link_count" do
|
|
let(:raw_post_one_link_md) { "[sherlock](http://www.bbc.co.uk/programmes/b018ttws)" }
|
|
let(:raw_post_two_links_html) { "<a href='http://discourse.org'>discourse</a> <a href='http://twitter.com'>twitter</a>" }
|
|
let(:raw_post_with_mentions) { "hello @novemberkilo how are you doing?" }
|
|
|
|
it "returns 0 links for an empty post" do
|
|
post_analyzer = PostAnalyzer.new("Hello world", nil)
|
|
expect(post_analyzer.link_count).to eq(0)
|
|
end
|
|
|
|
it "returns 0 links for a post with mentions" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_with_mentions, default_topic_id)
|
|
expect(post_analyzer.link_count).to eq(0)
|
|
end
|
|
|
|
it "finds links from markdown" do
|
|
Oneboxer.stubs :onebox
|
|
post_analyzer = PostAnalyzer.new(raw_post_one_link_md, default_topic_id)
|
|
expect(post_analyzer.link_count).to eq(1)
|
|
end
|
|
|
|
it "finds links from HTML" do
|
|
post_analyzer = PostAnalyzer.new(raw_post_two_links_html, default_topic_id)
|
|
expect(post_analyzer.link_count).to eq(2)
|
|
end
|
|
end
|
|
|
|
|
|
describe "raw_mentions" do
|
|
|
|
it "returns an empty array with no matches" do
|
|
post_analyzer = PostAnalyzer.new("Hello Jake and Finn!", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq([])
|
|
end
|
|
|
|
it "returns lowercase unique versions of the mentions" do
|
|
post_analyzer = PostAnalyzer.new("@Jake @Finn @Jake", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['jake', 'finn'])
|
|
end
|
|
|
|
it "ignores pre" do
|
|
post_analyzer = PostAnalyzer.new("<pre>@Jake</pre> @Finn", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['finn'])
|
|
end
|
|
|
|
it "catches content between pre tags" do
|
|
post_analyzer = PostAnalyzer.new("<pre>hello</pre> @Finn <pre></pre>", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['finn'])
|
|
end
|
|
|
|
it "ignores code" do
|
|
post_analyzer = PostAnalyzer.new("@Jake `@Finn`", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['jake'])
|
|
end
|
|
|
|
it "ignores code in markdown-formatted code blocks" do
|
|
post_analyzer = PostAnalyzer.new(" @Jake @Finn\n@Ryan", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['ryan'])
|
|
end
|
|
|
|
it "ignores quotes" do
|
|
post_analyzer = PostAnalyzer.new("[quote=\"Evil Trout\"]@Jake[/quote] @Finn", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['finn'])
|
|
end
|
|
|
|
it "handles underscore in username" do
|
|
post_analyzer = PostAnalyzer.new("@Jake @Finn @Jake_Old", default_topic_id)
|
|
expect(post_analyzer.raw_mentions).to eq(['jake', 'finn', 'jake_old'])
|
|
end
|
|
end
|
|
end
|