123 lines
3.6 KiB
Ruby
123 lines
3.6 KiB
Ruby
require "test_helper"
|
|
|
|
class InvitationsMailerTest < ActionMailer::TestCase
|
|
setup do
|
|
@user = users(:alice)
|
|
@invitation_mail = InvitationsMailer.invite_user(@user)
|
|
end
|
|
|
|
test "should queue invitation email job" do
|
|
# Note: In test environment, deliver_later might not enqueue jobs the same way
|
|
# This test focuses on the mail delivery functionality
|
|
assert_nothing_raised do
|
|
InvitationsMailer.invite_user(@user).deliver_later
|
|
end
|
|
end
|
|
|
|
test "should deliver invitation email successfully" do
|
|
assert_emails 1 do
|
|
InvitationsMailer.invite_user(@user).deliver_now
|
|
end
|
|
end
|
|
|
|
test "should have correct email content" do
|
|
email = @invitation_mail
|
|
|
|
assert_equal "You're invited to join Clinch", email.subject
|
|
assert_equal [@user.email_address], email.to
|
|
assert_equal [], email.cc || []
|
|
assert_equal [], email.bcc || []
|
|
# From address is configured in ApplicationMailer
|
|
assert_not_nil email.from
|
|
assert email.from.is_a?(Array)
|
|
end
|
|
|
|
test "should include user data in email body" do
|
|
email = @invitation_mail
|
|
# Use text_part to get the readable content
|
|
email_text = email.text_part&.decoded || email.body.decoded
|
|
|
|
# Should include invitation-related text
|
|
assert_includes email_text, "invited"
|
|
assert_includes email_text, "Clinch"
|
|
end
|
|
|
|
test "should handle different user statuses" do
|
|
# Test with pending user
|
|
pending_user = users(:bob)
|
|
pending_user.status = :pending_invitation
|
|
pending_user.save!
|
|
|
|
assert_emails 1 do
|
|
InvitationsMailer.invite_user(pending_user).deliver_now
|
|
end
|
|
end
|
|
|
|
test "should queue multiple invitation emails" do
|
|
users = [users(:alice), users(:bob)]
|
|
|
|
# Test that multiple deliveries don't raise errors
|
|
assert_nothing_raised do
|
|
users.each { |user| InvitationsMailer.invite_user(user).deliver_later }
|
|
end
|
|
|
|
# Test synchronous delivery to verify functionality
|
|
assert_emails 2 do
|
|
users.each { |user| InvitationsMailer.invite_user(user).deliver_now }
|
|
end
|
|
end
|
|
|
|
test "should handle job with invalid user" do
|
|
# Test behavior when user doesn't exist
|
|
invalid_user_id = User.maximum(:id) + 1000
|
|
|
|
# This should not raise an error immediately (job is queued)
|
|
assert_nothing_raised do
|
|
assert_enqueued_jobs 1 do
|
|
# Create a mail with non-persisted user for testing
|
|
temp_user = User.new(id: invalid_user_id, email_address: "invalid@test.com")
|
|
InvitationsMailer.invite_user(temp_user).deliver_later
|
|
end
|
|
end
|
|
end
|
|
|
|
test "should respect mailer configuration" do
|
|
# Test that the mailer inherits from ApplicationMailer properly
|
|
assert InvitationsMailer < ApplicationMailer
|
|
assert_respond_to InvitationsMailer, :default
|
|
end
|
|
|
|
test "should handle concurrent email deliveries" do
|
|
# Simulate concurrent invitation deliveries
|
|
users = User.limit(3)
|
|
|
|
# Test that multiple deliveries don't raise errors
|
|
assert_nothing_raised do
|
|
users.each do |user|
|
|
InvitationsMailer.invite_user(user).deliver_later
|
|
end
|
|
end
|
|
|
|
# Test synchronous delivery to verify functionality
|
|
assert_emails users.count do
|
|
users.each do |user|
|
|
InvitationsMailer.invite_user(user).deliver_now
|
|
end
|
|
end
|
|
end
|
|
|
|
test "should have proper email headers" do
|
|
email = @invitation_mail
|
|
|
|
# Test common email headers
|
|
assert_not_nil email.message_id
|
|
assert_not_nil email.date
|
|
|
|
# Test content-type
|
|
if email.html_part
|
|
assert_includes email.content_type, "text/html"
|
|
elsif email.text_part
|
|
assert_includes email.content_type, "text/plain"
|
|
end
|
|
end
|
|
end |