---
generated_at: 2026-03-01 10:30:00
metrics:
  claims_total: 113
  claims_with_evidence: 113
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：actionmailbox単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：113 / 113、根拠なし：0
- 優先レビュー（高）
  1. なし（全テストケースに根拠あり）

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `actionmailbox/lib/action_mailbox.rb`
- E-02: `actionmailbox/lib/action_mailbox/base.rb`
- E-03: `actionmailbox/lib/action_mailbox/router.rb`
- E-04: `actionmailbox/lib/action_mailbox/router/route.rb`
- E-05: `actionmailbox/lib/action_mailbox/relayer.rb`
- E-06: `actionmailbox/lib/action_mailbox/callbacks.rb`
- E-07: `actionmailbox/lib/action_mailbox/routing.rb`
- E-08: `actionmailbox/lib/action_mailbox/test_helper.rb`
- E-09: `actionmailbox/lib/action_mailbox/test_case.rb`
- E-10: `actionmailbox/lib/action_mailbox/mail_ext/addresses.rb`
- E-11: `actionmailbox/lib/action_mailbox/mail_ext/address_equality.rb`
- E-12: `actionmailbox/lib/action_mailbox/mail_ext/address_wrapping.rb`
- E-13: `actionmailbox/lib/action_mailbox/mail_ext/recipients.rb`
- E-14: `actionmailbox/lib/action_mailbox/mail_ext/from_source.rb`
- E-15: `actionmailbox/lib/action_mailbox/gem_version.rb`
- E-16: `actionmailbox/lib/action_mailbox/version.rb`
- E-17: `actionmailbox/lib/action_mailbox/deprecator.rb`
- E-18: `actionmailbox/app/models/action_mailbox/inbound_email.rb`
- E-19: `actionmailbox/app/models/action_mailbox/inbound_email/message_id.rb`
- E-20: `actionmailbox/app/models/action_mailbox/inbound_email/incineratable.rb`
- E-21: `actionmailbox/app/models/action_mailbox/inbound_email/incineratable/incineration.rb`
- E-22: `actionmailbox/app/models/action_mailbox/inbound_email/routable.rb`
- E-23: `actionmailbox/app/jobs/action_mailbox/incineration_job.rb`
- E-24: `actionmailbox/app/jobs/action_mailbox/routing_job.rb`

## 3) Claims と根拠の対応（レビューの主戦場）

### ActionMailbox::Base（E-02）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | receive: 有効なInboundEmailを受信して処理されること | E-02 L75-77 `def self.receive(inbound_email)` | ○ |
| C-02 | initialize: InboundEmailでMailboxが初期化されること | E-02 L79-81 `def initialize(inbound_email)` | ○ |
| C-03 | perform_processing: コールバックと共に処理が実行されること | E-02 L83-94 `def perform_processing` | ○ |
| C-04 | perform_processing: 処理完了後にdelivered状態になること | E-02 L127 `inbound_email.delivered! unless inbound_email.bounced?` | ○ |
| C-05 | perform_processing: 例外発生時にfailed状態になること | E-02 L128-130 `inbound_email.failed!` | ○ |
| C-06 | perform_processing: rescue_with_handlerで例外がハンドルされること | E-02 L92 `rescue_with_handler(exception)` | ○ |
| C-07 | process: サブクラスでオーバーライド可能であること | E-02 L96-98 `def process` | ○ |
| C-08 | finished_processing?: delivered状態でtrueを返すこと | E-02 L100-102 `inbound_email.delivered? \|\| inbound_email.bounced?` | ○ |
| C-09 | finished_processing?: bounced状態でtrueを返すこと | E-02 L100-102 | ○ |
| C-10 | finished_processing?: processing状態でfalseを返すこと | E-02 L100-102 | ○ |
| C-11 | bounce_with: メッセージがキューに入りbounced状態になること | E-02 L105-108 `def bounce_with(message)` | ○ |
| C-12 | bounce_now_with: メッセージが即座に送信されbounced状態になること | E-02 L110-114 `def bounce_now_with(message)` | ○ |

