sendgrid-actionmailer 0.2.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  module SendGridActionMailer
2
- VERSION = '0.2.1'
2
+ VERSION = '2.0.1'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'sendgrid_actionmailer/version'
@@ -19,11 +20,11 @@ Gem::Specification.new do |spec|
19
20
  spec.require_paths = ['lib']
20
21
 
21
22
  spec.add_dependency 'mail', '~> 2.5'
22
- spec.add_dependency 'sendgrid-ruby', '< 2.0'
23
+ spec.add_dependency 'sendgrid-ruby', '~> 5.2'
23
24
 
25
+ spec.add_development_dependency 'appraisal', '~> 2.1.0'
24
26
  spec.add_development_dependency 'bundler', '~> 1.6'
25
27
  spec.add_development_dependency 'rake'
26
- spec.add_development_dependency 'rspec', '~>3.2.0'
27
- spec.add_development_dependency 'appraisal', '~> 2.1.0'
28
- spec.add_development_dependency 'webmock', '~> 1.24.6'
28
+ spec.add_development_dependency 'rspec', '~> 3.2'
29
+ spec.add_development_dependency 'webmock'
29
30
  end
@@ -4,35 +4,68 @@ require 'webmock/rspec'
4
4
  module SendGridActionMailer
5
5
  describe DeliveryMethod do
6
6
  subject(:mailer) do
7
- DeliveryMethod.new(api_user: 'user', api_key: 'key')
7
+ DeliveryMethod.new(api_key: 'key')
8
8
  end
9
9
 
10
- class TestClient < SendGrid::Client
10
+ class TestClient
11
11
  attr_reader :sent_mail
12
12
 
13
13
  def send(mail)
14
14
  @sent_mail = mail
15
15
  super(mail)
16
16
  end
17
+
18
+ def mail()
19
+ self
20
+ end
21
+
22
+ def _(param)
23
+ return self if param == 'send'
24
+ raise "Unknown param #{param.inspect}"
25
+ end
26
+
27
+ def post(request_body:)
28
+ @sent_mail = request_body
29
+ OpenStruct.new(status_code: '200')
30
+ end
17
31
  end
18
32
 
19
- describe '#initialize' do
20
- it 'configures the client API user' do
21
- expect(mailer.client.api_user).to eq('user')
33
+ describe 'settings' do
34
+ it 'has correct api_key' do
35
+ m = DeliveryMethod.new(api_key: 'ABCDEFG')
36
+ expect(m.settings[:api_key]).to eq('ABCDEFG')
37
+ end
38
+
39
+ it 'default raise_delivery_errors' do
40
+ m = DeliveryMethod.new()
41
+ expect(m.settings[:raise_delivery_errors]).to eq(false)
42
+ end
43
+
44
+ it 'sets raise_delivery_errors' do
45
+ m = DeliveryMethod.new(raise_delivery_errors: true)
46
+ expect(m.settings[:raise_delivery_errors]).to eq(true)
47
+ end
48
+
49
+ it 'default return_response' do
50
+ m = DeliveryMethod.new()
51
+ expect(mailer.settings[:return_response]).to eq(nil)
22
52
  end
23
53
 
24
- it 'configures the client API key' do
25
- expect(mailer.client.api_key).to eq('key')
54
+ it 'sets return_response' do
55
+ m = DeliveryMethod.new(return_response: true)
56
+ expect(m.settings[:return_response]).to eq(true)
26
57
  end
27
58
  end
28
59
 
29
60
  describe '#deliver!' do
30
61
  let(:client) { TestClient.new }
62
+ let(:client_parent) { double(client: client) }
63
+
31
64
  let(:mail) do
32
65
  Mail.new(
33
66
  to: 'test@sendgrid.com',
34
67
  from: 'taco@cat.limo',
35
- subject: 'Hello, world!'
68
+ subject: 'Hello, world!',
36
69
  )
37
70
  end
38
71
 
@@ -40,11 +73,71 @@ module SendGridActionMailer
40
73
  stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
