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
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ gemspec
gem 'actionmailer'
gem 'irb'
gem 'pry'
gem 'rails', '~> 7.0'
gem 'rake', '~> 13.0'

gem 'mail'
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require 'rake/testtask'
Rake::TestTask.new(:test) do |t|
t.libs << 'test'
t.libs << 'lib'
t.test_files = FileList['test/**/*_test.rb']
t.test_files = FileList['test/**/*_test.rb', 'test/*_test.rb']
end

require 'rubocop/rake_task'
Expand Down
6 changes: 6 additions & 0 deletions test/dummy/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'rails', '~> 7.0'
gem 'safety_mailer', path: '../..'
13 changes: 13 additions & 0 deletions test/dummy/app/mailers/message_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class MessageMailer < ActionMailer::Base
default from: 'system@example.com'

def time_notification(address)
@current_time = Time.now.strftime('%Y-%m-%d %H:%M:%S')
mail(
to: address,
subject: 'Current Time Notification'
)
end
end
13 changes: 13 additions & 0 deletions test/dummy/app/models/message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class Message
attr_reader :address

def initialize(address)
@address = address
end

def send_time_notification
MessageMailer.time_notification(address).deliver_now
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Hello,

The current time is: <%= @current_time %>

This is an automated message from the SafetyMailer test system.

Best regards,
Test System
5 changes: 5 additions & 0 deletions test/dummy/config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# frozen_string_literal: true

require_relative 'config/environment'

run Rails.application
23 changes: 23 additions & 0 deletions test/dummy/config/application.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

require 'rails'
require 'action_mailer/railtie'

module Dummy
class Application < Rails::Application
config.load_defaults 7.0

# Configure ActionMailer
config.action_mailer.delivery_method = :test
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true

# Minimal configuration
config.eager_load = false
config.consider_all_requests_local = true
config.cache_classes = false

# Configure secret key base
config.secret_key_base = 'test_key_base_for_dummy_app'
end
end
5 changes: 5 additions & 0 deletions test/dummy/config/environment.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# frozen_string_literal: true

require_relative 'application'

Rails.application.initialize!
9 changes: 9 additions & 0 deletions test/dummy/config/initializers/safety_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

# Configure SafetyMailer for the dummy Rails app
ActionMailer::Base.add_delivery_method :safety_mailer, SafetyMailer::Carrier, {
allowed_matchers: [/@safe\.example\.com$/, /@trusted\.org$/]
}

# Use SafetyMailer as the delivery method
ActionMailer::Base.delivery_method = :safety_mailer
5 changes: 5 additions & 0 deletions test/dummy/config/routes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# frozen_string_literal: true

Rails.application.routes.draw do
# Minimal routes file - no routes needed for this test
end
73 changes: 73 additions & 0 deletions test/integration_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# frozen_string_literal: true

require 'test_helper'
require 'rails'

# Add the dummy app to load path
$LOAD_PATH.unshift File.expand_path('dummy', __dir__)

# Load the dummy Rails application
require_relative 'dummy/config/environment'

class IntegrationTest < Minitest::Test
def setup
# Clear any previous deliveries
ActionMailer::Base.deliveries.clear

# Use test delivery method for ActionMailer to capture emails
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true

@original_method = ActionMailer::Base.delivery_method
ActionMailer::Base.delivery_method = :safety_mailer
ActionMailer::Base.safety_mailer_settings = {
delivery_method: @original_method,
allowed_matchers: [/@safe\.example\.com$/, /@trusted\.org$/]
}
end

def delivered_messages
ActionMailer::Base.deliveries
end

def test_rails_integration_allows_safe_domain_emails
# Test that safe domain email goes through
message = Message.new('user@safe.example.com')
message.send_time_notification

assert_equal 1, delivered_messages.length, 'Expected safe domain email to be delivered'
delivered_mail = delivered_messages.first
assert_includes delivered_mail.to, 'user@safe.example.com'
assert_equal 'Current Time Notification', delivered_mail.subject
assert_match(/The current time is:/, delivered_mail.body.to_s)
ensure
ActionMailer::Base.delivery_method = @original_method
end

def test_rails_integration_blocks_unsafe_domain_emails
# Test that unsafe domain email is blocked
message = Message.new('user@unsafe.example.com')
message.send_time_notification

assert_equal 0, delivered_messages.length, 'Expected unsafe domain email to be blocked'
ensure
ActionMailer::Base.delivery_method = @original_method
end

def test_rails_integration_allows_multiple_safe_domains
# Test both allowed domains
message1 = Message.new('user@safe.example.com')
message1.send_time_notification

message2 = Message.new('admin@trusted.org')
message2.send_time_notification

assert_equal 2, delivered_messages.length, 'Expected both safe domain emails to be delivered'

addresses = delivered_messages.flat_map(&:to)
assert_includes addresses, 'user@safe.example.com'
assert_includes addresses, 'admin@trusted.org'
ensure
ActionMailer::Base.delivery_method = @original_method
end
end
1 change: 0 additions & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

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

Expand Down