multi_mail 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +10 -0
  3. data/README.md +283 -59
  4. data/Rakefile +38 -19
  5. data/lib/multi_mail/cloudmailin/receiver.rb +3 -13
  6. data/lib/multi_mail/mailgun/message.rb +67 -0
  7. data/lib/multi_mail/mailgun/receiver.rb +20 -13
  8. data/lib/multi_mail/mailgun/sender.rb +79 -2
  9. data/lib/multi_mail/mandrill/message.rb +74 -0
  10. data/lib/multi_mail/mandrill/receiver.rb +36 -16
  11. data/lib/multi_mail/mandrill/sender.rb +77 -2
  12. data/lib/multi_mail/message/base.rb +40 -0
  13. data/lib/multi_mail/postmark/receiver.rb +1 -1
  14. data/lib/multi_mail/postmark/sender.rb +35 -5
  15. data/lib/multi_mail/receiver/base.rb +31 -2
  16. data/lib/multi_mail/receiver.rb +1 -4
  17. data/lib/multi_mail/sender/base.rb +23 -1
  18. data/lib/multi_mail/sendgrid/message.rb +74 -0
  19. data/lib/multi_mail/sendgrid/receiver.rb +72 -23
  20. data/lib/multi_mail/sendgrid/sender.rb +63 -2
  21. data/lib/multi_mail/service.rb +48 -56
  22. data/lib/multi_mail/simple/receiver.rb +4 -4
  23. data/lib/multi_mail/version.rb +1 -1
  24. data/lib/multi_mail.rb +16 -1
  25. data/multi_mail.gemspec +4 -1
  26. data/spec/fixtures/empty.gif +0 -0
  27. data/spec/fixtures/mailgun/raw/invalid.txt +13 -0
  28. data/spec/fixtures/mailgun/raw/missing.txt +13 -0
  29. data/spec/fixtures/mailgun/raw/spam.txt +13 -0
  30. data/spec/fixtures/mailgun/raw/valid.txt +13 -0
  31. data/spec/fixtures/mandrill/invalid.txt +15 -0
  32. data/spec/fixtures/mandrill/missing.txt +14 -0
  33. data/spec/fixtures/mandrill/multiple.txt +15 -0
  34. data/spec/fixtures/mandrill/valid.txt +10 -5
  35. data/spec/fixtures/postmark/valid.txt +13 -13
  36. data/spec/fixtures/sendgrid/encoding.txt +90 -0
  37. data/spec/fixtures/sendgrid/spam.txt +94 -0
  38. data/spec/fixtures/sendgrid/valid.txt +136 -0
  39. data/spec/mailgun/message_spec.rb +251 -0
  40. data/spec/mailgun/receiver_spec.rb +35 -20
  41. data/spec/mailgun/sender_spec.rb +175 -0
  42. data/spec/mandrill/message_spec.rb +305 -0
  43. data/spec/mandrill/receiver_spec.rb +90 -46
  44. data/spec/mandrill/sender_spec.rb +138 -0
  45. data/spec/message/base_spec.rb +81 -0
  46. data/spec/postmark/receiver_spec.rb +4 -4
  47. data/spec/postmark/sender_spec.rb +118 -0
  48. data/spec/receiver/base_spec.rb +16 -9
  49. data/spec/sender/base_spec.rb +24 -10
  50. data/spec/sendgrid/message_spec.rb +265 -0
  51. data/spec/sendgrid/receiver_spec.rb +77 -0
  52. data/spec/sendgrid/sender_spec.rb +140 -0
  53. data/spec/service_spec.rb +18 -1
  54. data/spec/simple/receiver_spec.rb +1 -1
  55. data/spec/spec_helper.rb +46 -4
  56. metadata +226 -143
  57. data/lib/multi_mail/sender.rb +0 -46
  58. data/lib/multi_mail/simple/sender.rb +0 -14
  59. data/spec/sender_spec.rb +0 -13
  60. data/spec/simple/sender_spec.rb +0 -0
