2015-10-11 17:41:23 +08:00
|
|
|
require 'rails_helper'
|
2013-06-11 04:46:08 +08:00
|
|
|
require 'email/message_builder'
|
|
|
|
|
|
|
|
describe Email::MessageBuilder do
|
|
|
|
|
|
|
|
let(:to_address) { "jake@adventuretime.ooo" }
|
|
|
|
let(:subject) { "Tree Trunks has made some apple pie!" }
|
2017-07-28 09:20:09 +08:00
|
|
|
let(:body) { "oh my glob Jake, Tree Trunks just made the tastiest apple pie ever!" }
|
2013-06-11 04:46:08 +08:00
|
|
|
let(:builder) { Email::MessageBuilder.new(to_address, subject: subject, body: body) }
|
|
|
|
let(:build_args) { builder.build_args }
|
2013-06-14 05:00:00 +08:00
|
|
|
let(:header_args) { builder.header_args }
|
2013-06-11 04:46:08 +08:00
|
|
|
|
|
|
|
it "has the correct to address" do
|
|
|
|
expect(build_args[:to]).to eq(to_address)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the subject" do
|
|
|
|
expect(builder.subject).to eq(subject)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the body" do
|
|
|
|
expect(builder.body).to eq(body)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has a utf-8 charset" do
|
|
|
|
expect(builder.build_args[:charset]).to eq("UTF-8")
|
|
|
|
end
|
|
|
|
|
2016-08-03 17:02:07 +08:00
|
|
|
it "ask politely not to receive automated responses" do
|
|
|
|
expect(header_args['X-Auto-Response-Suppress']).to eq("All")
|
|
|
|
end
|
|
|
|
|
2013-06-13 22:56:16 +08:00
|
|
|
context "reply by email" do
|
|
|
|
|
|
|
|
context "without allow_reply_by_email" do
|
2013-06-19 03:54:02 +08:00
|
|
|
it "does not have a X-Discourse-Reply-Key" do
|
|
|
|
expect(header_args['X-Discourse-Reply-Key']).to be_blank
|
2013-06-14 05:00:00 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Reply-To header that's the same as From" do
|
|
|
|
expect(header_args['Reply-To']).to eq(build_args[:from])
|
2013-06-13 22:56:16 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with allow_reply_by_email" do
|
|
|
|
let(:reply_by_email_builder) { Email::MessageBuilder.new(to_address, allow_reply_by_email: true) }
|
2013-06-19 03:54:02 +08:00
|
|
|
let(:reply_key) { reply_by_email_builder.header_args['X-Discourse-Reply-Key'] }
|
2013-06-13 22:56:16 +08:00
|
|
|
|
|
|
|
context "With the SiteSetting enabled" do
|
|
|
|
before do
|
2013-06-14 05:00:00 +08:00
|
|
|
SiteSetting.stubs(:reply_by_email_enabled?).returns(true)
|
|
|
|
SiteSetting.stubs(:reply_by_email_address).returns("r+%{reply_key}@reply.myforum.com")
|
2013-06-13 22:56:16 +08:00
|
|
|
end
|
|
|
|
|
2013-06-19 03:54:02 +08:00
|
|
|
it "has a X-Discourse-Reply-Key" do
|
2013-06-13 22:56:16 +08:00
|
|
|
expect(reply_key).to be_present
|
|
|
|
expect(reply_key.size).to eq(32)
|
|
|
|
end
|
2013-06-14 05:00:00 +08:00
|
|
|
|
|
|
|
it "returns a Reply-To header with the reply key" do
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"#{SiteSetting.title}\" <r+#{reply_key}@reply.myforum.com>")
|
2014-06-09 18:26:19 +08:00
|
|
|
end
|
2014-08-09 01:35:25 +08:00
|
|
|
|
|
|
|
it "cleans up the site title" do
|
2017-03-08 06:37:21 +08:00
|
|
|
SiteSetting.stubs(:title).returns(">>>Obnoxious Title: Deal, \"With\" It<<<")
|
|
|
|
expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"Obnoxious Title Deal With It\" <r+#{reply_key}@reply.myforum.com>")
|
2014-08-09 01:35:25 +08:00
|
|
|
end
|
2014-06-09 18:26:19 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
context "With the SiteSetting disabled" do
|
|
|
|
before do
|
|
|
|
SiteSetting.stubs(:reply_by_email_enabled?).returns(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has no X-Discourse-Reply-Key" do
|
|
|
|
expect(reply_key).to be_blank
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Reply-To header that's the same as From" do
|
|
|
|
expect(header_args['Reply-To']).to eq(build_args[:from])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with allow_reply_by_email" do
|
|
|
|
let(:reply_by_email_builder) { Email::MessageBuilder.new(to_address, allow_reply_by_email: true, private_reply: true, from_alias: "Username") }
|
|
|
|
let(:reply_key) { reply_by_email_builder.header_args['X-Discourse-Reply-Key'] }
|
|
|
|
|
|
|
|
context "With the SiteSetting enabled" do
|
|
|
|
before do
|
|
|
|
SiteSetting.stubs(:reply_by_email_enabled?).returns(true)
|
|
|
|
SiteSetting.stubs(:reply_by_email_address).returns("r+%{reply_key}@reply.myforum.com")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has a X-Discourse-Reply-Key" do
|
|
|
|
expect(reply_key).to be_present
|
|
|
|
expect(reply_key.size).to eq(32)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Reply-To header with the reply key" do
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"Username\" <r+#{reply_key}@reply.myforum.com>")
|
2013-06-14 05:00:00 +08:00
|
|
|
end
|
2013-06-13 22:56:16 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
context "With the SiteSetting disabled" do
|
|
|
|
before do
|
2013-06-14 05:00:00 +08:00
|
|
|
SiteSetting.stubs(:reply_by_email_enabled?).returns(false)
|
2013-06-13 22:56:16 +08:00
|
|
|
end
|
|
|
|
|
2013-06-19 03:54:02 +08:00
|
|
|
it "has no X-Discourse-Reply-Key" do
|
2013-06-13 22:56:16 +08:00
|
|
|
expect(reply_key).to be_blank
|
|
|
|
end
|
2013-06-14 05:00:00 +08:00
|
|
|
|
|
|
|
it "returns a Reply-To header that's the same as From" do
|
|
|
|
expect(header_args['Reply-To']).to eq(build_args[:from])
|
|
|
|
end
|
2013-06-13 22:56:16 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2013-07-07 08:37:44 +08:00
|
|
|
context "custom headers" do
|
|
|
|
|
|
|
|
let(:custom_headers_string) { " Precedence : bulk | :: | No-colon | No-Value: | Multi-colon : : value : : | Auto-Submitted : auto-generated " }
|
|
|
|
let(:custom_headers_result) { { "Precedence" => "bulk", "Multi-colon" => ": value : :", "Auto-Submitted" => "auto-generated" } }
|
|
|
|
|
|
|
|
it "custom headers builder" do
|
|
|
|
expect(Email::MessageBuilder.custom_headers(custom_headers_string)).to eq(custom_headers_result)
|
|
|
|
end
|
|
|
|
|
2013-07-10 00:19:10 +08:00
|
|
|
it "empty headers builder" do
|
|
|
|
expect(Email::MessageBuilder.custom_headers("")).to eq({})
|
|
|
|
end
|
|
|
|
|
|
|
|
it "null headers builder" do
|
|
|
|
expect(Email::MessageBuilder.custom_headers(nil)).to eq({})
|
|
|
|
end
|
|
|
|
|
2013-07-07 08:37:44 +08:00
|
|
|
end
|
|
|
|
|
2013-06-14 06:11:10 +08:00
|
|
|
context "header args" do
|
|
|
|
|
2016-04-07 22:21:17 +08:00
|
|
|
let(:message_with_header_args) do
|
|
|
|
Email::MessageBuilder.new(
|
|
|
|
to_address,
|
|
|
|
body: 'hello world',
|
|
|
|
topic_id: 1234,
|
|
|
|
post_id: 4567,
|
|
|
|
)
|
|
|
|
end
|
2013-06-14 06:11:10 +08:00
|
|
|
|
|
|
|
it "passes through a post_id" do
|
2013-06-19 03:54:02 +08:00
|
|
|
expect(message_with_header_args.header_args['X-Discourse-Post-Id']).to eq('4567')
|
2013-06-14 06:11:10 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "passes through a topic_id" do
|
2013-06-19 03:54:02 +08:00
|
|
|
expect(message_with_header_args.header_args['X-Discourse-Topic-Id']).to eq('1234')
|
2013-06-14 06:11:10 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
context "unsubscribe link" do
|
|
|
|
|
|
|
|
context "with add_unsubscribe_link false" do
|
|
|
|
it "has no unsubscribe header by default" do
|
|
|
|
expect(builder.header_args['List-Unsubscribe']).to be_blank
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't have the user preferences url in the body" do
|
|
|
|
expect(builder.body).not_to match(builder.template_args[:user_preferences_url])
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with add_unsubscribe_link true" do
|
|
|
|
|
|
|
|
let(:message_with_unsubscribe) { Email::MessageBuilder.new(to_address,
|
|
|
|
body: 'hello world',
|
2015-08-13 05:00:16 +08:00
|
|
|
add_unsubscribe_link: true,
|
2016-06-03 21:48:54 +08:00
|
|
|
url: "/t/1234",
|
2015-08-13 05:00:16 +08:00
|
|
|
unsubscribe_url: "/t/1234/unsubscribe") }
|
2013-06-11 04:46:08 +08:00
|
|
|
|
|
|
|
it "has an List-Unsubscribe header" do
|
|
|
|
expect(message_with_unsubscribe.header_args['List-Unsubscribe']).to be_present
|
|
|
|
end
|
|
|
|
|
2016-06-17 09:27:52 +08:00
|
|
|
it "has the unsubscribe url in the body" do
|
|
|
|
expect(message_with_unsubscribe.body).to match('/t/1234/unsubscribe')
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
2016-06-03 21:48:54 +08:00
|
|
|
it "does not add unsubscribe via email link without site setting set" do
|
|
|
|
expect(message_with_unsubscribe.body).to_not match(/mailto:reply@#{Discourse.current_hostname}\?subject=unsubscribe/)
|
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
context "template_args" do
|
|
|
|
let(:template_args) { builder.template_args }
|
|
|
|
|
2017-06-21 23:22:10 +08:00
|
|
|
it "has site title as email_prefix when `SiteSetting.email_prefix` is not present" do
|
2017-03-21 21:11:15 +08:00
|
|
|
expect(template_args[:email_prefix]).to eq(SiteSetting.title)
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
2017-06-21 23:22:10 +08:00
|
|
|
it "has email prefix as email_prefix when `SiteSetting.email_prefix` is present" do
|
2014-03-27 06:06:00 +08:00
|
|
|
SiteSetting.email_prefix = 'some email prefix'
|
2017-03-21 21:11:15 +08:00
|
|
|
expect(template_args[:email_prefix]).to eq(SiteSetting.email_prefix)
|
2014-03-27 06:06:00 +08:00
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
it "has the base url" do
|
|
|
|
expect(template_args[:base_url]).to eq(Discourse.base_url)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the user_preferences_url" do
|
2014-04-30 09:18:23 +08:00
|
|
|
expect(template_args[:user_preferences_url]).to eq("#{Discourse.base_url}/my/preferences")
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-21 23:22:10 +08:00
|
|
|
context "email prefix in subject" do
|
|
|
|
context "when use_site_subject is true" do
|
|
|
|
let(:message_with_email_prefix) { Email::MessageBuilder.new(to_address,
|
|
|
|
body: 'hello world',
|
|
|
|
use_site_subject: true) }
|
|
|
|
|
|
|
|
it "when email_prefix is set it should be present in subject" do
|
|
|
|
SiteSetting.email_prefix = 'some email prefix'
|
|
|
|
expect(message_with_email_prefix.subject).to match(SiteSetting.email_prefix)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
context "subject_template" do
|
|
|
|
|
|
|
|
let(:templated_builder) { Email::MessageBuilder.new(to_address, template: 'mystery') }
|
|
|
|
let(:rendered_template) { "rendered template" }
|
|
|
|
|
|
|
|
it "has the body rendered from a template" do
|
|
|
|
I18n.expects(:t).with("mystery.text_body_template", templated_builder.template_args).returns(rendered_template)
|
|
|
|
expect(templated_builder.body).to eq(rendered_template)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the subject rendered from a template" do
|
|
|
|
I18n.expects(:t).with("mystery.subject_template", templated_builder.template_args).returns(rendered_template)
|
|
|
|
expect(templated_builder.subject).to eq(rendered_template)
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2018-05-04 06:50:06 +08:00
|
|
|
context "PM multiple participants" do
|
|
|
|
let(:pm_multiple) { Email::MessageBuilder.new(to_address,
|
|
|
|
body: 'hello world',
|
|
|
|
private_reply: true,
|
|
|
|
participants: "user1, user2") }
|
|
|
|
|
|
|
|
it "lists participants out" do
|
|
|
|
expect(pm_multiple.body).to match('hello world\nuser1, user2')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
context "from field" do
|
|
|
|
|
|
|
|
it "has the default from" do
|
2017-02-28 03:22:56 +08:00
|
|
|
SiteSetting.title = ""
|
2013-06-11 04:46:08 +08:00
|
|
|
expect(build_args[:from]).to eq(SiteSetting.notification_email)
|
|
|
|
end
|
|
|
|
|
2017-02-28 03:22:56 +08:00
|
|
|
it "title setting will be added if present" do
|
|
|
|
SiteSetting.title = "Dog Talk"
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(build_args[:from]).to eq("\"Dog Talk\" <#{SiteSetting.notification_email}>")
|
2017-02-28 03:22:56 +08:00
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
let(:finn_email) { 'finn@adventuretime.ooo' }
|
|
|
|
let(:custom_from) { Email::MessageBuilder.new(to_address, from: finn_email).build_args }
|
|
|
|
|
|
|
|
it "allows us to override from" do
|
|
|
|
expect(custom_from[:from]).to eq(finn_email)
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:aliased_from) { Email::MessageBuilder.new(to_address, from_alias: "Finn the Dog") }
|
|
|
|
|
|
|
|
it "allows us to alias the from address" do
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(aliased_from.build_args[:from]).to eq("\"Finn the Dog\" <#{SiteSetting.notification_email}>")
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
let(:custom_aliased_from) { Email::MessageBuilder.new(to_address,
|
|
|
|
from_alias: "Finn the Dog",
|
|
|
|
from: finn_email) }
|
|
|
|
|
|
|
|
it "allows us to alias a custom from address" do
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(custom_aliased_from.build_args[:from]).to eq("\"Finn the Dog\" <#{finn_email}>")
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
2014-07-23 03:52:14 +08:00
|
|
|
it "email_site_title will be added if it's set" do
|
2017-02-28 03:22:56 +08:00
|
|
|
SiteSetting.email_site_title = "The Forum"
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(build_args[:from]).to eq("\"The Forum\" <#{SiteSetting.notification_email}>")
|
2017-02-28 03:22:56 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "email_site_title overrides title" do
|
|
|
|
SiteSetting.title = "Dog Talk"
|
|
|
|
SiteSetting.email_site_title = "The Forum"
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(build_args[:from]).to eq("\"The Forum\" <#{SiteSetting.notification_email}>")
|
2014-07-23 03:52:14 +08:00
|
|
|
end
|
|
|
|
|
2014-08-09 01:35:25 +08:00
|
|
|
it "cleans up aliases in the from_alias arg" do
|
2014-11-24 22:16:15 +08:00
|
|
|
builder = Email::MessageBuilder.new(to_address, from_alias: "Finn: the Dog, <3", from: finn_email)
|
2017-03-08 06:37:21 +08:00
|
|
|
expect(builder.build_args[:from]).to eq("\"Finn the Dog 3\" <#{finn_email}>")
|
2014-08-09 01:35:25 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "cleans up the email_site_title" do
|
2017-03-08 06:37:21 +08:00
|
|
|
SiteSetting.stubs(:email_site_title).returns("::>>>Best \"Forum\", EU: Award Winning<<<")
|
|
|
|
expect(build_args[:from]).to eq("\"Best Forum EU Award Winning\" <#{SiteSetting.notification_email}>")
|
2014-08-09 01:35:25 +08:00
|
|
|
end
|
|
|
|
|
2013-06-11 04:46:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|