41
74
  .to_return(body: {message: 'success'}.to_json, status: 200, headers: {'X-TEST' => 'yes'})
42
75
  allow(SendGrid::Client).to receive(:new).and_return(client)
76
+ allow(SendGrid::API).to receive(:new).and_return(client_parent)
77
+ end
78
+
79
+ context 'with dynamic api_key' do
80
+ let(:default) do
81
+ Mail.new(
82
+ to: 'test@sendgrid.com',
83
+ from: 'taco@cat.limo',
84
+ subject: 'Hello, world!'
85
+ )
86
+ end
87
+
88
+ let(:mail) do
89
+ Mail.new(
90
+ to: 'test@sendgrid.com',
91
+ from: 'taco@cat.limo',
92
+ subject: 'Hello, world!',
93
+ delivery_method_options: {
94
+ api_key: 'test_key'
95
+ }
96
+ )
97
+ end
98
+
99
+ it 'sets dynamic api_key, but should revert to default settings api_key' do
100
+ expect(SendGrid::API).to receive(:new).with(api_key: 'key')
101
+ mailer.deliver!(default)
102
+ expect(SendGrid::API).to receive(:new).with(api_key: 'test_key')
103
+ mailer.deliver!(mail)
104
+ expect(SendGrid::API).to receive(:new).with(api_key: 'key')
105
+ mailer.deliver!(default)
106
+ end
43
107
  end
44
108
 
45
109
  it 'sets to' do
46
110
  mailer.deliver!(mail)
47
- expect(client.sent_mail.to).to eq(%w[test@sendgrid.com])
111
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com"}]})
112
+ end
113
+
114
+ it 'returns mailer itself' do
115
+ ret = mailer.deliver!(mail)
116
+ expect(ret).to eq(mailer)
117
+ end
118
+
119
+ it 'returns api response' do
120
+ m = DeliveryMethod.new(return_response: true, api_key: 'key')
121
+ ret = m.deliver!(mail)
122
+ expect(ret.status_code).to eq('200')
123
+ end
124
+
125
+ context 'to with a friendly name' do
126
+ before { mail.to = 'Test SendGrid <test@sendgrid.com>' }
127
+
128
+ it 'sets to' do
129
+ mailer.deliver!(mail)
130
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com", "name"=>"Test SendGrid"}]})
131
+ end
132
+ end
133
+
134
+ context 'to with a friendly name (with quotes)' do
135
+ before { mail.to = '"Test SendGrid" <test@sendgrid.com>' }
136
+
137
+ it 'sets to' do
138
+ mailer.deliver!(mail)
139
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com", "name"=>"Test SendGrid"}]})
140
+ end
48
141
  end
49
142
 
50
143
  context 'there are ccs' do
@@ -52,7 +145,7 @@ module SendGridActionMailer
52
145
 
53
146
  it 'sets cc' do
54
147
  mailer.deliver!(mail)
55
- expect(client.sent_mail.cc).to eq(%w[burrito@cat.limo])
148
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com"}], "cc"=>[{"email"=>"burrito@cat.limo"}]})
56
149
  end
57
150
  end
58
151
 
@@ -61,40 +154,44 @@ module SendGridActionMailer
61
154
 
62
155
  it 'sets bcc' do
63
156
  mailer.deliver!(mail)
64
- expect(client.sent_mail.bcc).to eq(%w[nachos@cat.limo])
157
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com"}], "bcc"=>[{"email"=>"nachos@cat.limo"}]})
65
158
  end
66
159
  end
67
160
 
68
- context 'there is a reply to' do
69
- before { mail.reply_to = 'nachos@cat.limo' }
161
+ context 'there are bccs with a friendly name' do
162
+ before { mail.bcc = 'Taco Cat <nachos@cat.limo>' }
70
163
 
71
- it 'sets reply_to' do
164
+ it 'sets bcc' do
72
165
  mailer.deliver!(mail)
