メインコンテンツまでスキップ

アクションメールボックスの仕様

メールボックスの仕様は、ActiveMailbox::TestHelperで利用可能なアサーションとは異なる代替アサーションを提供し、メールのルーティング、配信、バウンス、または失敗の動作をアサートするのに役立ちます。

メールボックスの仕様は、type: :mailboxとマークされるか、config.infer_spec_type_from_file_location!を設定している場合は、spec/mailboxesに配置することで示されます。

メールボックスの仕様では、次のことができます:

  • process(mail_or_attributes) - テスト対象のメールボックスにメールを直接processするためのメソッドです。
  • receive_inbound_email(mail_or_attributes) - テスト対象のメールボックスに着信メールがルーティングされるかどうかをアサートするためのマッチャーです。
  • have_been_delivered - 着信メールオブジェクトが配信されたかどうかをアサートするためのマッチャーです。
  • have_bounced - 着信メールオブジェクトがバウンスしたかどうかをアサートするためのマッチャーです。
  • have_failed - 着信メールオブジェクトが失敗したかどうかをアサートするためのマッチャーです。

背景

アクションメールボックスが利用可能であると仮定します。

メールの正しいルーティングをテストする

次の内容で「app/mailboxes/application_mailbox.rb」という名前のファイルが存在するとします:

class ApplicationMailbox < ActionMailbox::Base
routing (/^replies@/i) => :inbox
end

また、「app/mailboxes/inbox_mailbox.rb」という名前のファイルが存在するとします:

class InboxMailbox < ApplicationMailbox
def process
case mail.subject
when (/^\[\d*\]/i)
# ok
when (/^\[\w*\]/i)
bounced!
else
raise "Invalid email subject"
end
end
end

さらに、「spec/mailboxes/inbox_mailbox_spec.rb」という名前のファイルが存在するとします:

require 'rails_helper'

RSpec.describe InboxMailbox, type: :mailbox do
it "route email to properly mailbox" do
expect(InboxMailbox)
.to receive_inbound_email(to: "replies@example.com")
end

it "marks email as delivered when number tag in subject is valid" do
mail = Mail.new(
from: "replies@example.com",
subject: "[141982763] support ticket"
)
mail_processed = process(mail)

expect(mail_processed).to have_been_delivered
end

it "marks email as bounced when number tag in subject is invalid" do
mail = Mail.new(
from: "replies@example.com",
subject: "[111X] support ticket"
)
mail_processed = process(mail)

expect(mail_processed).to have_bounced
end

it "marks email as failed when subject is invalid" do
mail = Mail.new(
from: "replies@example.com",
subject: "INVALID"
)

expect {
expect(process(mail)).to have_failed
}.to raise_error(/Invalid email subject/)
end
end

「rspec spec/mailboxes/inbox_mailbox_spec.rb」と実行した場合、

例がパスするはずです。