rspec-railsactionmailer

How to test that all ActionMailer preview actions render/do not fail?


My app has a lot of mailer actions and previews and I would like to automatically test that all listed mailer preview links respond with HTTP=200/do not fail rendering.

This should solve the problem of duplication between mailer preview actions and specs.

How to do it?


Solution

  • The following solution is not the most optimal(e.g. additional request per each mailer + requires rack_test) but it works:

    # cat spec/features/mailer_preview_spec.rb
    
    require 'rails_helper'
    
    RSpec.describe 'MailerPreview', type: :feature do
      before do
        # Assuming you have the Capybara setup
        Capybara.default_driver = :rack_test
      end
    
      it 'opens /rails/mailers and checks each link' do
        visit '/rails/mailers'
        expect(page.status_code).to eq(200)
    
        links = page.all('a').map { |link| link[:href] }
        links.each do |link|
          expect {
            visit link
          }.not_to raise_error, "Expected #{link} not to fail"
        end
      end
    end
    

    As a reminder, make sure config.action_mailer.show_previews = true is set in test environment for this to work.