73
- expect(client.sent_mail.reply_to).to eq('nachos@cat.limo')
166
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com"}], "bcc"=>[{"email"=>"nachos@cat.limo", "name"=>"Taco Cat"}]})
74
167
  end
75
168
  end
76
169
 
77
- context 'there is a reply to with a friendly name' do
78
- before { mail.reply_to = 'Taco Cat <nachos@cat.limo>' }
170
+ context 'there are bccs with a friendly name (with quotes)' do
171
+ before { mail.bcc = '"Taco Cat" <nachos@cat.limo>' }
79
172
 
80
- it 'sets reply_to' do
173
+ it 'sets bcc' do
81
174
  mailer.deliver!(mail)
82
- expect(client.sent_mail.reply_to).to eq('nachos@cat.limo')
175
+ expect(client.sent_mail['personalizations'][0]).to include({"to"=>[{"email"=>"test@sendgrid.com"}], "bcc"=>[{"email"=>"nachos@cat.limo", "name"=>"Taco Cat"}]})
83
176
  end
84
177
  end
85
178
 
86
- context 'there is a date' do
87
- before { mail.date = Time.utc(2016) }
179
+ context 'there is a reply to' do
180
+ before { mail.reply_to = 'nachos@cat.limo' }
88
181
 
89
- it 'sets date' do
182
+ it 'sets reply_to' do
90
183
  mailer.deliver!(mail)
91
- expect(client.sent_mail.date).to eq("Fri, 01 Jan 2016 00:00:00 +0000")
184
+ expect(client.sent_mail['reply_to']).to eq({'email' => 'nachos@cat.limo'})
92
185
  end
93
186
  end
94
187
 
95
- it 'sets from' do
96
- mailer.deliver!(mail)
97
- expect(client.sent_mail.from).to eq('taco@cat.limo')
188
+ context 'there is a reply to with a friendly name' do
189
+ before { mail.reply_to = 'Taco Cat <nachos@cat.limo>' }
190
+
191
+ it 'sets reply_to' do
192
+ mailer.deliver!(mail)
193
+ expect(client.sent_mail['reply_to']).to eq('email' => 'nachos@cat.limo', 'name' => 'Taco Cat')
194
+ end
98
195
  end
99
196
 
100
197
  context 'from contains a friendly name' do
@@ -102,341 +199,293 @@ module SendGridActionMailer
102
199
 
103
200
  it 'sets from' do
104
201
  mailer.deliver!(mail)
105
- expect(client.sent_mail.from).to eq('taco@cat.limo')
202
+ expect(client.sent_mail['from']).to eq('email' => 'taco@cat.limo', 'name' => 'Taco Cat')
106
203
  end
204
+ end
107
205
 
108
- it 'sets from_name' do
206
+ context 'from contains a friendly name (with quotes)' do
207
+ before { mail.from = '"Taco Cat" <taco@cat.limo>'}
208
+
209
+ it 'sets from' do
109
210
  mailer.deliver!(mail)
110
- expect(client.sent_mail.from_name).to eq('Taco Cat')
211
+ expect(client.sent_mail['from']).to eq('email' => 'taco@cat.limo', 'name' => 'Taco Cat')
111
212
  end
112
213
  end
113
214
 
114
215
  it 'sets subject' do
115
216
  mailer.deliver!(mail)
116
- expect(client.sent_mail.subject).to eq('Hello, world!')
217
+ expect(client.sent_mail['subject']).to eq('Hello, world!')
117
218
  end
118
219
 
119
220
  it 'sets a text/plain body' do
120
221
  mail.content_type = 'text/plain'
121
222
  mail.body = 'I heard you like pineapple.'
122
223
  mailer.deliver!(mail)
123
- expect(client.sent_mail.text).to eq('I heard you like pineapple.')
224
+ expect(client.sent_mail['content']).to eq([
225
+ {
226
+ 'type' => 'text/plain',
227
+ 'value' => 'I heard you like pineapple.'
228
+ }
229
+ ])
124
230
  end
125
231
 
126
232
  it 'sets a text/html body' do
127
233
  mail.content_type = 'text/html'
