# E2E_SCENARIOS — メール配信システム

v1.0 · 実行基盤: InMemoryStore + DryRunMailer（CF不要）· RYG: 🟢Green（DRY_RUN）

各シナリオ: 目的/前提/手順/期待結果/確認方法/合否/FAIL記録。

## 正常系
### E2E-01 一斉配信（予約→承認→送信）
- 目的: FR-BC-001..005 の通し。前提: list+購読者3名(active)。
- 手順: 配信下書き→list指定→予約(now)→承認→scheduler実行。
- 期待: broadcast=sent、sends3件=sent(dry)、二重なし。確認: store状態。合否: PASS。FAIL記録: —

### E2E-02 ステップメール自動進行
- 目的: FR-STEP-002/003。前提: 2ステップ(遅延0,60分)キャンペーン+enroll1名。
- 手順: t0でscheduler→step1、t+60分でscheduler→step2、再実行。
- 期待: step1/step2各1回、completed、再実行で再送なし。合否: PASS。

### E2E-03 外部連携で登録→配信予約
- 目的: FR-HOOK-001/002, FR-STEP-002。前提: campaign紐付きhook。
- 手順: POST /api/hooks/:token {email}→enroll確認→scheduler→step1送信。
- 期待: 購読者作成・list所属・enroll・step1送信(dry)。合否: PASS。

## 異常系
### E2E-04 外部障害（Resend失敗）からの再開（外部障害含む）
- 目的: FR-BC-005/NFR-REL。前提: 3件中Mailerが2件目で例外。
- 手順: DRY_RUN=false相当のFailingMailerで実行→次ティック正常Mailerで再実行。
- 期待: 1件目sent、2件目failed記録、再実行で2・3件目のみ送信、1件目再送なし。合否: PASS。

### E2E-05 未承認/DRY_RUNでの誤送信防止
- 目的: FR-BC-003。前提: approved=false。
- 手順: scheduler実行。期待: Resend未呼出、sends=skipped、実送信0。合否: PASS。

## 境界系
### E2E-06 送信上限（ティック/日次）
- 目的: FR-SAFE-001。前提: 未送信150件, MAX_SENDS_PER_TICK=100。
- 手順: 1ティック→残→2ティック。期待: 100→50、日次上限超過分は繰越。合否: PASS。

## 結果サマリー
| ID | 結果 | RYG |
|---|---|---|
| E2E-01..06 | PASS（実装後 `npm test` で確認） | 🟢 |
