mandrill_mailer 0.6.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -1
- data/README.md +12 -2
- data/lib/mandrill_mailer/arg_formatter.rb +119 -0
- data/lib/mandrill_mailer/core_mailer.rb +38 -73
- data/lib/mandrill_mailer/message_mailer.rb +2 -102
- data/lib/mandrill_mailer/offline.rb +10 -6
- data/lib/mandrill_mailer/template_mailer.rb +9 -97
- data/lib/mandrill_mailer/version.rb +1 -1
- data/spec/arg_formatter_spec.rb +236 -0
- data/spec/core_mailer_spec.rb +294 -38
- data/spec/message_mailer_spec.rb +12 -133
- data/spec/spec_helper.rb +2 -0
- data/spec/template_mailer_spec.rb +24 -442
- metadata +6 -3
@@ -27,25 +27,29 @@ module MandrillMailer
|
|
27
27
|
|
28
28
|
class TemplateMailer
|
29
29
|
def deliver
|
30
|
-
MandrillMailer
|
30
|
+
MandrillMailer::Mock.new({
|
31
31
|
:template_name => template_name,
|
32
32
|
:template_content => template_content,
|
33
33
|
:message => message,
|
34
34
|
:async => async,
|
35
35
|
:ip_pool => ip_pool,
|
36
36
|
:send_at => send_at
|
37
|
-
})
|
37
|
+
}).tap do |mock|
|
38
|
+
MandrillMailer.deliveries << mock
|
39
|
+
end
|
38
40
|
end
|
39
41
|
end
|
42
|
+
|
40
43
|
class MessageMailer
|
41
44
|
def deliver
|
42
|
-
|
43
|
-
MandrillMailer.deliveries << MandrillMailer::Mock.new({
|
45
|
+
MandrillMailer::Mock.new({
|
44
46
|
:message => message,
|
45
47
|
:async => async,
|
46
48
|
:ip_pool => ip_pool,
|
47
49
|
:send_at => send_at
|
48
|
-
})
|
50
|
+
}).tap do |mock|
|
51
|
+
MandrillMailer.deliveries << mock
|
52
|
+
end
|
49
53
|
end
|
50
|
-
end
|
54
|
+
end
|
51
55
|
end
|
@@ -100,8 +100,8 @@
|
|
100
100
|
# message HTML - only for HTML documents less than 256KB in size
|
101
101
|
|
102
102
|
# :important - whether or not this message is important, and should be delivered ahead of non-important messages
|
103
|
-
require 'base64'
|
104
103
|
require 'mandrill_mailer/core_mailer'
|
104
|
+
require 'mandrill_mailer/arg_formatter'
|
105
105
|
|
106
106
|
module MandrillMailer
|
107
107
|
class TemplateMailer < MandrillMailer::CoreMailer
|
@@ -114,107 +114,19 @@ module MandrillMailer
|
|
114
114
|
|
115
115
|
# Public: Triggers the stored Mandrill params to be sent to the Mandrill api
|
116
116
|
def deliver
|
117
|
-
|
118
|
-
mandrill.messages.send_template(template_name, template_content, message, async, ip_pool, send_at)
|
117
|
+
mandrill_api.messages.send_template(template_name, template_content, message, async, ip_pool, send_at)
|
119
118
|
end
|
120
119
|
|
121
|
-
#
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
# :subject - Subject of the email
|
126
|
-
# :to - Email to send the mandrill email to
|
127
|
-
# :vars - Global merge vars used in the email for dynamic data
|
128
|
-
# :recipient_vars - Merge vars used in the email for recipient-specific dynamic data
|
129
|
-
# :bcc - bcc email for the mandrill email
|
130
|
-
# :tags - Tags for the email
|
131
|
-
# :google_analytics_domains - Google analytics domains
|
132
|
-
# :google_analytics_campaign - Google analytics campaign
|
133
|
-
# :inline_css - whether or not to automatically inline all CSS styles provided in the message HTML
|
134
|
-
# :important - whether or not this message is important
|
135
|
-
# :async - whether or not this message should be sent asynchronously
|
136
|
-
# :ip_pool - name of the dedicated IP pool that should be used to send the message
|
137
|
-
# :send_at - when this message should be sent
|
138
|
-
#
|
139
|
-
# Examples
|
140
|
-
#
|
141
|
-
# mandrill_mail template: 'Group Invite',
|
142
|
-
# subject: I18n.t('invitation_mailer.invite.subject'),
|
143
|
-
# to: invitation.email,
|
144
|
-
# vars: {
|
145
|
-
# 'OWNER_NAME' => invitation.owner_name,
|
146
|
-
# 'INVITATION_URL' => new_invitation_url(email: invitation.email, secret: invitation.secret)
|
147
|
-
# }
|
148
|
-
#
|
149
|
-
# Returns the the mandrill mailer class (this is so you can chain #deliver like a normal mailer)
|
150
|
-
def mandrill_mail(args)
|
151
|
-
|
152
|
-
# Mandrill requires template content to be there
|
153
|
-
args[:template_content] = {"blank" => ""} if args[:template_content].blank?
|
154
|
-
|
155
|
-
# format the :to param to what Mandrill expects if a string or array is passed
|
156
|
-
args[:to] = format_to_params(args[:to])
|
157
|
-
|
158
|
-
# Set the template name
|
159
|
-
self.template_name = args.delete(:template)
|
120
|
+
# Handle template mailer specifics before formating the given args
|
121
|
+
def mandrill_mail_handler(args)
|
122
|
+
# Mandrill requires template content to be there, set default value
|
123
|
+
args[:template_content] = {"blank" => ""} if args[:template_content].blank?
|
160
124
|
|
161
125
|
# Set the template content
|
162
|
-
self.template_content = mandrill_args(args.delete(:template_content))
|
163
|
-
self.async = args.delete(:async)
|
164
|
-
self.ip_pool = args.delete(:ip_pool)
|
165
|
-
|
166
|
-
if args.has_key?(:send_at)
|
167
|
-
self.send_at = args.delete(:send_at).getutc.strftime('%Y-%m-%d %H:%M:%S')
|
168
|
-
end
|
169
|
-
|
170
|
-
# Construct message hash
|
171
|
-
self.message = {
|
172
|
-
"subject" => args[:subject],
|
173
|
-
"from_email" => args[:from] || self.class.defaults[:from],
|
174
|
-
"from_name" => args[:from_name] || self.class.defaults[:from_name] || self.class.defaults[:from],
|
175
|
-
"to" => args[:to],
|
176
|
-
"headers" => args[:headers],
|
177
|
-
"important" => args[:important],
|
178
|
-
"track_opens" => args.fetch(:track_opens, true),
|
179
|
-
"track_clicks" => args.fetch(:track_clicks, true),
|
180
|
-
"auto_text" => true,
|
181
|
-
"inline_css" => args[:inline_css],
|
182
|
-
"url_strip_qs" => args.fetch(:url_strip_qs, true),
|
183
|
-
"preserve_recipients" => args[:preserve_recipients],
|
184
|
-
"bcc_address" => args[:bcc],
|
185
|
-
"merge_language" => args[:merge_language],
|
186
|
-
"global_merge_vars" => mandrill_args(args[:vars]),
|
187
|
-
"merge_vars" => mandrill_rcpt_args(args[:recipient_vars]),
|
188
|
-
"tags" => args[:tags],
|
189
|
-
"subaccount" => args[:subaccount],
|
190
|
-
"google_analytics_domains" => args[:google_analytics_domains],
|
191
|
-
"google_analytics_campaign" => args[:google_analytics_campaign],
|
192
|
-
"metadata" => args[:metadata],
|
193
|
-
"attachments" => mandrill_attachment_args(args[:attachments]),
|
194
|
-
"images" => mandrill_images_args(args[:images])
|
195
|
-
}
|
196
|
-
unless MandrillMailer.config.interceptor_params.nil?
|
197
|
-
unless MandrillMailer.config.interceptor_params.is_a?(Hash)
|
198
|
-
raise InvalidInterceptorParams.new "The interceptor_params config must be a Hash"
|
199
|
-
end
|
200
|
-
self.message.merge!(MandrillMailer.config.interceptor_params.stringify_keys)
|
201
|
-
end
|
202
|
-
|
203
|
-
# return self so we can chain deliver after the method call, like a normal mailer.
|
204
|
-
return self
|
205
|
-
end
|
126
|
+
self.template_content = MandrillMailer::ArgFormatter.mandrill_args(args.delete(:template_content))
|
206
127
|
|
207
|
-
|
208
|
-
|
209
|
-
{
|
210
|
-
"key" => api_key,
|
211
|
-
"template_name" => template_name,
|
212
|
-
"template_content" => template_content,
|
213
|
-
"message" => message,
|
214
|
-
"async" => async,
|
215
|
-
"ip_pool" => ip_pool,
|
216
|
-
"send_at" => send_at
|
217
|
-
}
|
128
|
+
# Set the template name
|
129
|
+
self.template_name = args.delete(:template)
|
218
130
|
end
|
219
131
|
end
|
220
132
|
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
describe MandrillMailer::ArgFormatter do
|
5
|
+
subject(:formatter) { described_class }
|
6
|
+
let(:api_args) do
|
7
|
+
{
|
8
|
+
type: "some/type",
|
9
|
+
name: 'test',
|
10
|
+
content: "testing some test test file"
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:file_args) do
|
15
|
+
{
|
16
|
+
mimetype: "some/type",
|
17
|
+
filename: 'test',
|
18
|
+
file: "testing some test test file"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
describe 'attachment_args' do
|
24
|
+
context "args are blank" do
|
25
|
+
it "returns nil" do
|
26
|
+
expect(formatter.attachment_args(nil)).to be_nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "with file syntax" do
|
31
|
+
it "formats the correct attachment data" do
|
32
|
+
expect(formatter.attachment_args([file_args])).to eq([{
|
33
|
+
'type' => "some/type",
|
34
|
+
'name' => 'test',
|
35
|
+
'content' => Base64.encode64("testing some test test file")
|
36
|
+
}])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "with api syntax" do
|
41
|
+
it "formats the correct attachment data" do
|
42
|
+
expect(formatter.attachment_args([api_args])).to eq([{
|
43
|
+
'type' => "some/type",
|
44
|
+
'name' => 'test',
|
45
|
+
'content' => Base64.encode64("testing some test test file")
|
46
|
+
}])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe ".images_args" do
|
52
|
+
context "args are blank" do
|
53
|
+
it "returns nil" do
|
54
|
+
expect(formatter.images_args(nil)).to be_nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "with file syntax" do
|
59
|
+
it "formats the correct attachment data" do
|
60
|
+
expect(formatter.images_args([file_args])).to eq([{
|
61
|
+
'type' => "some/type",
|
62
|
+
'name' => 'test',
|
63
|
+
'content' => Base64.encode64("testing some test test file")
|
64
|
+
}])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "with api syntax" do
|
69
|
+
it "formats the correct attachment data" do
|
70
|
+
expect(formatter.images_args([api_args])).to eq([{
|
71
|
+
'type' => "some/type",
|
72
|
+
'name' => 'test',
|
73
|
+
'content' => Base64.encode64("testing some test test file")
|
74
|
+
}])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe ".mandrill_args" do
|
80
|
+
context "args are blank" do
|
81
|
+
it "returns an empty array" do
|
82
|
+
expect(formatter.mandrill_args(nil)).to eq []
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "args are not blank" do
|
87
|
+
let(:arg_name) { 'USER_NAME' }
|
88
|
+
let(:arg_value) { 'bob' }
|
89
|
+
|
90
|
+
it 'should convert the args to the correct format' do
|
91
|
+
results = formatter.mandrill_args({arg_name => arg_value})
|
92
|
+
expect(results).to eq [{'name' => arg_name, 'content' => arg_value}]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe ".merge_vars" do
|
98
|
+
context "args are blank" do
|
99
|
+
it "returns an empty array" do
|
100
|
+
expect(formatter.merge_vars(nil)).to eq []
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe ".rcpt_metadata" do
|
106
|
+
context "args are blank" do
|
107
|
+
it "returns an empty array" do
|
108
|
+
expect(formatter.rcpt_metadata(nil)).to eq []
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "args are not blank" do
|
113
|
+
let(:rcpt) { 'email@email.com' }
|
114
|
+
let(:arg_name) { 'USER_NAME' }
|
115
|
+
let(:arg_value) { 'bob' }
|
116
|
+
|
117
|
+
it 'should convert the args to the merge_vars format' do
|
118
|
+
results = formatter.merge_vars([{rcpt => {arg_name => arg_value}}])
|
119
|
+
expect(results).to eq [{'rcpt' => rcpt, 'vars' => [{'name' => arg_name, 'content' => arg_value}]}]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe ".boolean" do
|
125
|
+
it "typecasts values to a boolean" do
|
126
|
+
expect(formatter.boolean(1)).to eq true
|
127
|
+
expect(formatter.boolean('1')).to eq true
|
128
|
+
expect(formatter.boolean(nil)).to eq false
|
129
|
+
expect(formatter.boolean(false)).to eq false
|
130
|
+
expect(formatter.boolean(true)).to eq true
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe ".params" do
|
135
|
+
let(:email) { 'bob@email.com' }
|
136
|
+
let(:name) { 'bob' }
|
137
|
+
|
138
|
+
context "item is not an array" do
|
139
|
+
it "returns an array" do
|
140
|
+
results = formatter.params("yay test")
|
141
|
+
expect(results).to be_kind_of Array
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'with a single email string' do
|
145
|
+
it 'should format args to a format mandrill likes' do
|
146
|
+
results = formatter.params(email)
|
147
|
+
expect(results).to eq [{"email" => email, "name" => email}]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'with a single email/name Hash' do
|
152
|
+
it 'should format args to a format mandrill likes' do
|
153
|
+
results = formatter.params({"email" => email, "name" => name})
|
154
|
+
expect(results).to eq [{"email" => email, "name" => name}]
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
context "item is an array" do
|
161
|
+
it "returns an array" do
|
162
|
+
results = formatter.params(["yay test", "item2"])
|
163
|
+
expect(results).to be_kind_of Array
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'with a single email string array' do
|
167
|
+
it 'should format args to a format mandrill likes' do
|
168
|
+
results = formatter.params([email])
|
169
|
+
expect(results).to eq [{"email" => email, "name" => email}]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'with a single email/name hash Array' do
|
174
|
+
it 'should format args to a format mandrill likes' do
|
175
|
+
results = formatter.params([{"email" => email, "name" => name}])
|
176
|
+
expect(results).to eq [{"email" => email, "name" => name}]
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe ".params_item" do
|
183
|
+
context "when item is a hash" do
|
184
|
+
it "returns the item" do
|
185
|
+
sample_hash = {"email" => "test@email.com", "name" => "test"}
|
186
|
+
expect(formatter.params_item(sample_hash)).to eq sample_hash
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context "when item is not a hash" do
|
191
|
+
it "returns the correctly formatted hash" do
|
192
|
+
sample_email = "test@email.com"
|
193
|
+
expect(formatter.params_item(sample_email)).to eq({"email" => sample_email, "name" => sample_email})
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe ".format_messages_api_message_data" do
|
199
|
+
it "includes all api values" do
|
200
|
+
result = formatter.format_messages_api_message_data({})
|
201
|
+
api_values = ["html", "text", "subject", "from_email", "from_name", "to",
|
202
|
+
"headers", "important", "track_opens", "track_clicks", "auto_text",
|
203
|
+
"auto_html", "inline_css", "url_strip_qs", "preserve_recipients",
|
204
|
+
"view_content_link", "bcc_address", "tracking_domain", "signing_domain",
|
205
|
+
"return_path_domain", "merge", "merge_language", "global_merge_vars",
|
206
|
+
"merge_vars", "tags", "subaccount", "google_analytics_domains",
|
207
|
+
"google_analytics_campaign", "metadata", "recipient_metadata",
|
208
|
+
"attachments", "images"]
|
209
|
+
|
210
|
+
|
211
|
+
api_values.each do |val|
|
212
|
+
expect(result.keys.include?(val)).to eq true
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "merge_language exists" do
|
217
|
+
context "merge_language is an accepted merge language" do
|
218
|
+
it "does not raise an error" do
|
219
|
+
expect { formatter.format_messages_api_message_data({merge_language: "handlebars"}) }.not_to raise_error
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "merge_language is not an accepted merge language" do
|
224
|
+
it "raises an error" do
|
225
|
+
expect { formatter.format_messages_api_message_data({merge_language: "not_valid"}) }.to raise_error(MandrillMailer::CoreMailer::InvalidMergeLanguageError)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "merge_language does not exist" do
|
231
|
+
it "does not raise an error" do
|
232
|
+
expect { formatter.format_messages_api_message_data({}) }.not_to raise_error
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
data/spec/core_mailer_spec.rb
CHANGED
@@ -4,63 +4,319 @@ require 'base64'
|
|
4
4
|
describe MandrillMailer::CoreMailer do
|
5
5
|
subject(:core_mailer) { described_class }
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:image_path) { '/assets/image.jpg' }
|
8
|
+
let(:default_host) { 'localhost:3000' }
|
9
|
+
let(:mailer) { described_class.new }
|
10
|
+
let(:api_key) { '1237861278' }
|
11
|
+
|
12
|
+
let(:from_email) { 'from@email.com' }
|
13
|
+
let(:to_email) { 'bob@email.com' }
|
14
|
+
let(:to_name) { 'bob' }
|
15
|
+
let(:bcc) { "bcc@email.com" }
|
16
|
+
let(:var_name) { 'USER_NAME' }
|
17
|
+
let(:var_content) { 'bobert' }
|
18
|
+
let(:var_rcpt_name) { 'USER_INFO' }
|
19
|
+
let(:var_rcpt_content) { 'boboblacksheep' }
|
20
|
+
|
21
|
+
let(:attachment_file) { File.read(File.expand_path('spec/support/test_image.png')) }
|
22
|
+
let(:attachment_filename) { 'test_image.png' }
|
23
|
+
let(:attachment_mimetype) { 'image/png' }
|
24
|
+
let(:image_file) { File.read(File.expand_path('spec/support/test_image.png')) }
|
25
|
+
let(:image_filename) { 'test_image.png' }
|
26
|
+
let(:image_mimetype) { 'image/png' }
|
27
|
+
let(:send_at) { Time.utc(2020, 1, 1, 8, 0) }
|
28
|
+
let(:bcc) { "bcc@email.com" }
|
29
|
+
|
30
|
+
let(:async) { double(:async) }
|
31
|
+
let(:ip_pool) { double(:ip_pool) }
|
32
|
+
|
33
|
+
let(:args) do
|
8
34
|
{
|
9
|
-
|
10
|
-
|
11
|
-
|
35
|
+
from: from_email,
|
36
|
+
subject: "super secret",
|
37
|
+
to: {'email' => to_email, 'name' => to_name},
|
38
|
+
preserve_recipients: false,
|
39
|
+
vars: {
|
40
|
+
var_name => var_content
|
41
|
+
},
|
42
|
+
recipient_vars: [
|
43
|
+
{ to_email => { var_rcpt_name => var_rcpt_content } }
|
44
|
+
],
|
45
|
+
headers: {"Reply-To" => "support@email.com"},
|
46
|
+
bcc: bcc,
|
47
|
+
tags: ['tag1'],
|
48
|
+
subaccount: "subaccount1",
|
49
|
+
google_analytics_domains: ["http://site.com"],
|
50
|
+
google_analytics_campaign: '1237423474',
|
51
|
+
attachments: [{file: attachment_file, filename: attachment_filename, mimetype: attachment_mimetype}],
|
52
|
+
images: [{file: image_file, filename: image_filename, mimetype: image_mimetype}],
|
53
|
+
inline_css: true,
|
54
|
+
important: true,
|
55
|
+
send_at: send_at,
|
56
|
+
async: async,
|
57
|
+
ip_pool: ip_pool,
|
58
|
+
track_opens: false,
|
59
|
+
track_clicks: false,
|
60
|
+
url_strip_qs: false
|
12
61
|
}
|
13
62
|
end
|
14
63
|
|
15
|
-
let(:
|
64
|
+
let(:sample_message) do
|
16
65
|
{
|
17
|
-
|
18
|
-
|
19
|
-
|
66
|
+
"from_email" => from_email,
|
67
|
+
"to" => [{'email' => to_email, 'name' => to_name}],
|
68
|
+
"bcc_address" => bcc,
|
20
69
|
}
|
21
70
|
end
|
22
71
|
|
72
|
+
before do
|
73
|
+
MandrillMailer.config.api_key = api_key
|
74
|
+
MandrillMailer.config.default_url_options = { host: default_host }
|
75
|
+
allow(MandrillMailer.config).to receive(:image_path).and_return(image_path)
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#mandrill_mail" do
|
79
|
+
it "applies interceptors to the message" do
|
80
|
+
expect(mailer).to receive(:apply_interceptors!)
|
81
|
+
mailer.mandrill_mail(args)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "calls the mandrill_mail_handler" do
|
85
|
+
expect(mailer).to receive(:mandrill_mail_handler)
|
86
|
+
mailer.mandrill_mail(args)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "sets the mailer message attribute" do
|
90
|
+
expect { mailer.mandrill_mail(args) }.to change { mailer.message }.from(nil)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "extracts api_options" do
|
94
|
+
expect(mailer).to receive(:extract_api_options!).with(args)
|
95
|
+
mailer.mandrill_mail(args)
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "vars attribute" do
|
99
|
+
it "returns the vars" do
|
100
|
+
mailer.mandrill_mail(args)
|
101
|
+
expect(mailer.message["global_merge_vars"].first.values).to include(var_name)
|
102
|
+
expect(mailer.message["global_merge_vars"].first.values).to include(var_content)
|
103
|
+
end
|
104
|
+
|
105
|
+
context "when no vars are set" do
|
106
|
+
before do
|
107
|
+
args.delete(:vars)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "doesn't explode" do
|
111
|
+
expect { mailer.mandrill_mail(args) }.not_to raise_error
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'url helpers in mailer' do
|
118
|
+
subject { mailer.send(:course_url) }
|
119
|
+
|
120
|
+
context 'Rails is defined (Rails app)' do
|
121
|
+
let(:url) { '/courses/1' }
|
122
|
+
let(:host) { 'codeschool.com' }
|
123
|
+
let(:router) { Rails.application.routes.url_helpers }
|
124
|
+
|
125
|
+
before do
|
126
|
+
# use load since we are loading multiple times
|
127
|
+
mailer.send(:load, 'fake_rails/fake_rails.rb')
|
128
|
+
MandrillMailer.config.default_url_options[:host] = host
|
129
|
+
Rails.application.routes.draw do |builder|
|
130
|
+
builder.course_url "#{url}"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Unrequire the fake rails class so it doesn't pollute the rest of the tests
|
135
|
+
after do
|
136
|
+
Rails.unload!
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should return the correct route' do
|
140
|
+
expect(subject).to eq router.course_url(host: host)
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'route helper with an argument' do
|
144
|
+
it 'should return the correct route' do
|
145
|
+
expect(subject).to eq router.course_url({id: 1, title: 'zombies'}, host: host)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'Rails is not defined' do
|
151
|
+
it 'should raise an exception' do
|
152
|
+
expect{subject}.to raise_error
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe '#image_path' do
|
158
|
+
subject { mailer.image_path('logo.png') }
|
159
|
+
|
160
|
+
context 'Rails exists' do
|
161
|
+
let(:image) { 'image.png' }
|
162
|
+
let(:host) { 'codeschool.com' }
|
163
|
+
let(:router) { Rails.application.routes.url_helpers }
|
164
|
+
|
165
|
+
before do
|
166
|
+
# use load instead of require since we have to reload for every test
|
167
|
+
mailer.send(:load, 'fake_rails/fake_rails.rb')
|
168
|
+
MandrillMailer.config.default_url_options[:host] = host
|
169
|
+
end
|
170
|
+
|
171
|
+
# Essentially un-requiring the fake rails class so it doesn't pollute
|
172
|
+
# the rest of the tests
|
173
|
+
after do
|
174
|
+
Rails.unload!
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should return the image url' do
|
178
|
+
#mailer.send(:image_path, image).should eq ActionController::Base.asset_path(image)
|
179
|
+
expect(mailer.send(:image_path, image)).to eq(ActionController::Base.asset_path(image))
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'Rails does not exist' do
|
184
|
+
it 'should raise exception' do
|
185
|
+
expect{ subject }.to raise_error
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe 'defaults' do
|
191
|
+
it 'should not share between different subclasses' do
|
192
|
+
klassA = Class.new(core_mailer) do
|
193
|
+
default from_name: 'ClassA'
|
194
|
+
end
|
195
|
+
klassB = Class.new(core_mailer) do
|
196
|
+
default from_name: 'ClassB'
|
197
|
+
end
|
198
|
+
|
199
|
+
expect(klassA.defaults[:from_name]).to eq 'ClassA'
|
200
|
+
expect(klassB.defaults[:from_name]).to eq 'ClassB'
|
201
|
+
end
|
23
202
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
expect(core_mailer.new.send(:mandrill_attachment_args, [file_args])).to eq([{
|
28
|
-
'type' => "some/type",
|
29
|
-
'name' => 'test',
|
30
|
-
'content' => Base64.encode64("testing some test test file")
|
31
|
-
}])
|
203
|
+
it 'should use defaults from the parent class' do
|
204
|
+
klassA = Class.new(core_mailer) do
|
205
|
+
default from_name: 'ClassA'
|
32
206
|
end
|
207
|
+
klassB = Class.new(klassA) do
|
208
|
+
end
|
209
|
+
|
210
|
+
expect(klassB.defaults[:from_name]).to eq 'ClassA'
|
33
211
|
end
|
34
212
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
}])
|
213
|
+
it 'should allow overriding defaults from the parent' do
|
214
|
+
klassA = Class.new(core_mailer) do
|
215
|
+
default from_name: 'ClassA'
|
216
|
+
end
|
217
|
+
klassB = Class.new(klassA) do
|
218
|
+
default from_name: 'ClassB'
|
42
219
|
end
|
220
|
+
|
221
|
+
expect(klassB.defaults[:from_name]).to eq 'ClassB'
|
43
222
|
end
|
44
223
|
end
|
45
224
|
|
46
|
-
describe
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
225
|
+
describe "accessor helpers" do
|
226
|
+
before do
|
227
|
+
allow(mailer).to receive(:message).and_return(sample_message)
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "#from" do
|
231
|
+
it "returns the from email" do
|
232
|
+
expect(mailer.from).to eq from_email
|
54
233
|
end
|
55
234
|
end
|
56
235
|
|
57
|
-
|
58
|
-
it "
|
59
|
-
expect(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
236
|
+
describe "#to" do
|
237
|
+
it "returns the to email data" do
|
238
|
+
expect(mailer.to).to eq sample_message['to']
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe '#to=' do
|
243
|
+
it "updates the to email data" do
|
244
|
+
sample_email = "something@email.com"
|
245
|
+
mailer.to = sample_email
|
246
|
+
expect(mailer.to).to eq [{"email" => sample_email, "name" => sample_email}]
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe "#bcc" do
|
251
|
+
it "returns the bcc email/s" do
|
252
|
+
expect(mailer.bcc).to eq bcc
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
describe '#respond_to' do
|
258
|
+
it 'can respond to a symbol' do
|
259
|
+
klassA = Class.new(core_mailer) do
|
260
|
+
def test_method
|
261
|
+
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
expect(klassA).to respond_to('test_method')
|
266
|
+
end
|
267
|
+
it 'can respond to a string' do
|
268
|
+
klassA = Class.new(core_mailer) do
|
269
|
+
def test_method
|
270
|
+
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
expect(klassA).to respond_to('test_method')
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
describe "protected#extract_api_options!" do
|
279
|
+
it "sets the required api options associated with the messages api" do
|
280
|
+
results = mailer.send(:extract_api_options!, args)
|
281
|
+
expect(mailer.send_at).to eq('2020-01-01 08:00:00')
|
282
|
+
expect(mailer.ip_pool).to eq ip_pool
|
283
|
+
expect(mailer.async).to eq async
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
describe "protected#apply_interceptors!" do
|
288
|
+
# Clear the interceptor after these tests so we don't get errors elsewhere
|
289
|
+
after do
|
290
|
+
MandrillMailer.config.interceptor = nil
|
291
|
+
end
|
292
|
+
|
293
|
+
context "when interceptor config is a proc" do
|
294
|
+
let(:original_email) { "blah@email.com" }
|
295
|
+
let(:interceptor_email) { "intercept@email.com" }
|
296
|
+
|
297
|
+
before do
|
298
|
+
MandrillMailer.config.interceptor = Proc.new {|obj|
|
299
|
+
obj[:to] = interceptor_email
|
300
|
+
}
|
301
|
+
end
|
302
|
+
|
303
|
+
it "Applies interceptors to object" do
|
304
|
+
obj = {to: original_email}
|
305
|
+
expect { mailer.send(:apply_interceptors!, obj)}.to change {obj[:to]}.from(original_email).to(interceptor_email)
|
306
|
+
end
|
307
|
+
|
308
|
+
it "does not raise error" do
|
309
|
+
expect { mailer.send(:apply_interceptors!, {}) }.not_to raise_error
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
context "when interceptor config is not a proc" do
|
314
|
+
before do
|
315
|
+
MandrillMailer.config.interceptor = "not a proc"
|
316
|
+
end
|
317
|
+
|
318
|
+
it "raises an error" do
|
319
|
+
expect { mailer.send(:apply_interceptors!, {}) }.to raise_error MandrillMailer::CoreMailer::InvalidInterceptorParams
|
64
320
|
end
|
65
321
|
end
|
66
322
|
end
|