128
234
  mail.body = 'I heard you like <b>pineapple</b>.'
129
235
  mailer.deliver!(mail)
130
- expect(client.sent_mail.html).to eq('I heard you like <b>pineapple</b>.')
131
- end
132
236
 
133
- context 'multipart/alternative' do
134
- before do
135
- mail.content_type 'multipart/alternative'
136
- mail.part do |part|
137
- part.text_part = Mail::Part.new do
138
- content_type 'text/plain'
139
- body 'I heard you like pineapple.'
140
- end
141
- part.html_part = Mail::Part.new do
142
- content_type 'text/html'
143
- body 'I heard you like <b>pineapple</b>.'
144
- end
145
- end
146
- end
237
+ expect(client.sent_mail['content']).to eq([
238
+ {
239
+ 'type' => 'text/html',
240
+ 'value' => 'I heard you like <b>pineapple</b>.'
241
+ }
242
+ ])
243
+ end
147
244
 
148
- it 'sets the text body' do
245
+ context 'send options' do
246
+ it 'sets a template_id' do
247
+ mail['template_id'] = '1'
149
248
  mailer.deliver!(mail)
150
- expect(client.sent_mail.text).to eq('I heard you like pineapple.')
249
+ expect(client.sent_mail['template_id']).to eq('1')
151
250
  end
152
251
 
153
- it 'sets the html body' do
252
+ it 'sets sections' do
253
+ mail['sections'] = {'%foo%' => 'bar'}
154
254
  mailer.deliver!(mail)
155
- expect(client.sent_mail.html)
156
- .to eq('I heard you like <b>pineapple</b>.')
157
- end
158
- end
159
-
160
- context 'multipart/mixed' do
161
- before do
162
- mail.content_type 'multipart/mixed'
163
- mail.part do |part|
164
- part.text_part = Mail::Part.new do
165
- content_type 'text/plain'
166
- body 'I heard you like pineapple.'
167
- end
168
- part.html_part = Mail::Part.new do
169
- content_type 'text/html'
170
- body 'I heard you like <b>pineapple</b>.'
171
- end
172
- end
173
- mail.attachments['specs.rb'] = File.read(__FILE__)
255
+ expect(client.sent_mail['sections']).to eq({'%foo%' => 'bar'})
174
256
  end
175
257
 
176
- it 'sets the text body' do
258
+ it 'sets headers' do
259
+ mail['headers'] = {'X-FOO' => 'bar'}
177
260
  mailer.deliver!(mail)
178
- expect(client.sent_mail.text).to eq('I heard you like pineapple.')
261
+ expect(client.sent_mail['headers']).to eq({'X-FOO' => 'bar'})
179
262
  end
180
263
 
181
- it 'sets the html body' do
264
+ it 'sets categories' do
265
+ mail['categories'] = ['foo', 'bar']
182
266
  mailer.deliver!(mail)
183
- expect(client.sent_mail.html)
184
- .to eq('I heard you like <b>pineapple</b>.')
267
+ expect(client.sent_mail['categories']).to eq(['foo', 'bar'])
185
268
  end
186
269
 
187
- it 'adds the attachment' do
188
- expect(mail.attachments.first.read).to eq(File.read(__FILE__))
270
+ it 'sets custom_args' do
271
+ mail['custom_args'] = {'campaign' => 'welcome'}
189
272
  mailer.deliver!(mail)
190
- attachment = client.sent_mail.attachments.first
191
- expect(attachment[:name]).to eq('specs.rb')
192
- expect(attachment[:file].content_type.to_s).to eq('application/x-ruby')
273
+ expect(client.sent_mail['custom_args']).to eq({'campaign' => 'welcome'})
193
274
  end
194
- end
195
275
 
