Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ jobs:
bundler-cache: true

- name: Run tests
run: bundle exec rake spec
run: bundle exec rake test
15 changes: 4 additions & 11 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
plugins:
- rubocop-rake
require:
- rubocop-rspec
- rubocop-minitest

AllCops:
NewCops: disable

Metrics/MethodLength:
Max: 20
Max: 30

Capybara/RSpec/PredicateMatcher:
Enabled: false

RSpec/ExampleLength:
Max: 15

RSpec/MultipleExpectations:
Max: 5
Metrics/AbcSize:
Max: 25
4 changes: 2 additions & 2 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ gem 'pry'
gem 'rake', '~> 13.0'

gem 'mail'
gem 'rspec', '~> 3.0'
gem 'minitest', '~> 5.0'

gem 'rubocop', '~> 1.21'
gem 'rubocop-minitest', '~> 0.35', require: false
gem 'rubocop-rake', '~> 0.6', require: false
gem 'rubocop-rspec', '~> 2.5', require: false
10 changes: 7 additions & 3 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
# frozen_string_literal: true

require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
require 'rake/testtask'

RSpec::Core::RakeTask.new(:spec)
Rake::TestTask.new(:test) do |t|
t.libs << 'test'
t.libs << 'lib'
t.test_files = FileList['test/**/*_test.rb']
end

require 'rubocop/rake_task'

RuboCop::RakeTask.new

task default: %i[spec rubocop]
task default: %i[test rubocop]
2 changes: 1 addition & 1 deletion lib/safety_mailer/safety_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def prepare_sendgrid_delivery(addresses)
end

def log(msg)
Rails.logger.warn(msg) if defined?(Rails)
Rails.logger.warn(msg) if defined?(Rails) && Rails.respond_to?(:logger)
end
end
end
115 changes: 0 additions & 115 deletions spec/safety_mailer/carrier_spec.rb

This file was deleted.

9 changes: 0 additions & 9 deletions spec/safety_mailer_spec.rb

This file was deleted.

20 changes: 0 additions & 20 deletions spec/spec_helper.rb

This file was deleted.

112 changes: 112 additions & 0 deletions test/safety_mailer/carrier_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# frozen_string_literal: true

require 'test_helper'
require 'mail'
require 'json'

module SafetyMailer
class CarrierTest < Minitest::Test
class MockDeliveryMethod
attr_reader :delivered_mail, :called

def initialize
@delivered_mail = nil
@called = false
end

def deliver!(mail)
@delivered_mail = mail
@called = true
end
end

def test_no_recipient_is_whitelisted_suppresses_delivery
mock_delivery = MockDeliveryMethod.new
Mail::SMTP.stub(:new, mock_delivery) do
message = Mail.new do
from 'safety@example.com'
to 'mailer@example.com, pop@oozou.com'
subject 'Angry Birds Star Wars'
body 'Lorem ipsum dolor sit amet'
end

SafetyMailer::Carrier.new({ allowed_matchers: [/@unrelated\.com$/] }).deliver!(message)

refute mock_delivery.called, 'Expected delivery to be suppressed'
end
end

def test_allows_mail_to_go_only_to_whitelisted_recipients
mock_delivery = MockDeliveryMethod.new

Mail::SMTP.stub(:new, mock_delivery) do
message = Mail.new do
from 'safety@example.com'
to 'mailer@example.com, pop@oozou.com'
subject 'Angry Birds Star Wars'
body 'Lorem ipsum dolor sit amet'
end

SafetyMailer::Carrier.new({ allowed_matchers: [/@oozou\.com$/] }).deliver!(message)

assert mock_delivery.called, 'Expected delivery to be called'
refute_includes mock_delivery.delivered_mail.to, 'mailer@example.com'
assert_includes mock_delivery.delivered_mail.to, 'pop@oozou.com'
end
end

def test_ignores_sendgrid_headers_strips_out_unsafe_recipients
mock_delivery = MockDeliveryMethod.new

Mail::SMTP.stub(:new, mock_delivery) do
message = Mail.new do
from 'safety@example.com'
to 'mailer@example.com, pop@oozou.com'
subject 'Angry Birds Star Wars'
body 'Lorem ipsum dolor sit amet'
end
message['X-SMTPAPI'] = '{}'

SafetyMailer::Carrier.new(allowed_matchers: [/@oozou\.com$/]).deliver!(message)

assert mock_delivery.called, 'Expected delivery to be called'
refute_includes mock_delivery.delivered_mail.to, 'mailer@example.com'
assert_includes mock_delivery.delivered_mail.to, 'pop@oozou.com'
end
end

def test_strips_out_unsafe_recipients_and_corresponding_substitutions
mock_delivery = MockDeliveryMethod.new

Mail::SMTP.stub(:new, mock_delivery) do
message = Mail.new do
from 'safety@example.com'
subject 'Lunch Order'
body 'You like -food-'
end
sendgrid = {
'to' => ['mailer@example.com', 'pop@oozou.com'],
'sub' => { '-food-' => %w[bagels sushi] }
}
message['X-SMTPAPI'] = JSON.generate(sendgrid)

SafetyMailer::Carrier.new(allowed_matchers: [/@oozou\.com$/]).deliver!(message)

assert mock_delivery.called, 'Expected delivery to be called'
parsed = JSON.parse(mock_delivery.delivered_mail['X-SMTPAPI'].value)
recipients = parsed['to']
refute_includes recipients, 'mailer@example.com'
assert_includes recipients, 'pop@oozou.com'

substitutions = parsed['sub']
refute_includes substitutions['-food-'], 'bagels'
assert_includes substitutions['-food-'], 'sushi'
end
end

def test_allows_initialization_with_custom_delivery_method
carrier = SafetyMailer::Carrier.new(delivery_method: :faker)
assert_instance_of SafetyMailer::Carrier, carrier
end
end
end
9 changes: 9 additions & 0 deletions test/safety_mailer_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

require 'test_helper'

class SafetyMailerTest < Minitest::Test
def test_has_version_number
refute_nil SafetyMailer::VERSION
end
end
File renamed without changes.
9 changes: 9 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

require 'minitest/autorun'
require 'safety_mailer'
require 'pry'
require 'support/fake_mailer'
require 'action_mailer'

ActionMailer::Base.add_delivery_method :faker, FakeMailer