### ActionMailbox::Router（E-03）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | initialize: 空のルート配列で初期化されること | E-03 L11-13 `def initialize @routes = []` | ○ |
| C-14 | add_routes: 複数のルートが追加されること | E-03 L15-19 `def add_routes(routes)` | ○ |
| C-15 | add_route: 単一のルートが追加されること | E-03 L21-23 `def add_route(address, to:)` | ○ |
| C-16 | route: マッチするMailboxで処理されること | E-03 L25-33 `def route(inbound_email)` | ○ |
| C-17 | route: マッチしない場合RoutingErrorが発生すること | E-03 L29-31 `raise RoutingError` | ○ |
| C-18 | mailbox_for: マッチするMailboxクラスが返却されること | E-03 L35-37 `def mailbox_for(inbound_email)` | ○ |
| C-19 | mailbox_for: マッチしない場合nilが返却されること | E-03 L36 `&.mailbox_class` | ○ |

### ActionMailbox::Router::Route（E-04）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | initialize: アドレスとMailbox名で初期化されること | E-04 L10-14 `def initialize(address, to:)` | ○ |
| C-21 | initialize: 無効なアドレス型でArgumentErrorが発生すること | E-04 L36-39 `raise ArgumentError` | ○ |
| C-22 | match?: :allで常にtrueを返すこと | E-04 L18-19 `when :all then true` | ○ |
| C-23 | match?: 文字列アドレスで大文字小文字無視でマッチすること | E-04 L20-21 `address.casecmp?(recipient)` | ○ |
| C-24 | match?: 正規表現でマッチすること | E-04 L22-23 `address.match?(recipient)` | ○ |
| C-25 | match?: Procでマッチ判定できること | E-04 L24-25 `address.call(inbound_email)` | ○ |
| C-26 | match?: match?メソッドを持つオブジェクトでマッチできること | E-04 L26-27 `address.match?(inbound_email)` | ○ |
| C-27 | mailbox_class: Mailboxクラスが正しく解決されること | E-04 L31-33 `mailbox_name.to_s.camelize...constantize` | ○ |
| C-28 | mailbox_class: 存在しないMailboxクラスでNameErrorが発生すること | E-04 L32 `.constantize` | ○ |

### ActionMailbox::Relayer（E-05）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 | initialize: URL、ユーザー名、パスワードで初期化されること | E-05 L32-34 `def initialize(url:, username:, password:)` | ○ |
| C-30 | initialize: ユーザー名省略時にデフォルト値が設定されること | E-05 L32 `username: "actionmailbox"` | ○ |
| C-31 | relay: 成功時に2.0.0のResultが返却されること | E-05 L38-39 `Result.new "2.0.0"` | ○ |
| C-32 | relay: 認証エラー時に4.7.0のResultが返却されること | E-05 L40-41 `Result.new "4.7.0"` | ○ |
| C-33 | relay: その他のHTTPエラー時に4.0.0のResultが返却されること | E-05 L42-43 `Result.new "4.0.0"` | ○ |
| C-34 | relay: ネットワークエラー時に4.4.2のResultが返却されること | E-05 L45-46 `Result.new "4.4.2", "Network error"` | ○ |
| C-35 | relay: タイムアウト時に4.4.2のResultが返却されること | E-05 L47-48 `Result.new "4.4.2", "Timed out"` | ○ |
| C-36 | Result#success?: 成功コードでtrueを返すこと | E-05 L10-12 `def success? !failure?` | ○ |
| C-37 | Result#success?: 失敗コードでfalseを返すこと | E-05 L10-12 | ○ |
| C-38 | Result#failure?: 一時的エラーでtrueを返すこと | E-05 L14-16 `def failure?` | ○ |
| C-39 | Result#failure?: 恒久的エラーでtrueを返すこと | E-05 L14-16 | ○ |
| C-40 | Result#transient_failure?: 4.x.xコードでtrueを返すこと | E-05 L18-20 `status_code.start_with?("4.")` | ○ |
| C-41 | Result#permanent_failure?: 5.x.xコードでtrueを返すこと | E-05 L22-24 `status_code.start_with?("5.")` | ○ |