@@ -0,0 +1,305 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'multi_mail/mandrill/message'
3
+
4
+ describe MultiMail::Message::Mandrill do
5
+ let :message do
6
+ headers = {
7
+ 'X-Autoreply' => true,
8
+ 'X-Precedence' => 'auto_reply',
9
+ 'X-Numeric' => 42,
10
+ 'Delivered-To' => 'Autoresponder',
11
+ }
12
+
13
+ MultiMail::Message::Mandrill.new do
14
+ date Time.at(946702800)
15
+ headers headers
16
+ from %("John Doe" <foo@example.com>)
17
+ to [%("Jane Doe" <bar@example.com>), '<baz@example.com>']
18
+ cc 'cc@example.com'
19
+ bcc 'bcc@example.com'
20
+ reply_to 'noreply@example.com'
21
+ subject 'test'
22
+
23
+ text_part do
24
+ body 'hello'
25
+ end
26
+
27
+ html_part do
28
+ content_type 'text/html; charset=UTF-8'
29
+ body '<p>hello</p>'
30
+ end
31
+
32
+ add_file empty_gif_path
33
+ add_file :filename => 'foo.txt', :content => 'hello world'
34
+ end
35
+ end
36
+
37
+ let :message_without_names do
38
+ MultiMail::Message::Mandrill.new do
39
+ from 'foo@example.com'
40
+ to ['bar@example.com', 'baz@example.com']
41
+ subject 'test'
42
+ body 'hello'
43
+ end
44
+ end
45
+
46
+ let :message_with_known_extension do
47
+ MultiMail::Message::Mandrill.new do
48
+ from 'foo@example.com'
49
+ to 'bar@example.com'
50
+ subject 'test'
51
+ body 'hello'
52
+ add_file :filename => 'xxx.mov', :content => ''
53
+ end
54
+ end
55
+
56
+ let :message_with_unknown_extension do
57
+ MultiMail::Message::Mandrill.new do
58
+ from 'foo@example.com'
59
+ to 'bar@example.com'
60
+ subject 'test'
61
+ body 'hello'
62
+ add_file :filename => 'xxx.xxx', :content => ''
63
+ end
64
+ end
65
+
66
+ let :message_without_extension do
67
+ MultiMail::Message::Mandrill.new do
68
+ from 'foo@example.com'
69
+ to 'bar@example.com'
70
+ subject 'test'
71
+ body 'hello'
72
+ add_file :filename => 'xxx', :content => ''
73
+ end
74
+ end
75
+
76
+ let :message_with_empty_file do
77
+ MultiMail::Message::Mandrill.new do
78
+ from 'foo@example.com'
79
+ to 'bar@example.com'
80
+ subject 'test'
81
+ body 'hello'
82
+ add_file :filename => '', :content => ''
83
+ end
84
+ end
85
+
86
+ let :message_with_empty_headers do
87
+ headers = {
88
+ 'X-Autoreply' => nil,
89
+ }
90
+
91
+ MultiMail::Message::Mandrill.new do
92
+ headers headers
93
+ from 'foo@example.com'
94
+ to 'bar@example.com'
95
+ reply_to nil
96
+ subject 'test'
97
+ body 'hello'
98
+ end
99
+ end
100
+
101
+ let :message_without_html_body do
102
+ MultiMail::Message::Mandrill.new do
103
+ from 'foo@example.com'
104
+ to 'bar@example.com'
105
+ subject 'test'
106
+ body 'hello'
107
+ end
108
+ end
109
+
110
+ let :message_without_text_body do
111
+ MultiMail::Message::Mandrill.new do
112
+ from 'foo@example.com'
113
+ to 'bar@example.com'
114
+ subject 'test'
115
+ body '<p>hello</p>'
116
+ content_type 'text/html; charset=UTF-8'
117
+ end
118
+ end
119
+
120
+ let :empty_message do
121
+ MultiMail::Message::Mandrill.new
122
+ end
123
+
124
+ describe '#mandrill_to' do
125
+ it 'should return the recipients with names' do
126
+ message.mandrill_to.should == [
127
+ {
128
+ 'email' => 'bar@example.com',
129
+ 'name' => 'Jane Doe',
130
+ },
131
+ {
132
+ 'email' => 'baz@example.com',
133
+ 'name' => nil,
134
+ },
135
+ ]
136
+ end
137
+
138
+ it 'should return the recipients without names' do
139
+ message_without_names.mandrill_to.should == [
140
+ {
141
+ 'email' => 'bar@example.com',
142
+ 'name' => nil,
143
+ },
144
+ {
145
+ 'email' => 'baz@example.com',
146
+ 'name' => nil,
147
+ },
148
+ ]
149
+ end
150
+
151
+ it 'should return an empty array' do
152
+ empty_message.mandrill_to.should == []
153
+ end
154
+ end
155
+
156
+ describe '#mandrill_headers' do
157
+ it 'should return only the Reply-To and X-* headers' do
158
+ headers = message.mandrill_headers
159
+ headers.should == {
160
+ 'Reply-To' => 'noreply@example.com',
161
+ 'X-Autoreply' => 'true',
162
+ 'X-Precedence' => 'auto_reply',
163
+ 'X-Numeric' => '42',
164
+ }
165
+ end
166
+
167
+ it 'should return empty X-* headers' do
168
+ headers = message_with_empty_headers.mandrill_headers
169
+ headers.should == {'X-Autoreply' => ''}
170
+ end
171
+
172
+ it 'should return an empty hash' do
173
+ empty_message.mandrill_headers.should == {}
174
+ end
175
+ end
176
+
177
+ describe '#mandrill_attachments' do
178
+ it 'should return the attachments' do
179
+ message.mandrill_attachments.should == [
180
+ {
181
+ 'type' => 'image/gif; filename=empty.gif',
182
+ 'name' => 'empty.gif',
183
+ 'content' => "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n",
184
+ },
185
+ {
186
+ 'type' => 'text/plain; filename=foo.txt',
187
+ 'name' => 'foo.txt',
188
+ 'content' => Base64.encode64('hello world'),
189
+ },
190
+ ]
191
+ end
192
+
193
+ it 'should return an attachment with an known extension' do
194
+ message_with_known_extension.mandrill_attachments.should == [
195
+ {
196
+ 'type' => 'video/quicktime; filename=xxx.mov',
197
+ 'name' => 'xxx.mov',
198
+ 'content' => '',
199
+ },
200
+ ]
201
+ end
202
+
203
+ it 'should return an attachment with an unknown extension' do
204
+ message_with_unknown_extension.mandrill_attachments.should == [
205
+ {
206
+ 'type' => 'text/plain',
207
+ 'name' => 'xxx.xxx',
208
+ 'content' => '',
209
+ },
210
+ ]
211
+ end
212
+
213
+ it 'should return an attachment without an extension' do
214
+ message_without_extension.mandrill_attachments.should == [
215
+ {
216
+ 'type' => 'text/plain',
217
+ 'name' => 'xxx',
218
+ 'content' => '',
219
+ },
220
+ ]
221
+ end
222
+
223
+ it 'should return an empty array if the attachment is blank' do
224
+ message_with_empty_file.mandrill_attachments.should == []
225
+ end
226
+
227
+ it 'should return an empty array' do
228
+ empty_message.mandrill_attachments.should == []
229
+ end
230
+ end
231
+
232
+ describe '#to_mandrill_hash' do
233
+ it 'should return the message as Mandrill parameters' do
234
+ message.to_mandrill_hash.should == {
235
+ :html => '<p>hello</p>',
236
+ :text => 'hello',
237
+ :subject => 'test',
238
+ :from_email => 'foo@example.com',
239
+ :from_name => 'John Doe',
240
+ :to => [
241
+ {
242
+ 'email' => 'bar@example.com',
243
+ 'name' => 'Jane Doe',
244
+ },
245
+ {
246
+ 'email' => 'baz@example.com',
247
+ 'name' => nil,
248
+ },
249
+ ],
250
+ :headers => {
251
+ 'Reply-To' => 'noreply@example.com',
252
+ 'X-Autoreply' => 'true',
253
+ 'X-Precedence' => 'auto_reply',
254
+ 'X-Numeric' => '42',
255
+ },
256
+ :attachments => [
257
+ {
258
+ 'type' => 'text/plain; filename=foo.txt',
259
+ 'name' => 'foo.txt',
260
+ 'content' => Base64.encode64('hello world'),
261
+ },
262
+ ],
263
+ :images => [
264
+ {
265
+ 'type' => 'image/gif; filename=empty.gif',
266
+ 'name' => 'empty.gif',
267
+ 'content' => "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n",
268
+ },
269
+ ],
270
+ }
271
+ end
272
+
273
+ it 'should convert the message without a text body' do
274
+ message_without_text_body.to_mandrill_hash.should == {
275
+ :html => '<p>hello</p>',
276
+ :subject => 'test',
277
+ :from_email => 'foo@example.com',
278
+ :to => [
279
+ {
280
+ 'email' => 'bar@example.com',
281
+ 'name' => nil,
282
+ },
283
+ ],
284
+ }
285
+ end
286
+
287
+ it 'should convert the message without an HTML body' do
288
+ message_without_html_body.to_mandrill_hash.should == {
289
+ :text => 'hello',
290
+ :subject => 'test',
291
+ :from_email => 'foo@example.com',
292
+ :to => [
293
+ {
294
+ 'email' => 'bar@example.com',
295
+ 'name' => nil,
296
+ },
297
+ ],
298
+ }
299
+ end
300
+
301
+ it 'should convert an empty message' do
302
+ empty_message.to_mandrill_hash.should == {}
303
+ end
304
+ end
305
+ end
@@ -3,61 +3,105 @@ require 'multi_mail/mandrill/receiver'
3
3
 
