Dorian
Dorian

Reputation: 9185

Content of bounced emails in tests for Action Mailbox

How can I check the content of a bounced email?

require "rails_helper"

RSpec.describe EventsMailbox do
  it "requires a current user" do
    expect(mail_processed).to have_bounced
    # here I would like to check the content of the bounced email
  end

  def mail
    Mail.new(
      from: "[email protected]",
      subject: "Some subject",
      body: "Some body"
    )
  end

  def mail_processed
    @mail_processed ||= process(mail)
  end
end

Upvotes: 1

Views: 178

Answers (1)

Dorian
Dorian

Reputation: 9185

Here is how I did it, the key was that perform_enqueued_jobs that allows emails to be retrieved from ActionMailer::Base.deliveries:

require "rails_helper"

RSpec.describe EventsMailbox do
  include ActiveJob::TestHelper

  around(:each) { |example| perform_enqueued_jobs { example.run } }

  it "requires a current user", focus: true do
    expect(mail_processed).to have_bounced
    expect(last_delivery.from).to eq(["[email protected]"])
    expect(last_delivery.to).to eq(["[email protected]"])
    expect(last_delivery_text).to(
      include("You need to be registered on Socializus")
    )
  end

  def mail
    Mail.new(
      from: "[email protected]",
      to: "[email protected]",
      subject: "Some subject",
      body: "Some body"
    )
  end

  def mail_processed
    @mail_processed ||= process(mail)
  end

  def last_delivery
    ActionMailer::Base.deliveries.last
  end

  def last_delivery_text
    return unless last_delivery
    text_part = last_delivery.parts.detect { _1.mime_type == "text/plain" }
    return unless text_part
    text_part.body.to_s
  end
end

Upvotes: 0

Related Questions