### ActionMailbox::Callbacks（E-06）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-42 | before_processing: beforeコールバックが登録されること | E-06 L23-25 `def before_processing` | ○ |
| C-43 | after_processing: afterコールバックが登録されること | E-06 L27-29 `def after_processing` | ○ |
| C-44 | around_processing: aroundコールバックが登録されること | E-06 L31-33 `def around_processing` | ○ |
| C-45 | TERMINATOR: finished_processing?がtrueの場合チェーンが終了すること | E-06 L13-16 `TERMINATOR = ->(mailbox, chain)` | ○ |

### ActionMailbox::Routing（E-07）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | routing: ルートがRouterに追加されること | E-07 L13-15 `def routing(routes)` | ○ |
| C-47 | route: InboundEmailがルーティングされること | E-07 L17-19 `def route(inbound_email)` | ○ |
| C-48 | mailbox_for: Mailboxクラスが取得されること | E-07 L21-23 `def mailbox_for(inbound_email)` | ○ |

### ActionMailbox::TestHelper（E-08）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | create_inbound_email_from_fixture: fixtureからInboundEmailが作成されること | E-08 L9-11 `def create_inbound_email_from_fixture` | ○ |
| C-50 | create_inbound_email_from_fixture: status指定でInboundEmailが作成されること | E-08 L9 `status: :processing` | ○ |
| C-51 | create_inbound_email_from_mail: MailオプションからInboundEmailが作成されること | E-08 L63-69 `def create_inbound_email_from_mail` | ○ |
| C-52 | create_inbound_email_from_mail: ブロックでマルチパートメールが作成されること | E-08 L64 `Mail.new(mail_options, &block)` | ○ |
| C-53 | create_inbound_email_from_mail: Bccヘッダがエンコードされること | E-08 L66 `mail[:bcc].include_in_headers = true` | ○ |
| C-54 | create_inbound_email_from_source: raw sourceからInboundEmailが作成されること | E-08 L72-74 `def create_inbound_email_from_source` | ○ |
| C-55 | receive_inbound_email_from_fixture: fixtureからInboundEmailが作成されルーティングされること | E-08 L79-81 `def receive_inbound_email_from_fixture` | ○ |
| C-56 | receive_inbound_email_from_mail: MailオプションからInboundEmailが作成されルーティングされること | E-08 L85-87 `def receive_inbound_email_from_mail` | ○ |
| C-57 | receive_inbound_email_from_source: raw sourceからInboundEmailが作成されルーティングされること | E-08 L91-93 `def receive_inbound_email_from_source` | ○ |