4
4
  describe MultiMail::Receiver::Mandrill do
5
5
  context 'after initialization' do
6
- let :service do
7
- MultiMail::Receiver.new(:provider => :mandrill)
8
- end
9
-
10
6
  def params(fixture)
11
7
  MultiMail::Receiver::Mandrill.parse(response('mandrill', fixture))
12
8
  end
13
9
 
14
- # @todo Add a spec for multiple Mandrill events.
15
- describe '#transform' do
16
- it 'should return a mail message' do
17
- messages = service.transform(params('valid'))
18
- messages.size.should == 1
19
- message = messages[0]
20
-
21
- # Headers
22
- message.date.should == DateTime.parse('Mon, 15 Apr 2013 20:20:12 -04:00')
23
- message.from.should == ['james@opennorth.ca']
24
- message.to.should == ['foo+bar@govkit.org']
25
- message.subject.should == 'Test'
26
-
27
- # Body
28
- message.multipart?.should == true
29
- message.parts.size.should == 4
30
- message.parts[0].content_type.should == 'text/plain'
31
- message.parts[1].content_type.should == 'text/html; charset=UTF-8'
32
- # @note Mandrill adds a newline at the end of each part.
33
- message.parts[0].body.decoded.should == "bold text\n\n\n\nsome more bold text\n\n\n\nsome italic text\n\n> multiline\n> quoted\n> text\n\n\n--\nSignature block\n"
34
- message.parts[1].body.decoded.should == %(<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body></html><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><head></head><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><b></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><i>some italic text</i></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><blockquote type="cite">multiline</blockquote><blockquote type="cite">quoted</blockquote><blockquote type="cite">text</blockquote></div><div><br></div><div>--</div><div>Signature block</div></body></html>)
35
-
36
- # Attachments
37
- attachment0 = message.attachments.find{|attachment| attachment.filename == 'foo.txt'}
38
- attachment1 = message.attachments.find{|attachment| attachment.filename == 'bar.txt'}
39
- attachment0.read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n"
40
- attachment1.read.should == "Nam accumsan euismod eros et rhoncus.\n\n"
41
-
42
- # Extra Mandrill parameters
43
- message['ts'].value.should == '1368657709'
44
- message['email'].value.should == 'foo+bar@govkit.org'
45
- message['dkim-signed'].value.should == 'false'
46
- message['dkim-valid'].value.should == 'false'
47
- message['spam_report-score'].value.should == '0'
48
- message['spf-result'].value.should == 'pass'
10
+ context 'without optional arguments' do
11
+ let :service do
12
+ MultiMail::Receiver.new(:provider => :mandrill)
13
+ end
14
+
15
+ describe '#valid?' do
16
+ it 'should return true if the response is valid' do
17
+ service.valid?(params('valid')).should == true
18
+ end
19
+
20
+ it 'should return true if the response is invalid' do
21
+ service.valid?(params('invalid')).should == true
22
+ end
23
+
24
+ it 'should return true if parameters are missing' do
25
+ service.valid?(params('missing')).should == true
26
+ end
49
27
  end
