radiant-mailer-extension 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,326 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ describe "MailerTags" do
4
+ dataset :mailer
5
+ describe "<r:mailer>" do
6
+ it "should render an error if the configuration is invalid" do
7
+ pages(:home).should render("<r:mailer>true</r:mailer>").as('Mailer config is not valid (see Mailer.valid_config?)')
8
+ end
9
+
10
+ it "should render its contents if the configuration is valid" do
11
+ pages(:mail_form).should render("<r:mailer>true</r:mailer>").as('true')
12
+ end
13
+ end
14
+
15
+ describe "<r:mailer:if_error>" do
16
+ before :each do
17
+ @page = pages(:mail_form)
18
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'body' => 'Hello, world!')
19
+ end
20
+
21
+ it "should render its contents if there was an error in the last posted mail" do
22
+ @mail.should_receive(:valid?).and_return(false)
23
+ @page.should render('<r:mailer:if_error>Oops.</r:mailer:if_error>').as('Oops.')
24
+ end
25
+
26
+ it "should not render its contents if the last posted mail was valid" do
27
+ @mail.should_receive(:valid?).and_return(true)
28
+ @page.should render('<r:mailer:if_error>Oops.</r:mailer:if_error>').as('')
29
+ end
30
+
31
+ describe "when a field is specified" do
32
+ it "should render its contents if there was an error on the specified field in the last posted mail" do
33
+ @mail.errors['email'] = "is not a valid email"
34
+ @page.should render('<r:mailer:if_error on="email">true</r:mailer:if_error>').as('true')
35
+ end
36
+
37
+ it "should not render its contents if there wasn't an error on the specified field in the last posted mail" do
38
+ @mail.errors['email'] = "is not a valid email"
39
+ @page.should render('<r:mailer:if_error on="name">true</r:mailer:if_error>').as('')
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "<r:mailer:if_error:message>" do
45
+ before :each do
46
+ @page = pages(:mail_form)
47
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'body' => 'Hello, world!')
48
+ end
49
+
50
+ it "should render the error message on the specified attribute" do
51
+ @mail.errors['email'] = 'is not a valid email'
52
+ @page.should render('<r:mailer:if_error on="email"><r:message /></r:mailer:if_error>').as("is not a valid email")
53
+ end
54
+ end
55
+
56
+ describe "<r:mailer:unless_error>" do
57
+ before :each do
58
+ @page = pages(:mail_form)
59
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'body' => 'Hello, world!')
60
+ end
61
+
62
+ it "should render its contents if there was not error in the last posted mail" do
63
+ @mail.should_receive(:valid?).and_return(true)
64
+ @page.should render('<r:mailer:unless_error>Oops.</r:mailer:unless_error>').as('Oops.')
65
+ end
66
+
67
+ it "should render its contents if the last posted mail was valid" do
68
+ @mail.should_receive(:valid?).and_return(false)
69
+ @page.should render('<r:mailer:unless_error>Oops.</r:mailer:unless_error>').as('')
70
+ end
71
+
72
+ describe "when a field is specified" do
73
+ it "should not render its contents if there was an error on the specified field in the last posted mail" do
74
+ @mail.errors['email'] = "is not a valid email"
75
+ @page.should render('<r:mailer:unless_error on="email">true</r:mailer:unless_error>').as('')
76
+ end
77
+
78
+ it "should render its contents if there wasn't an error on the specified field in the last posted mail" do
79
+ @mail.errors['email'] = "is not a valid email"
80
+ @page.should render('<r:mailer:unless_error on="name">true</r:mailer:unless_error>').as('true')
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "<r:mailer:form>" do
86
+ it "should render a form that posts back to the page when mailer.post_to_page? is true" do
87
+ Radiant::Config['mailer.post_to_page?'] = true
88
+ pages(:mail_form).should render('<r:mailer:form />').as('<form action="/mail-form/" method="post" id="mailer"></form>')
89
+ end
90
+
91
+ it "should render a form that posts back to the controller when mailer.post_to_page? is false" do
92
+ Radiant::Config['mailer.post_to_page?'] = false
93
+ pages(:mail_form).should render('<r:mailer:form />').as(%Q{<form action="/pages/#{page_id(:mail_form)}/mail#mailer" method="post" id="mailer"></form>})
94
+ end
95
+
96
+ it "should render permitted passed attributes as attributes of the form tag" do
97
+ pages(:mail_form).should render('<r:mailer:form class="foo" />').matching(/class="foo"/)
98
+ end
99
+ end
100
+
101
+ describe "<r:mailer:if_success>" do
102
+ before :each do
103
+ @page = pages(:mail_form)
104
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'body' => 'Hello, world!')
105
+ end
106
+
107
+ it "should render its contents if the last posted mail was sent successfully" do
108
+ @mail.should_receive(:sent?).and_return(true)
109
+ @page.should render('<r:mailer:if_success>true</r:mailer:if_success>').as('true')
110
+ end
111
+
112
+ it "should not render its contents if the last posted mail was not sent successfully" do
113
+ @mail.should_receive(:sent?).and_return(false)
114
+ @page.should render('<r:mailer:if_success>true</r:mailer:if_success>').as('')
115
+ end
116
+ end
117
+
118
+ %w(text checkbox radio hidden).each do |type|
119
+ describe "<r:mailer:#{type}>" do
120
+ it "should render an input tag with the type #{type}" do
121
+ pages(:mail_form).should render("<r:mailer:#{type} name='foo' />").as(%Q{<input type="#{type}" value="" id="foo" name="mailer[foo]" />})
122
+ end
123
+
124
+ it "should render permitted passed attributes as attributes of the input tag" do
125
+ pages(:mail_form).should render("<r:mailer:#{type} name='foo' class='bar'/>").as(%Q{<input type="#{type}" value="" class="bar" id="foo" name="mailer[foo]" />})
126
+ end
127
+
128
+ it "should render the specified value as the value attribute" do
129
+ pages(:mail_form).should render("<r:mailer:#{type} name='foo' value='bar'/>").as(%Q{<input type="#{type}" value="bar" id="foo" name="mailer[foo]" />})
130
+ end
131
+
132
+ it "should render the previously posted value when present as the value attribute, overriding a passed value attribute" do
133
+ @page = pages(:mail_form)
134
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo' => 'Hello, world!')
135
+ @page.should render("<r:mailer:#{type} name='foo' value='bar'/>").as(%Q{<input type="#{type}" value="Hello, world!" id="foo" name="mailer[foo]" />})
136
+ end
137
+
138
+ it "should add a 'required' hidden field when the required attribute is specified" do
139
+ pages(:mail_form).should render("<r:mailer:#{type} name='foo' required='true'/>").as(%Q{<input type="#{type}" value="" id="foo" name="mailer[foo]" /><input type="hidden" name="mailer[required][foo]" value="true" />})
140
+ end
141
+
142
+ it "should raise an error if the name attribute is not specified" do
143
+ pages(:mail_form).should render("<r:mailer:#{type} />").with_error("`mailer:#{type}' tag requires a `name' attribute")
144
+ end
145
+ end
146
+ end
147
+
148
+ describe "<r:mailer:select>" do
149
+ it "should render a select tag" do
150
+ pages(:mail_form).should render('<r:mailer:select name="foo" />').as('<select size="1" id="foo" name="mailer[foo]"></select>')
151
+ end
152
+
153
+ it "should raise an error if the name attribute is not specified" do
154
+ pages(:mail_form).should render("<r:mailer:select />").with_error("`mailer:select' tag requires a `name' attribute")
155
+ end
156
+
157
+ it "should render its contents within the select tag" do
158
+ pages(:mail_form).should render('<r:mailer:select name="foo">bar</r:mailer:select>').as('<select size="1" id="foo" name="mailer[foo]">bar</select>')
159
+ end
160
+
161
+ it "should render nested <r:mailer:option> tags as option tags" do
162
+ pages(:mail_form).should render('<r:mailer:select name="foo"><r:option value="bar">bar</r:option></r:mailer:select>').as('<select size="1" id="foo" name="mailer[foo]"><option value="bar" >bar</option></select>')
163
+ end
164
+
165
+ it "should select the specified option tag on a new form" do
166
+ pages(:mail_form).should render('<r:mailer:select name="foo"><r:option value="bar" selected="selected">bar</r:option><r:option value="baz">baz</r:option></r:mailer:select>').as('<select size="1" id="foo" name="mailer[foo]"><option value="bar" selected="selected" >bar</option><option value="baz" >baz</option></select>')
167
+ end
168
+
169
+ it "should select the option tag with previously posted value" do
170
+ @page = pages(:mail_form)
171
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo' => 'baz')
172
+ @page.should render('<r:mailer:select name="foo"><r:option value="bar" selected="selected">bar</r:option><r:option value="baz">baz</r:option></r:mailer:select>').as('<select size="1" id="foo" name="mailer[foo]"><option value="bar" >bar</option><option value="baz" selected="selected" >baz</option></select>')
173
+ end
174
+
175
+ it "should add a 'required' hidden field when the required attribute is specified" do
176
+ pages(:mail_form).should render("<r:mailer:select name='foo' required='true'/>").as(%Q{<select size="1" id="foo" name="mailer[foo]"></select><input type="hidden" name="mailer[required][foo]" value="true" />})
177
+ end
178
+ end
179
+
180
+ describe "<r:mailer:date_select>" do
181
+ # HACK: Quick way to get a tag rendered to string in the context of a page.
182
+ # How can this be made better?
183
+ def render_tag_in_mailer(content)
184
+ tag = Spec::Rails::Matchers::RenderTags.new
185
+ tag.send(:render_content_with_page, content, pages(:mail_form))
186
+ end
187
+
188
+ it "should render select tags for each date component" do
189
+ date_select = render_tag_in_mailer('<r:mailer:date_select name="foo" />')
190
+ date_select.should have_tag('select[name=?]', "mailer[foo(1i)]")
191
+ date_select.should have_tag('select[name=?]', "mailer[foo(2i)]")
192
+ date_select.should have_tag('select[name=?]', "mailer[foo(3i)]")
193
+ end
194
+
195
+ it "should include blank options" do
196
+ date_select = render_tag_in_mailer('<r:mailer:date_select name="foo" include_blank="true" />')
197
+ date_select.should have_tag('select[name=?]', "mailer[foo(1i)]") do
198
+ with_tag('option[value=?]', '')
199
+ end
200
+ date_select.should have_tag('select[name=?]', "mailer[foo(2i)]") do
201
+ with_tag('option[value=?]', '')
202
+ end
203
+ date_select.should have_tag('select[name=?]', "mailer[foo(3i)]") do
204
+ with_tag('option[value=?]', '')
205
+ end
206
+ end
207
+
208
+ it "should order select tags" do
209
+ date_select = render_tag_in_mailer('<r:mailer:date_select name="foo" order="day,year,month" />')
210
+ date_select.should have_tag('select[name=?]+select[name=?]+select[name=?]','mailer[foo(3i)]', 'mailer[foo(1i)]', 'mailer[foo(2i)]')
211
+ end
212
+ end
213
+
214
+ describe "<r:mailer:textarea>" do
215
+ it "should render a textarea tag" do
216
+ pages(:mail_form).should render('<r:mailer:textarea name="body" />').as('<textarea id="body" rows="5" cols="35" name="mailer[body]"></textarea>')
217
+ end
218
+
219
+ it "should raise an error if the name attribute is not specified" do
220
+ pages(:mail_form).should render("<r:mailer:textarea />").with_error("`mailer:textarea' tag requires a `name' attribute")
221
+ end
222
+
223
+ it "should render its contents as the contents of the textarea tag" do
224
+ pages(:mail_form).should render('<r:mailer:textarea name="body">Hello, world!</r:mailer:textarea>').as('<textarea id="body" rows="5" cols="35" name="mailer[body]">Hello, world!</textarea>')
225
+ end
226
+
227
+ it "should add a 'required' hidden field when the required attribute is specified" do
228
+ pages(:mail_form).should render("<r:mailer:textarea name='body' required='true'/>").as(%Q{<textarea id="body" rows="5" cols="35" name="mailer[body]"></textarea><input type="hidden" name="mailer[required][body]" value="true" />})
229
+ end
230
+ end
231
+
232
+ describe "<r:mailer:radiogroup>" do
233
+ it "should render its contents" do
234
+ pages(:mail_form).should render('<r:mailer:radiogroup name="foo">bar</r:mailer:radiogroup>').as('bar')
235
+ end
236
+
237
+ it "should raise an error if the name attribute is not specified" do
238
+ pages(:mail_form).should render("<r:mailer:radiogroup />").with_error("`mailer:radiogroup' tag requires a `name' attribute")
239
+ end
240
+
241
+ it "should render nested <r:mailer:option> tags as radio buttons" do
242
+ pages(:mail_form).should render('<r:mailer:radiogroup name="foo"><r:option value="bar" /></r:mailer:radiogroup>').as('<input type="radio" value="bar" id="foo" name="mailer[foo]" />')
243
+ end
244
+
245
+ it "should select the specified radio button on a new form" do
246
+ pages(:mail_form).should render('<r:mailer:radiogroup name="foo"><r:option value="bar" selected="selected"/><r:option value="baz" /></r:mailer:radiogroup>').as('<input type="radio" value="bar" checked="checked" id="foo" name="mailer[foo]" /><input type="radio" value="baz" id="foo" name="mailer[foo]" />')
247
+ end
248
+
249
+ it "should select the radio button with previously posted value" do
250
+ @page = pages(:mail_form)
251
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo' => 'baz')
252
+ @page.should render('<r:mailer:radiogroup name="foo"><r:option value="bar" selected="selected"/><r:option value="baz" /></r:mailer:radiogroup>').as('<input type="radio" value="bar" id="foo" name="mailer[foo]" /><input type="radio" value="baz" checked="checked" id="foo" name="mailer[foo]" />')
253
+ end
254
+ end
255
+
256
+ describe "<r:mailer:get>" do
257
+ before :each do
258
+ @page = pages(:mail_form)
259
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo' => 'baz')
260
+ end
261
+
262
+ it "should render the data as YAML when no name is given" do
263
+ @page.should render('<r:mailer:get />').as("--- \nfoo: baz\n")
264
+ end
265
+
266
+ it "should render the specified datum" do
267
+ @page.should render('<r:mailer:get name="foo" />').as('baz')
268
+ end
269
+
270
+ it "should render nothing when the value is not present" do
271
+ @page.should render('<r:mailer:get name="body" />').as('')
272
+ end
273
+
274
+ it "should render date when date params are detected" do
275
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo(1i)' => '2008', 'foo(2i)' => '10', 'foo(3i)' => '29')
276
+ @page.should render('<r:mailer:get name="foo" />').as('2008-10-29')
277
+ end
278
+ end
279
+
280
+ describe "<r:mailer:get_each>" do
281
+ before :each do
282
+ # This simulates variables like :
283
+ # products[0][qty]=10
284
+ # products[0][name]=foo
285
+ # products[1][qty]=5
286
+ # products[1][name]=bar
287
+ test_array=[ { 'qty' => 10, 'name' => 'foo' },
288
+ { 'qty' => 5, 'name' => 'bar' } ]
289
+ @page = pages(:mail_form)
290
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'qty' => 'wrong', 'products' => test_array)
291
+ end
292
+
293
+ it "should not alter the content on its own" do
294
+ @page.should render('<r:mailer:get_each />').as('')
295
+ end
296
+
297
+ it "should make mailer:get use the local variables" do
298
+ # If this fails, it will show "wrongwrong" or something like that
299
+ @page.should render('<r:mailer:get_each name="products"><r:mailer:get name="qty" /></r:mailer:get_each>').as('105')
300
+ end
301
+
302
+ it "should iterate and provide mailer:get the local variables" do
303
+ @page.should render('<r:mailer:get_each name="products"><r:mailer:get name="qty" />x<r:mailer:get name="name" />,</r:mailer:get_each>').as('10xfoo,5xbar,')
304
+ end
305
+
306
+ it "should provide mailer:index" do
307
+ @page.should render('<r:mailer:get_each name="products"><r:mailer:index /><r:mailer:get name="name" /></r:mailer:get_each>').as('0foo1bar')
308
+ end
309
+
310
+ end
311
+
312
+ describe "<r:mailer:if_value>" do
313
+ before :each do
314
+ @page = pages(:mail_form)
315
+ @page.last_mail = @mail = Mail.new(@page, @page.config, 'foo' => 'baz')
316
+ end
317
+
318
+ it "should render its contained block if the specified value was submitted" do
319
+ @page.should render('<r:mailer:if_value name="foo">true</r:mailer:if_value>').as('true')
320
+ end
321
+
322
+ it "should render not its contained block if the specified value was not submitted" do
323
+ @page.should render('<r:mailer:if_value name="bar">true</r:mailer:if_value>').as('')
324
+ end
325
+ end
326
+ end
@@ -0,0 +1,212 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ describe Mail do
4
+ dataset :mailer
5
+
6
+ before :each do
7
+ @page = pages(:mail_form)
8
+ @page.request = ActionController::TestRequest.new
9
+ @page.last_mail = @mail = Mail.new(@page, {:recipients => ['foo@bar.com'], :from => 'foo@baz.com'}, {'body' => 'Hello, world!'})
10
+ ActionMailer::Base.delivery_method = :test
11
+ ActionMailer::Base.deliveries = []
12
+ end
13
+
14
+ it "should have an invalid config when recipients or from keys are absent" do
15
+ Mail.valid_config?('from' => 'foo@baz.com').should be_false
16
+ Mail.valid_config?('recipients' => 'foo@bar.com').should be_false
17
+ end
18
+
19
+ it "should have a valid config when recipients and from keys are present" do
20
+ Mail.valid_config?('recipients' => 'foo@bar.com', 'from' => 'foo@baz.com').should be_true
21
+ end
22
+
23
+ it "should have a valid config when recipients_field stands in for recipients" do
24
+ Mail.valid_config?('recipients_field' => 'to', 'from' => 'foo@baz.com').should be_true
25
+ end
26
+
27
+ it "should have a valid config when from_field stands in for from" do
28
+ Mail.valid_config?('recipients' => 'foo@bar.com', 'from_field' => 'from').should be_true
29
+ end
30
+
31
+ it "should derive the from field from the configuration" do
32
+ @mail.from.should == 'foo@baz.com'
33
+ end
34
+
35
+ it "should derive the from field from the data when not in the configuration" do
36
+ @mail.config[:from] = nil
37
+ @mail.config[:from_field] = 'from'
38
+ @mail.data['from'] = 'radiant@foo.com'
39
+ @mail.from.should == 'radiant@foo.com'
40
+ end
41
+
42
+ it "should derive the recipients field from the configuration" do
43
+ @mail.recipients.should == ['foo@bar.com']
44
+ end
45
+
46
+ it "should derive the recipients field from the data when not in the configuration" do
47
+ @mail.config[:recipients] = nil
48
+ @mail.config[:recipients_field] = 'to'
49
+ @mail.data['to'] = 'radiant@foo.com'
50
+ @mail.recipients.should == %w(radiant@foo.com)
51
+ end
52
+
53
+ it "should derive the reply_to field from the configuration" do
54
+ @mail.config[:reply_to] = "sean@radiant.com"
55
+ @mail.reply_to.should == "sean@radiant.com"
56
+ end
57
+
58
+ it "should derive the reply_to field from the data when not in the configuration" do
59
+ @mail.config[:reply_to_field] = 'reply_to'
60
+ @mail.data['reply_to'] = 'sean@radiant.com'
61
+ @mail.reply_to.should == 'sean@radiant.com'
62
+ end
63
+
64
+ it "should derive the sender field from the configuration" do
65
+ @mail.config[:sender] = "sean@radiant.com"
66
+ @mail.sender.should == "sean@radiant.com"
67
+ end
68
+
69
+ it "should derive the subject field from the data" do
70
+ @mail.data[:subject] = "My subject"
71
+ @mail.subject.should == 'My subject'
72
+ end
73
+
74
+ it "should derive the subject field from the configuration when not present in the data" do
75
+ @mail.config[:subject] = "My subject"
76
+ @mail.subject.should == 'My subject'
77
+ end
78
+
79
+ it "should generate the subject field when not present in data or configuration" do
80
+ @mail.subject.should == 'Form Mail from test.host'
81
+ end
82
+
83
+ it "should derive the cc field from the data when configured" do
84
+ @mail.data['cc'] = "sean@radiant.com"
85
+ @mail.config[:cc_field] = 'cc'
86
+ @mail.cc.should == "sean@radiant.com"
87
+ end
88
+
89
+ it "should derive the cc field from the configuration when not in the data" do
90
+ @mail.config[:cc] = "sean@radiant.com"
91
+ @mail.cc.should == "sean@radiant.com"
92
+ end
93
+
94
+ it "should return a blank cc when not in the data or configuration" do
95
+ @mail.cc.should be_blank
96
+ end
97
+
98
+ it "should initially have no errors" do
99
+ @mail.errors.should == {}
100
+ end
101
+
102
+ it "should be valid when the configuration and fields are correct" do
103
+ @mail.should be_valid
104
+ end
105
+
106
+ it "should be invalid when the recipients are empty" do
107
+ @mail.config[:recipients] = []
108
+ @mail.should_not be_valid
109
+ @mail.errors['form'].should_not be_blank
110
+ end
111
+
112
+ it "should be invalid when the recipients contains invalid email adresses" do
113
+ @mail.config[:recipients] = ['sean AT radiant DOT com']
114
+ @mail.should_not be_valid
115
+ @mail.errors['form'].should_not be_blank
116
+ end
117
+
118
+ it "should be invalid when the from field is empty" do
119
+ @mail.config[:from] = nil
120
+ @mail.should_not be_valid
121
+ @mail.errors['form'].should_not be_blank
122
+ end
123
+
124
+ it "should be invalid when the from field contains an invalid email address" do
125
+ @mail.config[:from] = 'sean AT radiant DOT com'
126
+ @mail.should_not be_valid
127
+ @mail.errors['form'].should_not be_blank
128
+ end
129
+
130
+ it "should be invalid when a required field is missing" do
131
+ @mail = Mail.new(@page, {:recipients => ['foo@bar.com'], :from => 'foo@baz.com'}, {:required => {'first_name' => 'true'}})
132
+ @mail.should_not be_valid
133
+ @mail.errors['first_name'].should_not be_blank
134
+ end
135
+
136
+ it "should not send the mail if invalid" do
137
+ @mail.should_receive(:valid?).and_return(false)
138
+ @mail.send.should be_false
139
+ end
140
+
141
+ it "should send an email" do
142
+ @mail.send.should be_true
143
+ ActionMailer::Base.deliveries.should_not be_empty
144
+ end
145
+
146
+ it "should not send and should register an error if the Mailer raised an exception" do
147
+ Mailer.should_receive(:deliver_generic_mail).and_raise("Boom!")
148
+ @mail.should be_valid
149
+ @mail.send.should be_false
150
+ @mail.errors['base'].should == "Boom!"
151
+ end
152
+
153
+ it "should set the Reply-To header on the sent mail to the reply_to value given in the configuration" do
154
+ @mail.config[:reply_to] = "reply_to@example.com"
155
+ @mail.send
156
+ ActionMailer::Base.deliveries.last.reply_to.should == [@mail.config[:reply_to]] # reply_to on TMail is an Array
157
+ end
158
+
159
+ it "should set the Reply-To header on the sent mail to the reply_to_field data value given in the configuration" do
160
+ @mail.config[:reply_to_field] = 'email'
161
+ @mail.data['email'] = 'reply_to_field@example.com'
162
+ @mail.send
163
+ ActionMailer::Base.deliveries.last.reply_to.should == [@mail.data['email']] # reply_to on TMail is an Array
164
+ end
165
+
166
+ it "should set the Reply-To header on the sent mail to the from value when the configuration does not specify a reply_to" do
167
+ @mail.send
168
+ ActionMailer::Base.deliveries.last.reply_to.should == ['foo@baz.com'] # reply_to on TMail is an Array
169
+ end
170
+
171
+ describe "when the page has no email body specified" do
172
+ it "should render the submitted data as YAML to the plain body" do
173
+ Mailer.should_receive(:deliver_generic_mail) do |params|
174
+ params[:plain_body].should == "The following information was posted:\n--- \nbody: Hello, world!\n\n"
175
+ params[:html_body].should be_blank
176
+ end
177
+ @mail.send.should be_true
178
+ end
179
+ end
180
+
181
+ describe "when the page has specified a plain email body" do
182
+ before :each do
183
+ @page = pages(:plain_mail)
184
+ @page.request = ActionController::TestRequest.new
185
+ @page.last_mail = @mail = Mail.new(@page, {:recipients => ['foo@bar.com'], :from => 'foo@baz.com'}, {'body' => 'Hello, world!'})
186
+ end
187
+
188
+ it "should send an email with the rendered plain body" do
189
+ Mailer.should_receive(:deliver_generic_mail) do |params|
190
+ params[:plain_body].should == 'The body: Hello, world!'
191
+ params[:html_body].should be_blank
192
+ end
193
+ @mail.send.should be_true
194
+ end
195
+ end
196
+
197
+ describe "when the page has specified an HTML email body" do
198
+ before :each do
199
+ @page = pages(:html_mail)
200
+ @page.request = ActionController::TestRequest.new
201
+ @page.last_mail = @mail = Mail.new(@page, {:recipients => ['foo@bar.com'], :from => 'foo@baz.com'}, {'body' => 'Hello, world!'})
202
+ end
203
+
204
+ it "should send an email with the rendered plain body" do
205
+ Mailer.should_receive(:deliver_generic_mail) do |params|
206
+ params[:plain_body].should be_blank
207
+ params[:html_body].should == '<html><body>Hello, world!</body></html>'
208
+ end
209
+ @mail.send.should be_true
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,76 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Mailer" do
4
+ before :each do
5
+ ActionMailer::Base.delivery_method = :test
6
+ @deliveries = ActionMailer::Base.deliveries = []
7
+ end
8
+
9
+ def do_deliver(options={})
10
+ Mailer.deliver_generic_mail({:recipients => ['foo@bar.com'], :plain_body => ''}.merge(options).reject {|k,v| v.nil? })
11
+ end
12
+
13
+ it "should set the recipients" do
14
+ do_deliver
15
+ @deliveries.first.to.should == ['foo@bar.com']
16
+ end
17
+
18
+ it "should be the multipart/alternative content type" do
19
+ do_deliver
20
+ @deliveries.first.content_type.should == 'multipart/alternative'
21
+ end
22
+
23
+ it "should render a plain body" do
24
+ do_deliver :plain_body => "Hello, world!"
25
+ @deliveries.first.body.should match(/Hello, world!/)
26
+ end
27
+
28
+ it "should render an HTML body" do
29
+ do_deliver :plain_body => nil, :html_body => "<html><body>Hello, world!</body></html>"
30
+ @deliveries.first.body.should match(%r{<html><body>Hello, world!</body></html>})
31
+ end
32
+
33
+ it "should render both bodies when present" do
34
+ do_deliver :plain_body => "Hiya!", :html_body => "<html><body>Hello, world!</body></html>"
35
+ @deliveries.first.body.should match(/Hiya!/)
36
+ @deliveries.first.body.should match(%r{<html><body>Hello, world!</body></html>})
37
+ end
38
+
39
+ it "should set the subject" do
40
+ do_deliver :subject => "Testing 123"
41
+ @deliveries.first.subject.should == "Testing 123"
42
+ end
43
+
44
+ it "should set the from field" do
45
+ do_deliver :from => "sean@radiant.com"
46
+ @deliveries.first.from.should == %w'sean@radiant.com'
47
+ end
48
+
49
+ it "should set the cc field" do
50
+ do_deliver :cc => "sean@radiant.com"
51
+ @deliveries.first.cc.should == %w"sean@radiant.com"
52
+ end
53
+
54
+ it "should set the bcc field" do
55
+ do_deliver :bcc => "sean@radiant.com"
56
+ @deliveries.first.bcc.should == %w"sean@radiant.com"
57
+ end
58
+
59
+ it "should set the headers" do
60
+ do_deliver :headers => {'Reply-To' => 'sean@cribbs.com'}
61
+ @deliveries.first['Reply-To'].inspect.should match(/sean@cribbs.com/)
62
+ end
63
+
64
+ # Not sure that charset works, can see no effect in tests
65
+ it "should set the default character set to utf8" do
66
+ pending
67
+ do_deliver
68
+ @deliveries.first.charset.should == 'utf8'
69
+ end
70
+
71
+ it "should set the character set" do
72
+ pending
73
+ do_deliver :charset => 'iso8859-1'
74
+ @deliveries.first.charset.should == 'iso8859-1'
75
+ end
76
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,36 @@
1
+ unless defined? RADIANT_ROOT
2
+ ENV["RAILS_ENV"] = "test"
3
+ case
4
+ when ENV["RADIANT_ENV_FILE"]
5
+ require ENV["RADIANT_ENV_FILE"]
6
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
7
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
8
+ else
9
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
10
+ end
11
+ end
12
+ require "#{RADIANT_ROOT}/spec/spec_helper"
13
+
14
+ Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
15
+
16
+ if File.directory?(File.dirname(__FILE__) + "/matchers")
17
+ Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
18
+ end
19
+
20
+ Spec::Runner.configure do |config|
21
+ # config.use_transactional_fixtures = true
22
+ # config.use_instantiated_fixtures = false
23
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
24
+
25
+ # You can declare fixtures for each behaviour like this:
26
+ # describe "...." do
27
+ # fixtures :table_a, :table_b
28
+ #
29
+ # Alternatively, if you prefer to declare them only once, you can
30
+ # do so here, like so ...
31
+ #
32
+ # config.global_fixtures = :table_a, :table_b
33
+ #
34
+ # If you declare global fixtures, be aware that they will be declared
35
+ # for all of your examples, even those that don't use them.
36
+ end