### Mail拡張（E-10, E-11, E-12, E-13, E-14）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-58 | from_address: Fromアドレスが取得されること | E-10 L5-7 `def from_address` | ○ |
| C-59 | from_address: Fromが未設定の場合nilが返却されること | E-10 L6 `&.addresses&.first` | ○ |
| C-60 | reply_to_address: Reply-Toアドレスが取得されること | E-10 L9-11 `def reply_to_address` | ○ |
| C-61 | recipients_addresses: 全受信者アドレスが取得されること | E-10 L13-15 `def recipients_addresses` | ○ |
| C-62 | to_addresses: Toアドレス配列が取得されること | E-10 L17-19 `def to_addresses` | ○ |
| C-63 | cc_addresses: Ccアドレス配列が取得されること | E-10 L21-23 `def cc_addresses` | ○ |
| C-64 | bcc_addresses: Bccアドレス配列が取得されること | E-10 L25-27 `def bcc_addresses` | ○ |
| C-65 | x_original_to_addresses: X-Original-Toアドレス配列が取得されること | E-10 L29-31 `def x_original_to_addresses` | ○ |
| C-66 | x_forwarded_to_addresses: X-Forwarded-Toアドレス配列が取得されること | E-10 L33-35 `def x_forwarded_to_addresses` | ○ |
| C-67 | ==: 同じアドレスでtrueを返すこと | E-11 L5-7 `def ==(other_address)` | ○ |
| C-68 | ==: 異なるアドレスでfalseを返すこと | E-11 L6 `to_s == other_address.to_s` | ○ |
| C-69 | ==: Mail::Address以外との比較でfalseを返すこと | E-11 L6 `other_address.is_a?(Mail::Address)` | ○ |
| C-70 | wrap: 文字列からMail::Addressが作成されること | E-12 L5-10 `def self.wrap(address)` | ○ |
| C-71 | wrap: Mail::Addressがそのまま返却されること | E-12 L9 `address.is_a?(Mail::Address) ? address` | ○ |
| C-72 | recipients: 全受信者が文字列配列で取得されること | E-13 L5-8 `def recipients` | ○ |
| C-73 | recipients: 受信者が空の場合空配列が返却されること | E-13 L6 `Array(to) + Array(cc)...` | ○ |
| C-74 | from_source: sourceからMailオブジェクトが作成されること | E-14 L4-6 `def self.from_source(source)` | ○ |
| C-75 | from_source: CRLFが正しく変換されること | E-14 L5 `Mail::Utilities.binary_unsafe_to_crlf` | ○ |

### ActionMailbox::InboundEmail（E-18）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-76 | mail: Mailオブジェクトがパースされキャッシュされること | E-18 L33-35 `def mail @mail \|\|=` | ○ |
| C-77 | source: raw_emailの内容が取得されキャッシュされること | E-18 L37-39 `def source @source \|\|=` | ○ |
| C-78 | processed?: delivered状態でtrueを返すこと | E-18 L41-43 `def processed?` | ○ |
| C-79 | processed?: failed状態でtrueを返すこと | E-18 L42 `failed?` | ○ |
| C-80 | processed?: bounced状態でtrueを返すこと | E-18 L42 `bounced?` | ○ |
| C-81 | processed?: pending状態でfalseを返すこと | E-18 L41-43 | ○ |
| C-82 | instrumentation_payload: 計測用ペイロードが返却されること | E-18 L45-51 `def instrumentation_payload` | ○ |

### ActionMailbox::InboundEmail::MessageId（E-19）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | create_and_extract_message_id!: Message-IDが抽出されInboundEmailが作成されること | E-19 L16-24 `def create_and_extract_message_id!` | ○ |
| C-84 | create_and_extract_message_id!: Message-IDがない場合に生成されること | E-19 L18 `generate_missing_message_id` | ○ |
| C-85 | create_and_extract_message_id!: 重複Message-IDの場合nilが返却されること | E-19 L22-23 `rescue ActiveRecord::RecordNotUnique nil` | ○ |
| C-86 | create_and_extract_message_id!: message_checksumが計算されること | E-19 L17 `OpenSSL::Digest::SHA1.hexdigest(source)` | ○ |

### ActionMailbox::InboundEmail::Incineratable（E-20, E-21）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-87 | incinerate_later: IncinerationJobがスケジュールされること | E-20 L13-15 `def incinerate_later` | ○ |
| C-88 | incinerate: Incinerationが実行されること | E-20 L17-19 `def incinerate` | ○ |
| C-89 | after_update_commit: 処理完了時にincinerate_laterが呼ばれること | E-20 L10 `after_update_commit :incinerate_later` | ○ |
| C-90 | after_update_commit: incinerate=falseの場合呼ばれないこと | E-20 L10 `ActionMailbox.incinerate &&` | ○ |
| C-91 | Incineration#initialize: InboundEmailで初期化されること | E-21 L9-11 `def initialize(inbound_email)` | ○ |
| C-92 | Incineration#run: 条件を満たす場合にdestroyが呼ばれること | E-21 L13-15 `@inbound_email.destroy! if due? && processed?` | ○ |
| C-93 | Incineration#run: 未処理の場合destroyが呼ばれないこと | E-21 L14 `if due? && processed?` | ○ |
| C-94 | Incineration#run: 期限前の場合destroyが呼ばれないこと | E-21 L14 `if due? && processed?` | ○ |

