discourse/spec/helpers/user_notifications_helper_spec.rb
Neil Lalonde 565a967192 FIX: email excerpts for posts starting with a quote were displaying a username
If a post starts with a post quote and has no other text content,
then the email excerpt was the name of the person quoted and
nothing else. The intention was to show the contents of the
first paragraph or div after the quote.

With this change, a quote followed by an image will use the
image as the excerpt. A quote followed by a onebox will use the
onebox.
2019-11-19 12:35:23 -05:00

169 lines
5.2 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe UserNotificationsHelper do
describe '#email_excerpt' do
let(:paragraphs) { [
"<p>This is the first paragraph, but you should read more.</p>",
"<p>And here is its friend, the second paragraph.</p>"
] }
let(:cooked) do
paragraphs.join("\n")
end
let(:post_quote) do
<<~HTML
<aside class="quote no-group" data-post="859" data-topic="30">
<div class="title">
<div class="quote-controls"></div>
<img alt width="20" height="20" src="https://example.com/m.png" class="avatar"> modman:</div>
<blockquote>
<p>This is a post quote</p>
</blockquote>
</aside>
HTML
end
it "can return the first paragraph" do
SiteSetting.digest_min_excerpt_length = 50
expect(helper.email_excerpt(cooked)).to eq(paragraphs[0])
end
it "can return another paragraph to satisfy digest_min_excerpt_length" do
SiteSetting.digest_min_excerpt_length = 100
expect(helper.email_excerpt(cooked)).to eq(paragraphs.join)
end
it "doesn't count emoji images" do
with_emoji = "<p>Hi <img src=\"/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}\" title=\":smile:\" class=\"emoji\" alt=\":smile:\"></p>"
arg = ([with_emoji] + paragraphs).join("\n")
SiteSetting.digest_min_excerpt_length = 50
expect(helper.email_excerpt(arg)).to eq([with_emoji, paragraphs[0]].join)
end
it "only counts link text" do
with_link = "<p>Hi <a href=\"https://really-long.essays.com/essay/number/9000/this-one-is-about-friends-and-got-a-C-minus-in-grade-9\">friends</a>!</p>"
arg = ([with_link] + paragraphs).join("\n")
SiteSetting.digest_min_excerpt_length = 50
expect(helper.email_excerpt(arg)).to eq([with_link, paragraphs[0]].join)
end
it "uses user quotes but not post quotes" do
cooked = <<~HTML
<p>BEFORE</p>
<blockquote>
<p>This is a user quote</p>
</blockquote>
<aside class="quote" data-post="3" data-topic="87369">
<div class="title">A Title</div>
<blockquote>
<p>This is a post quote</p>
</blockquote>
</aside>
<p>AFTER</p>
HTML
expect(helper.email_excerpt(cooked)).to eq "<p>BEFORE</p><blockquote>\n <p>This is a user quote</p>\n</blockquote><p>AFTER</p>"
end
it "defaults to content after post quote (image w/ no text)" do
image_paragraph = '<p><img src="//localhost:3000/uploads/b9.png" width="300" height="300"></p>'
cooked = <<~HTML
#{post_quote}
#{image_paragraph}
HTML
expect(helper.email_excerpt(cooked)).to eq(image_paragraph)
end
it "defaults to content after post quote (onebox)" do
aside_onebox = '<aside class="onebox wikipedia"><article class="onebox-body"><p>Onebox excerpt here</p></article><div class="onebox-metadata"></div></aside>'
cooked = <<~HTML
#{post_quote}
#{aside_onebox}
HTML
expect(helper.email_excerpt(cooked)).to eq(aside_onebox)
end
end
describe '#logo_url' do
describe 'local store' do
let(:upload) { Fabricate(:upload, sha1: "somesha1") }
before do
SiteSetting.logo = upload
end
it 'should return the right URL' do
expect(helper.logo_url).to eq(
"http://test.localhost/uploads/default/original/1X/somesha1.png"
)
end
describe 'when cdn path is configured' do
before do
GlobalSetting.expects(:cdn_url)
.returns('https://some.localcdn.com')
.at_least_once
end
it 'should return the right URL' do
expect(helper.logo_url).to eq(
"https://some.localcdn.com/uploads/default/original/1X/somesha1.png"
)
end
end
describe 'when logo is an SVG' do
let(:upload) { Fabricate(:upload, extension: "svg") }
it 'should return nil' do
expect(helper.logo_url).to eq(nil)
end
end
end
describe 's3 store' do
let(:upload) { Fabricate(:upload_s3, sha1: "somesha1") }
before do
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.logo = upload
end
it 'should return the right URL' do
expect(helper.logo_url).to eq(
"http://s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/somesha1.png"
)
end
describe 'when global cdn path is configured' do
it 'should return the right url' do
GlobalSetting.stubs(:cdn_url).returns('https://some.cdn.com/cluster')
expect(helper.logo_url).to eq(
"http://s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/somesha1.png"
)
end
end
describe 'when cdn path is configured' do
before do
SiteSetting.s3_cdn_url = 'https://some.cdn.com'
end
it 'should return the right url' do
expect(helper.logo_url).to eq(
"https://some.cdn.com/original/1X/somesha1.png"
)
end
end
end
end
end