196
- context 'multipart/related' do
197
- before do
198
- mail.content_type 'multipart/related'
199
- mail.part do |part|
200
- part.text_part = Mail::Part.new do
201
- content_type 'text/plain'
202
- body 'I heard you like pineapple.'
203
- end
204
- part.html_part = Mail::Part.new do
205
- content_type 'text/html'
206
- body 'I heard you like <b>pineapple</b>.'
207
- end
208
- end
209
- mail.attachments.inline['specs.rb'] = File.read(__FILE__)
210
- end
211
-
212
- it 'sets the text body' do
276
+ it 'sets send_at and batch_id' do
277
+ epoch = Time.now.to_i
278
+ mail['send_at'] = epoch
279
+ mail['batch_id'] = 3
213
280
  mailer.deliver!(mail)
214
- expect(client.sent_mail.text).to eq('I heard you like pineapple.')
281
+ expect(client.sent_mail['send_at']).to eq(epoch)
282
+ expect(client.sent_mail['batch_id']).to eq('3')
215
283
  end
216
284
 
217
- it 'sets the html body' do
285
+ it 'sets asm' do
286
+ asm = {'group_id' => 99, 'groups_to_display' => [4,5,6,7,8]}
287
+ mail['asm'] = asm
218
288
  mailer.deliver!(mail)
219
- expect(client.sent_mail.html)
220
- .to eq('I heard you like <b>pineapple</b>.')
289
+ expect(client.sent_mail['asm']).to eq(asm)
221
290
  end
222
291
 
223
- it 'adds the inline attachment' do
224
- expect(mail.attachments.first.read).to eq(File.read(__FILE__))
292
+ it 'sets ip_pool_name' do
293
+ mail['ip_pool_name'] = 'marketing'
225
294
  mailer.deliver!(mail)
226
- content = client.sent_mail.contents.first
227
- expect(content[:name]).to eq('specs.rb')
228
- expect(content[:file].content_type.to_s).to eq('application/x-ruby')
229
- expect(content[:cid].class).to eq(String)
230
- end
231
- end
232
-
233
- context 'SMTPAPI' do
234
- context 'it is not JSON' do
235
- before { mail['X-SMTPAPI'] = '<xml>JSON sucks!</xml>' }
236
-
237
- it 'raises a useful error' do
238
- expect { mailer.deliver!(mail) }.to raise_error(
239
- ArgumentError,
240
- "X-SMTPAPI is not JSON: <xml>JSON sucks!</xml>"
241
- )
242
- end
295
+ expect(client.sent_mail['ip_pool_name']).to eq('marketing')
243
296
  end
244
297
 
245
- context 'filters are present' do
246
- before do
247
- mail['X-SMTPAPI'] = {
248
- filters: {
249
- clicktrack: {
250
- settings: {
251
- enable: 0
252
- }
253
- },
254
- dkim: {
255
- settings: {
256
- domain: 'example.com',
257
- use_from: false
258
- }
259
- }
260
- }
261
- }.to_json
262
- end
263
-
264
- it 'gets attached' do
298
+ context 'parse object' do
299
+ it "should parse 1.8 hash" do
300
+ asm = {'group_id' => 99, 'groups_to_display' => [4,5,6,7,8]}
301
+ mail['asm'] = asm
265
302
  mailer.deliver!(mail)
266
- expect(client.sent_mail.smtpapi.filters).to eq({
267
- 'clicktrack' => {
268
- 'settings' => {
269
- 'enable' => 0
270
- }
271
- },
272
- 'dkim' => {
273
- 'settings' => {
274
- 'domain' => 'example.com',
275
- 'use_from' => false
276
- }
277
- }
278
- })
303
+ expect(client.sent_mail['asm']).to eq({"group_id" => 99, "groups_to_display" => [4,5,6,7,8]})
279
304
  end
280
- end
281
305
 
282
- context 'a category is present' do
283
- before do
284
- mail['X-SMTPAPI'] = { category: 'food_feline' }.to_json
306
+ it "should parse 1.9 hash" do
307
+ asm = { group_id: 99, groups_to_display: [4,5,6,7,8]}
308
+ mail['asm'] = asm
309
+ mailer.deliver!(mail)
310
+ expect(client.sent_mail['asm']).to eq({"group_id" => 99, "groups_to_display" => [4,5,6,7,8]})
285
311
  end
