# テストケース設計ガイド

## 5 分類体系

インテグレーションテストのケースは以下の 5 分類で網羅する。

| 分類 | 説明 | 例 |
|------|------|-----|
| **正常系** | 正しい入力で期待通りの結果 | ユーザー作成成功、一覧取得 |
| **異常系** | 不正な入力やエラー条件 | バリデーションエラー、認証エラー |
| **境界値** | 境界条件の動作確認 | 空リスト、最大長、ページ境界 |
| **エッジケース** | 特殊な状況 | 重複データ、同時更新、空文字 |
| **外部依存エラー** | 外部システムの障害 | DB 接続エラー、外部 API タイムアウト |

## HTTP メソッド別必須テストケース

### GET 一覧

| 分類 | テストケース |
|------|------------|
| 正常系 | データが存在する場合に全件返す |
| 境界値 | データが0件の場合に空配列を返す |
| 正常系 | ページネーションが正しく動作する |
| 境界値 | 最終ページの件数が正しい |
| 異常系 | 認証なしで 401 |

### GET 詳細

| 分類 | テストケース |
|------|------------|
| 正常系 | 存在する ID で正しいデータを返す |
| 異常系 | 存在しない ID で 404 |
| 異常系 | 不正な ID 形式で 400 |
| 異常系 | 認証なしで 401 |

### POST 作成

| 分類 | テストケース |
|------|------------|
| 正常系 | 有効な入力で 201 + DB に保存 |
| 異常系 | 必須フィールド欠落で 400 |
| 異常系 | バリデーション違反で 400 |
| エッジケース | 重複データで 409 (Conflict) |
| 外部依存 | 外部 API エラー時にロールバック |
| 異常系 | 認証なしで 401 |

### PUT/PATCH 更新

| 分類 | テストケース |
|------|------------|
| 正常系 | 有効な入力で更新成功 + DB に反映 |
| 異常系 | 存在しない ID で 404 |
| 異常系 | バリデーション違反で 400 |
| 境界値 | 変更なし (同じ値) で正常応答 |
| 異常系 | 認証なしで 401 |

### DELETE 削除

| 分類 | テストケース |
|------|------------|
| 正常系 | 存在する ID で 204 + DB から削除 |
| 異常系 | 存在しない ID で 404 |
| エッジケース | 関連データがある場合の挙動 |
| 異常系 | 認証なしで 401 |

## テストケース導出手順

1. **handler を読む**: ルート定義からエンドポイント一覧を把握
2. **リクエスト/レスポンス型を読む**: DTO の構造からバリデーション条件を特定
3. **repository を読む**: クエリロジックからエッジケースを特定
4. **5 分類マトリクスに当てはめる**: 上記のテーブルを参考にケースを列挙

## ケース数の目安

| エンドポイント種別 | 最小ケース数 |
|------------------|:----------:|
| GET 一覧 | 4-5 |
| GET 詳細 | 3-4 |
| POST 作成 | 5-6 |
| PUT/PATCH 更新 | 4-5 |
| DELETE 削除 | 3-4 |

## UT との棲み分け

| テスト種別 | 対象 | DB | 外部 API |
|-----------|------|:--:|:-------:|
| UT | ビジネスロジック単体 | mock/fake | mock |
| IT | HTTP → handler → repository → DB 全層 | 実 DB (testcontainers) | trait DI |
