Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
tree: df0baecf41
Fetching contributors…

Cannot retrieve contributors at this time

170 lines (151 sloc) 5.261 kB
require 'test/spec'
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
context 'Rack::MailExceptions' do
setup 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 'foo@example.org'
mail.from 'bar@example.org'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
called.should.be == true
end
specify 'generates a TMail object with configured settings' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to 'foo@example.org'
mail.from 'bar@example.org'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
mail = mailer.send(:generate_mail, test_exception, @env)
mail.to.should.equal ['foo@example.org']
mail.from.should.equal ['bar@example.org']
mail.subject.should.equal '[ERROR] Suffering Succotash!'
mail.body.should.not.be.nil
mail.body.should.be =~ /FOO:\s+"BAR"/
mail.body.should.be =~ /^\s*THE BODY\s*$/
end
specify 'catches exceptions raised from app, sends mail, and re-raises' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to 'foo@example.org'
mail.from 'bar@example.org'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings
end
lambda { mailer.call(@env) }.should.raise(TestError)
@env['mail.sent'].should.be == true
end
if TEST_SMTP && ! TEST_SMTP.empty?
specify 'sends mail' do
mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.config.merge! TEST_SMTP
end
lambda { mailer.call(@env) }.should.raise(TestError)
@env['mail.sent'].should.be == true
end
else
STDERR.puts 'WARN: Skipping SMTP tests (edit test/mail_settings.rb to enable)'
end
context 'for tls enabled smtp' do
setup do
@smtp_settings.merge!(TEST_SMTP_TLS)
@mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to TEST_SMTP_TLS.values_at(:user_name, :domain).join('@')
mail.from 'bar@example.org'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings.merge( :enable_starttls_auto => true)
end
end
describe 'with :enable_starttls_auto set to :auto' do
specify 'sends mail' do
@mailer.smtp.merge(:enable_starttls_auto => :auto)
lambda { @mailer.call(@env) }.should.raise(TestError)
@env['mail.sent'].should.be true
end
end
describe 'with :enable_starttls_auto set to true' do
specify 'sends mail' do
@mailer.smtp.merge(:enable_starttls_auto => true)
lambda { @mailer.call(@env) }.should.raise(TestError)
@env['mail.sent'].should.be true
end
end
end if defined?(TEST_SMTP_TLS)
describe 'for tls enabled fake smtp' do
class FakeSMTP
def initialize(*args); @@_tls = nil; end
def start(*args); end
def enable_starttls_auto; @@_tls = :auto; end
def enable_starttls; @@_tls = true; end
def send_message(*args); end
def self.tls; @@_tls; end
end
setup do
Rack::MailExceptions.class_eval { def service; FakeSMTP; end}
@mailer =
Rack::MailExceptions.new(@app) do |mail|
mail.to 'foo@example.org'
mail.from 'bar@example.org'
mail.subject '[ERROR] %s'
mail.smtp @smtp_settings.merge( :server => 'server.com')
end
end
context 'with :enable_starttls_auto unset' do
specify 'sends mail' do
@mailer.smtp[:enable_starttls_auto] = nil
lambda { @mailer.call(@env) }.should.raise(TestError)
FakeSMTP.tls.should.be nil
end
end
context 'with :enable_starttls_auto set to true' do
specify 'sends mail' do
@mailer.smtp[:enable_starttls_auto] = true
lambda { @mailer.call(@env) }.should.raise(TestError)
FakeSMTP.tls.should == true
end
end
context 'with :enable_starttls_auto set to :auto' do
specify 'sends mail' do
@mailer.smtp[:enable_starttls_auto] = :auto
lambda { @mailer.call(@env) }.should.raise(TestError)
FakeSMTP.tls.should == :auto
end
end
end
end
rescue LoadError => boom
STDERR.puts "WARN: Skipping Rack::MailExceptions tests (mail not installed)"
end
Jump to Line
Something went wrong with that request. Please try again.