286
312
 
287
- it 'gets attached' do
313
+ it "should parse json" do
314
+ asm = {'group_id' => 99, 'groups_to_display' => [4,5,6,7,8]}
315
+ mail['asm'] = asm.to_json
288
316
  mailer.deliver!(mail)
289
- expect(client.sent_mail.smtpapi.category).to eq('food_feline')
317
+ expect(client.sent_mail['asm']).to eq({"group_id" => 99, "groups_to_display" => [4,5,6,7,8]})
290
318
  end
291
319
  end
292
320
 
293
- context 'multiple categories are present' do
294
- before do
295
- mail['X-SMTPAPI'] = {
296
- category: %w[food_feline cuisine_canine]
297
- }.to_json
298
- end
299
-
300
- it 'attaches them all' do
321
+ context 'mail_settings' do
322
+ it 'sets bcc' do
323
+ bcc = { 'bcc' => { 'enable' => true, 'email' => 'test@example.com' }}
324
+ mail['mail_settings'] = bcc
301
325
  mailer.deliver!(mail)
302
- expect(client.sent_mail.smtpapi.category).to eq([
303
- 'food_feline',
304
- 'cuisine_canine',
305
- ])
326
+ expect(client.sent_mail['mail_settings']).to eq(bcc)
306
327
  end
307
- end
308
328
 
309
- context 'send_at is present' do
310
- before do
311
- mail['X-SMTPAPI'] = {
312
- send_at: 1409348513
313
- }.to_json
329
+ it 'sets bypass_list_management' do
330
+ bypass = { 'bypass_list_management' => { 'enable' => true }}
331
+ mail['mail_settings'] = bypass
332
+ mailer.deliver!(mail)
333
+ expect(client.sent_mail['mail_settings']).to eq(bypass)
314
334
  end
315
335
 
316
- it 'gets attached' do
336
+ it 'sets footer' do
337
+ footer = {'footer' => { 'enable' => true, 'text' => 'Footer Text', 'html' => '<html><body>Footer Text</body></html>'}}
338
+ mail['mail_settings'] = footer
317
339
  mailer.deliver!(mail)
318
- expect(client.sent_mail.smtpapi.send_at).to eq(1409348513)
340
+ expect(client.sent_mail['mail_settings']).to eq(footer)
319
341
  end
320
- end
321
342
 
322
- context 'send_each_at is present' do
323
- before do
324
- mail['X-SMTPAPI'] = {
325
- send_each_at: [1409348513, 1409348514]
326
- }.to_json
343
+ it 'sets sandbox_mode' do
344
+ sandbox = {'sandbox_mode' => { 'enable' => true }}
345
+ mail['mail_settings'] = sandbox
346
+ mailer.deliver!(mail)
347
+ expect(client.sent_mail['mail_settings']).to eq(sandbox)
327
348
  end
328
349
 
329
- it 'gets attached' do
350
+ it 'sets spam_check' do
351
+ spam_check = {'spam_check' => { 'enable' => true, 'threshold' => 1, 'post_to_url' => 'https://spamcatcher.sendgrid.com'}}
352
+ mail['mail_settings'] = spam_check
330
353
  mailer.deliver!(mail)
331
- expect(client.sent_mail.smtpapi.send_each_at).to eq([1409348513, 1409348514])
354
+ expect(client.sent_mail['mail_settings']).to eq(spam_check)
332
355
  end
333
356
  end
334
357
 
335
- context 'section is present' do
336
- before do
337
- mail['X-SMTPAPI'] = {
338
- section: {
339
- ":sectionName1" => "section 1 text",
340
- ":sectionName2" => "section 2 text"
341
- }
342
- }.to_json
358
+ context 'tracking_settings' do
359
+ it 'sets click_tracking' do
360
+ tracking = { 'click_tracking' => { 'enable' => false, 'enable_text' => false }}
361
+ mail['tracking_settings'] = tracking
362
+ mailer.deliver!(mail)
363
+ expect(client.sent_mail['tracking_settings']).to eq(tracking)
343
364
  end