50
28
  end
51
29
 
52
- describe '#spam?' do
53
- it 'should return true if the response is spam' do
54
- message = service.transform(params('spam'))[0]
55
- service.spam?(message).should == true
30
+ context 'with optional arguments' do
31
+ let :service do
32
+ MultiMail::Receiver.new({
33
+ :provider => :mandrill,
34
+ :mandrill_webhook_key => 'rth_rywL9CWIIZBuwPQIWw',
35
+ :mandrill_webhook_url => 'http://rackbin.herokuapp.com/',
36
+ })
37
+ end
38
+
39
+ describe '#valid?' do
40
+ it 'should return true if the response is valid' do
41
+ service.valid?(params('valid')).should == true
42
+ end
43
+
44
+ it 'should return false if the response is invalid' do
45
+ service.valid?(params('invalid')).should == false
46
+ end
47
+
48
+ it 'should raise an error if parameters are missing' do
49
+ expect{ service.valid?(params('missing')) }.to raise_error(IndexError)
50
+ end
56
51
  end
57
52
 
58
- it 'should return false if the response is ham' do
59
- message = service.transform(params('valid'))[0]
60
- service.spam?(message).should == false
53
+ describe '#transform' do
54
+ it 'should return a mail message' do
55
+ messages = service.transform(params('valid'))
56
+ messages.size.should == 1
57
+ message = messages[0]
58
+
59
+ # Headers
60
+ message.date.should == DateTime.parse('Mon, 29 May 2013 16:51:45 -04:00')
61
+ message.from.should == ['james@opennorth.ca']
62
+ message.to.should == ['foo+bar@govkit.org']
63
+ message.subject.should == 'Test'
64
+
65
+ # Body
66
+ message.multipart?.should == true
67
+ message.parts.size.should == 4
68
+ message.parts[0].content_type.should == 'text/plain'
69
+ message.parts[1].content_type.should == 'text/html; charset=UTF-8'
70
+ # @note Mandrill adds a newline at the end of each part.
71
+ message.parts[0].body.decoded.should == "bold text\n\n\n\nsome more bold text\n\n\n\nsome italic text\n\n> multiline\n> quoted\n> text\n\n\n--\nSignature block\n"
72
+ message.parts[1].body.decoded.should == %(<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body></html><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><head></head><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><b></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><i>some italic text</i></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><blockquote type="cite">multiline</blockquote><blockquote type="cite">quoted</blockquote><blockquote type="cite">text</blockquote></div><div><br></div><div>--</div><div>Signature block</div></body></html>)
73
+
74
+ # Attachments
75
+ attachment0 = message.attachments.find{|attachment| attachment.filename == 'foo.txt'}
76
+ attachment1 = message.attachments.find{|attachment| attachment.filename == 'bar.txt'}
77
+ attachment0.read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n"
78
+ attachment1.read.should == "Nam accumsan euismod eros et rhoncus.\n\n"
79
+
80
+ # Extra Mandrill parameters
81
+ message['ts'].value.should == '1369860716'
82
+ message['email'].value.should == 'foo+bar@govkit.org'
83
+ message['dkim-signed'].value.should == 'false'
84
+ message['dkim-valid'].value.should == 'false'
85
+ message['spam_report-score'].value.should == '-0.7'
86
+ message['spf-result'].value.should == 'pass'
87
+ end
88
+
89
+ it 'should return multiple messages if there are multiple events' do
90
+ messages = service.transform(params('multiple'))
91
+ messages.size.should == 2
92
+ end
93
+ end
94
+
95
+ describe '#spam?' do
96
+ it 'should return true if the response is spam' do
97
+ message = service.transform(params('spam'))[0]
98
+ service.spam?(message).should == true
99
+ end
100
+
101
+ it 'should return false if the response is ham' do
102
+ message = service.transform(params('valid'))[0]
103
+ service.spam?(message).should == false
104
+ end
61
105
  end
