lib/aws/rails/action_mailbox/rspec.rb



# frozen_string_literal: true

require 'aws/rails/action_mailbox/rspec/email'
require 'aws/rails/action_mailbox/rspec/subscription_confirmation'
require 'aws-sdk-sns'
require 'aws/rails/action_mailbox/sns_message_verifier'

module Aws
  module Rails
    module ActionMailbox
      # Include the `Aws::Rails::ActionMailbox::RSpec` extension in your tests, like so:
      # require 'aws/rails/action_mailbox/rspec'
      # RSpec.configure do |config|
      #   config.include Aws::Rails::ActionMailbox::RSpec
      # end
      # Then, in a request spec, use like so:
      # RSpec.describe 'amazon emails', type: :request do
      #   it 'delivers a subscription notification' do
      #     action_mailbox_ses_deliver_subscription_confirmation
      #     expect(response).to have_http_status :ok
      #   end

      #   it 'delivers an email notification' do
      #     action_mailbox_ses_deliver_email(mail: Mail.new(to: 'user@example.com'))
      #     expect(ActionMailbox::InboundEmail.last.mail.recipients).to eql ['user@example.com']
      #   end
      # end
      module RSpec
        def action_mailbox_ses_deliver_subscription_confirmation(options = {})
          subscription_confirmation = SubscriptionConfirmation.new(**options)
          stub_aws_sns_message_verifier(subscription_confirmation)
          stub_aws_sns_subscription_request

          post subscription_confirmation.url,
               params: subscription_confirmation.params,
               headers: subscription_confirmation.headers,
               as: :json
        end

        def action_mailbox_ses_deliver_email(options = {})
          email = Email.new(**options)
          stub_aws_sns_message_verifier(email)

          post email.url,
               params: email.params,
               headers: email.headers,
               as: :json
        end

        private

        def message_verifier(subscription_confirmation)
          instance_double(Aws::SNS::MessageVerifier, authentic?: subscription_confirmation.authentic?)
        end

        def stub_aws_sns_message_verifier(notification)
          allow(Aws::Rails::ActionMailbox::SnsMessageVerifier).to receive(:verifier) { message_verifier(notification) }
        end

        def stub_aws_sns_subscription_request
          allow(Net::HTTP).to receive(:get_response).and_call_original
          allow(Net::HTTP)
            .to receive(:get_response)
              .with(URI('http://example.com/subscribe')) { double(code: '200') }
        end
      end
    end
  end
end