mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 12:05:31 +08:00
565a967192
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.
169 lines
5.2 KiB
Ruby
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
|