344
365
 
345
- it 'gets attached' do
366
+ it 'sets open_tracking' do
367
+ tracking = { 'open_tracking' => { 'enable' => true, 'substitution_tag' => 'Optional tag to replace with the open image in the body of the message' }}
368
+ mail['tracking_settings'] = tracking
346
369
  mailer.deliver!(mail)
347
- expect(client.sent_mail.smtpapi.section).to eq({
348
- ":sectionName1" => "section 1 text",
349
- ":sectionName2" => "section 2 text"
350
- })
370
+ expect(client.sent_mail['tracking_settings']).to eq(tracking)
351
371
  end
352
- end
353
372
 
354
- context 'sub is present' do
355
- before do
356
- mail['X-SMTPAPI'] = {
357
- sub: {
358
- "-name-" => [
359
- "John",
360
- "Jane"
361
- ],
362
- "-customerID-" => [
363
- "1234",
364
- "5678"
365
- ],
366
- }
367
- }.to_json
373
+ it 'sets subscription_tracking' do
374
+ tracking = { 'subscription_tracking' => { 'enable' => true, 'text' => 'text to insert into the text/plain portion of the message', 'html' => 'html to insert into the text/html portion of the message', 'substitution_tag' => 'Optional tag to replace with the open image in the body of the def message' }}
375
+ mail['tracking_settings'] = tracking
376
+ mailer.deliver!(mail)
377
+ expect(client.sent_mail['tracking_settings']).to eq(tracking)
368
378
  end
369
379
 
370
- it 'gets attached' do
380
+ it 'sets ganalytics' do
381
+ tracking = { 'ganalytics' => {'enable' => true, 'utm_source' => 'some source', 'utm_medium' => 'some medium', 'utm_term' => 'some term', 'utm_content' => 'some content', 'utm_campaign' => 'some campaign' }}
382
+ mail['tracking_settings'] = tracking
371
383
  mailer.deliver!(mail)
372
- expect(client.sent_mail.smtpapi.sub).to eq({
373
- "-name-" => [
374
- "John",
375
- "Jane"
376
- ],
377
- "-customerID-" => [
378
- "1234",
379
- "5678"
380
- ],
381
- })
384
+ expect(client.sent_mail['tracking_settings']).to eq(tracking)
382
385
  end
383
386
  end
387
+ end
384
388
 
385
- context 'asm_group_id is present' do
386
- before do
387
- mail['X-SMTPAPI'] = {
388
- asm_group_id: 1
389
- }.to_json
389
+ context 'multipart/alternative' do
390
+ before do
391
+ mail.content_type 'multipart/alternative'
392
+ mail.part do |part|
393
+ part.text_part = Mail::Part.new do
394
+ content_type 'text/plain'
395
+ body 'I heard you like pineapple.'
396
+ end
397
+ part.html_part = Mail::Part.new do
398
+ content_type 'text/html'
399
+ body 'I heard you like <b>pineapple</b>.'
400
+ end
390
401
  end
402
+ end
391
403
 
392
- it 'gets attached' do
393
- mailer.deliver!(mail)
394
- expect(client.sent_mail.smtpapi.asm_group_id).to eq(1)
395
- end
404
+ it 'sets the text and html body' do
405
+ mailer.deliver!(mail)
406
+ expect(client.sent_mail['content']).to include({
407
+ 'type' => 'text/html',
408
+ 'value' => 'I heard you like <b>pineapple</b>.'
409
+ })
410
+ expect(client.sent_mail['content']).to include({
411
+ 'type' => 'text/plain',
412
+ 'value' => 'I heard you like pineapple.'
413
+ })
396
414
  end
415
+ end
397
416
 