### ActionMailbox::InboundEmail::Routable（E-22）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-95 | route_later: RoutingJobがキューに入ること | E-22 L16-18 `def route_later` | ○ |
| C-96 | route: ApplicationMailboxでルーティングされること | E-22 L21-23 `def route` | ○ |
| C-97 | after_create_commit: pending状態で作成時にroute_laterが呼ばれること | E-22 L12 `after_create_commit :route_later, if: :pending?` | ○ |
| C-98 | after_create_commit: pending以外の状態で作成時にroute_laterが呼ばれないこと | E-22 L12 `if: :pending?` | ○ |

### ActionMailbox::IncinerationJob（E-23）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-99 | schedule: incinerate_after後に実行がスケジュールされること | E-23 L17-19 `def self.schedule` | ○ |
| C-100 | perform: incinerateが呼ばれること | E-23 L21-23 `def perform` | ○ |
| C-101 | perform: RecordNotFoundで自動discardされること | E-23 L15 `discard_on ActiveRecord::RecordNotFound` | ○ |

### ActionMailbox::RoutingJob（E-24）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-102 | perform: routeが呼ばれること | E-24 L9-11 `def perform` | ○ |

### ActionMailbox モジュール（E-01, E-15, E-16, E-17）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-103 | gem_version: Gem::Versionオブジェクトが返却されること | E-15 L5-7 `def self.gem_version` | ○ |
| C-104 | version: gem_versionと同じ値が返却されること | E-16 L7-9 `def self.version gem_version` | ○ |
| C-105 | deprecator: ActiveSupport::Deprecationインスタンスが返却されること | E-17 L4-6 `def self.deprecator` | ○ |
| C-106 | deprecator: 同一インスタンスがキャッシュされること | E-17 L5 `@deprecator \|\|=` | ○ |
| C-107 | TestCase: TestHelperがincludeされていること | E-09 L8 `include ActionMailbox::TestHelper` | ○ |
| C-108 | ingress: ingressアクセサが機能すること | E-01 L20 `mattr_accessor :ingress` | ○ |
| C-109 | logger: loggerアクセサが機能すること | E-01 L21 `mattr_accessor :logger` | ○ |
| C-110 | incinerate: incinerateのデフォルト値がtrueであること | E-01 L22 `mattr_accessor :incinerate, default: true` | ○ |
| C-111 | incinerate_after: incinerate_afterのデフォルト値が30.daysであること | E-01 L23 `mattr_accessor :incinerate_after, default: 30.days` | ○ |
| C-112 | queues: queuesのデフォルト値が空ハッシュであること | E-01 L24 `mattr_accessor :queues, default: {}` | ○ |
| C-113 | storage_service: storage_serviceアクセサが機能すること | E-01 L25 `mattr_accessor :storage_service` | ○ |

## 4) 不足情報（Unknown / Missing）
- なし
  - 全てのテストケースはソースコードから直接導出されており、根拠が確認できています

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースに根拠があり、ソースコードとの整合性が確認されています

## 6) レビュアーチェックリスト（最小）
- [ ] 高優先度テストケース（UT-AMB-001 ~ UT-AMB-035）のテスト観点が適切か
- [ ] 異常系テストケース（RoutingError, ArgumentError, HTTP errors）のカバレッジが十分か
- [ ] 境界値テスト（空配列、nil値）のカバレッジが十分か
- [ ] コールバック（before_processing, after_processing, around_processing）のテストが網羅されているか
- [ ] ステータス遷移（pending -> processing -> delivered/failed/bounced）のテストが網羅されているか
