forked from rack/rack-contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspec_rack_mailexceptions.rb
99 lines (87 loc) · 2.84 KB
/
spec_rack_mailexceptions.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
require 'minitest/autorun'
require 'rack/mock'
begin
require './lib/rack/contrib/mailexceptions'
require './test/mail_settings.rb'
class TestError < RuntimeError
end
def test_exception
raise TestError, 'Suffering Succotash!'
rescue => boom
return boom
end
describe 'Rack::MailExceptions' do
before do
@app = lambda { |env| raise TestError, 'Why, I say' }
@env = Rack::MockRequest.env_for("/foo",
'FOO' => 'BAR',
:method => 'GET',
:input => 'THE BODY'
)
@smtp_settings = {
:server => 'example.com',
:domain => 'example.com',
:port => 500,
:authentication => :login,
:user_name => 'joe',
:password => 'secret'
}
end
specify 'yields a configuration object to the block when created' do
called = false
mailer =
Rack::MailExceptions.new(@app) do |mail|
called = true
mail.to '[email protected]'
mail.from '[email protected]'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
called.must_equal(true)
end
specify 'generates a Mail object with configured settings' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to '[email protected]'
mail.from '[email protected]'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
mail = mailer.send(:generate_mail, test_exception, @env)
mail.to.must_equal ['[email protected]']
mail.from.must_equal ['[email protected]']
mail.subject.must_equal '[ERROR] Suffering Succotash!'
mail.body.wont_equal(nil)
mail.body.to_s.must_match(/FOO:\s+"BAR"/)
mail.body.to_s.must_match(/^\s*THE BODY\s*$/)
end
specify 'filters HTTP_EXCEPTION body' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to '[email protected]'
mail.from '[email protected]'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
env = @env.dup
env['HTTP_AUTHORIZATION'] = 'Basic xyzzy12345'
mail = mailer.send(:generate_mail, test_exception, env)
mail.body.to_s.must_match /HTTP_AUTHORIZATION:\s+"Basic \*filtered\*"/
end
specify 'catches exceptions raised from app, sends mail, and re-raises' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to '[email protected]'
mail.from '[email protected]'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
mailer.enable_test_mode
lambda { mailer.call(@env) }.must_raise(TestError)
@env['mail.sent'].must_equal(true)
Mail::TestMailer.deliveries.length.must_equal(1)
end
end
rescue LoadError => boom
STDERR.puts "WARN: Skipping Rack::MailExceptions tests (mail not installed)"
end