62
106
  end
63
107
  end
@@ -0,0 +1,138 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'multi_mail/mandrill/sender'
3
+
4
+ describe MultiMail::Sender::Mandrill do
5
+ let :message do
6
+ Mail.new do
7
+ from 'foo@example.com'
8
+ to 'bar@example.com'
9
+ subject 'test'
10
+ body 'hello'
11
+ end
12
+ end
13
+
14
+ let :empty_message do
15
+ Mail.new
16
+ end
17
+
18
+ describe '#initialize' do
19
+ it 'should raise an error if :api_key is missing' do
20
+ expect{
21
+ message.delivery_method MultiMail::Sender::Mandrill
22
+ message.deliver # request not sent
23
+ }.to raise_error(ArgumentError, "Missing required arguments: api_key")
24
+ end
25
+
26
+ it 'should raise an error if :api_key is nil' do
27
+ expect{
28
+ message.delivery_method MultiMail::Sender::Mandrill, :api_key => nil
29
+ message.deliver # request not sent
30
+ }.to raise_error(ArgumentError, "Missing required arguments: api_key")
31
+ end
32
+
33
+ it 'should raise an error if :api_key is invalid' do
34
+ expect{
35
+ message.delivery_method MultiMail::Sender::Mandrill, :api_key => 'xxx'
36
+ message.deliver
37
+ }.to raise_error(MultiMail::InvalidAPIKey, 'Invalid API key')
38
+ end
39
+
40
+ it 'should have default settings' do
41
+ sender = MultiMail::Sender::Mandrill.new(:api_key => '')
42
+
43
+ sender.api_key.should == ''
44
+ sender.async.should == false
45
+ sender.ip_pool.should == nil
46
+ sender.send_at.should == nil
47
+ end
48
+
49
+ it 'should assign custom settings' do
50
+ sender = MultiMail::Sender::Mandrill.new({
51
+ :api_key => 'xxx',
52
+ :async => true,
53
+ :ip_pool => 'Main Pool',
54
+ :send_at => 'example send_at',
55
+ })
56
+
57
+ sender.api_key.should == 'xxx'
58
+ sender.async.should == true
59
+ sender.ip_pool.should == 'Main Pool'
60
+ sender.send_at.should == 'example send_at'
61
+ end
62
+ end
63
+
64
+ describe '#parameters' do
65
+ it 'should allow true, false and nil values' do
66
+ [true, false, nil].each do |value|
67
+ sender = MultiMail::Sender::Mandrill.new({
68
+ :api_key => 'xxx',
69
+ :track => {
70
+ :clicks => value,
71
+ }
72
+ })
73
+
74
+ sender.parameters.should == {:track_clicks => value}
75
+ end
76
+ end
77
+
78
+ it 'should transform "yes" and "no" values' do
79
+ sender = MultiMail::Sender::Mandrill.new({
80
+ :api_key => 'xxx',
81
+ :track => {
82
+ :opens => 'no',
83
+ :clicks => 'yes',
84
+ }
85
+ })
86
+
87
+ sender.parameters.should == {:track_opens => false, :track_clicks => true}
88
+ end
89
+
90
+ it 'should ignore "htmlonly" values' do
91
+ sender = MultiMail::Sender::Mandrill.new({
92
+ :api_key => 'xxx',
93
+ :track => {
94
+ :clicks => 'htmlonly',
95
+ }
96
+ })
97
+
98
+ sender.parameters.should == {}
99
+ end
100
+ end
101
+
102
+ describe '#deliver' do
103
+ before :all do
104
+ Mail.defaults do
105
+ delivery_method MultiMail::Sender::Mandrill, :api_key => ENV['MANDRILL_API_KEY']
106
+ end
107
+ end
108
+
109
+ it 'should send a message' do
110
+ message.deliver.should == message
111
+ end
112
+ end
113
+
114
+ describe '#deliver!' do
115
+ before :all do
116
+ Mail.defaults do
117
+ delivery_method MultiMail::Sender::Mandrill, :api_key => ENV['MANDRILL_API_KEY'], :return_response => true
118
+ end
119
+ end
120
+
121
+ it 'should send a message' do
122
+ results = message.deliver!
123
+ results.size.should == 1
124
+
125
+ result = results.first
126
+ result.size.should == 4
127
+
128
+ result['reject_reason'].should == nil
129
+ result['status'].should == "sent"
130
+ result['email'].should == "bar@example.com"
131
+ result['_id'].should match(/\A[0-9a-f]{32}\z/)
132
+ end
133
+
134
+ it 'should not send an empty message' do
135
+ empty_message.deliver!.should == [] # response not saved
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,81 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe MultiMail::Message::Base do
4
+ let :text_message do
5
+ MultiMail::Message::Base.new do
6
+ from 'foo@example.com'
7
+ to 'bar@example.com'
8
+ subject 'test'
9
+ body 'hello'
10
+ end
11
+ end
12
+
13
+ let :html_message do
14
+ MultiMail::Message::Base.new do
15
+ from 'foo@example.com'
16
+ to 'bar@example.com'
17
+ subject 'test'
18
+ body '<p>hello</p>'
19
+ content_type 'text/html; charset=UTF-8'
20
+ end
21
+ end
22
+
23
+ let :html_and_text_message do
24
+ MultiMail::Message::Base.new do
25
+ from 'foo@example.com'
26
+ to 'bar@example.com'
27
+ subject 'test'
28
+
29
+ text_part do
30
+ body 'hello'
31
+ end
32
+
33
+ html_part do
34
+ content_type 'text/html; charset=UTF-8'
35
+ body '<p>hello</p>'
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#html?' do
41
+ it 'should return false if the message is text only' do
42
+ text_message.html?.should == false
43
+ end
44
+
45
+ it 'should return true if the message is HTML only' do
46
+ html_message.html?.should == true
47
+ end
48
+
49
+ it 'should return false if the message has both HTML and text parts' do
50
+ html_and_text_message.html?.should == false
51
+ end
52
+ end
53
+
54
+ describe '#body_html' do
55
+ it 'should not return the body if the message is text only' do
56
+ text_message.body_html.should be_nil
57
+ end
58
+
59
+ it 'should return the body if the message is HTML only' do
60
+ html_message.body_html.should == '<p>hello</p>'
61
+ end
62
+
63
+ it 'should return the body if the message has both HTML and text parts' do
64
+ html_and_text_message.body_html.should == '<p>hello</p>'
65
+ end
66
+ end
67
+
68
+ describe '#text_part' do
69
+ it 'should return the body if the message is text only' do
70
+ text_message.body_text.should == 'hello'
71
+ end
72
+
73
+ it 'should return not the body if the message is HTML only' do
74
+ html_message.body_text.should be_nil
75
+ end
76
+
77
+ it 'should return the body if the message has both HTML and text parts' do
78
+ html_and_text_message.body_text.should == 'hello'
79
+ end
80
+ end
81
+ end