398
- context 'unique_args are present' do
399
- before do
400
- mail['X-SMTPAPI'] = {
401
- unique_args: {
402
- customerAccountNumber: "55555",
403
- activationAttempt: "1",
404
- }
405
- }.to_json
417
+ context 'multipart/mixed' do
418
+ before do
419
+ mail.content_type 'multipart/mixed'
420
+ mail.part do |part|
421
+ part.text_part = Mail::Part.new do
422
+ content_type 'text/plain'
423
+ body 'I heard you like pineapple.'
424
+ end
425
+ part.html_part = Mail::Part.new do
426
+ content_type 'text/html'
427
+ body 'I heard you like <b>pineapple</b>.'
428
+ end
406
429
  end
430
+ mail.attachments['specs.rb'] = File.read(__FILE__)
431
+ end
407
432
 
408
- it 'gets attached' do
409
- mailer.deliver!(mail)
410
- expect(client.sent_mail.smtpapi.unique_args).to eq({
411
- "customerAccountNumber" => "55555",
412
- "activationAttempt" => "1",
413
- })
414
- end
433
+ it 'sets the text and html body' do
434
+ mailer.deliver!(mail)
435
+ expect(client.sent_mail['content']).to include({
436
+ 'type' => 'text/html',
437
+ 'value' => 'I heard you like <b>pineapple</b>.'
438
+ })
439
+ expect(client.sent_mail['content']).to include({
440
+ 'type' => 'text/plain',
441
+ 'value' => 'I heard you like pineapple.'
442
+ })
415
443
  end
416
444
 
417
- context 'ip_pool is present' do
418
- before do
419
- mail['X-SMTPAPI'] = {
420
- ip_pool: "pool_name"
421
- }.to_json
422
- end
445
+ it 'adds the attachment' do
446
+ expect(mail.attachments.first.read).to eq(File.read(__FILE__))
447
+ mailer.deliver!(mail)
448
+ attachment = client.sent_mail['attachments'].first
449
+ expect(attachment['filename']).to eq('specs.rb')
450
+ expect(attachment['type']).to eq('application/x-ruby')
451
+ end
452
+ end
423
453
 
424
- it 'gets attached' do
425
- mailer.deliver!(mail)
426
- expect(client.sent_mail.smtpapi.ip_pool).to eq("pool_name")
454
+ context 'multipart/related' do
455
+ before do
456
+ mail.content_type 'multipart/related'
457
+ mail.part do |part|
458
+ part.text_part = Mail::Part.new do
459
+ content_type 'text/plain'
460
+ body 'I heard you like pineapple.'
461
+ end
462
+ part.html_part = Mail::Part.new do
463
+ content_type 'text/html'
464
+ body 'I heard you like <b>pineapple</b>.'
465
+ end
427
466
  end
467
+ mail.attachments.inline['specs.rb'] = File.read(__FILE__)
428
468
  end
429
469
 
430
- context 'multiple X-SMTPAPI headers are present' do
431
- before do
432
- mail['X-SMTPAPI'] = { category: 'food_canine' }.to_json
433
- mail['X-SMTPAPI'] = { category: 'food_feline' }.to_json
434
- end
470
+ it 'sets the text and html body' do
471
+ mailer.deliver!(mail)
472
+ expect(client.sent_mail['content']).to include({
473
+ 'type' => 'text/html',
474
+ 'value' => 'I heard you like <b>pineapple</b>.'
475
+ })
476
+ expect(client.sent_mail['content']).to include({
477
+ 'type' => 'text/plain',
478
+ 'value' => 'I heard you like pineapple.'
479
+ })
480
+ end
435
481
 
436
- it 'uses the last header' do
437
- mailer.deliver!(mail)
438
- expect(client.sent_mail.smtpapi.category).to eq('food_canine')
439
- end
482
+ it 'adds the inline attachment' do
483
+ expect(mail.attachments.first.read).to eq(File.read(__FILE__))
484
+ mailer.deliver!(mail)
485
+ content = client.sent_mail['attachments'].first
486
+ expect(content['filename']).to eq('specs.rb')
487
+ expect(content['type']).to eq('application/x-ruby')
488
+ expect(content['content_id'].class).to eq(String)
440
489
  end
441
490
  end
442
491
  end