---
generated_at: 2026-01-28 14:15:00
metrics:
  claims_total: 69
  claims_with_evidence: 69
  claims_without_evidence: 0
confidence_derived: 1.00
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：69 / 69、根拠なし：0
- 優先レビュー（高）
  1. **SearchRepositoryImp.getCategoriesList**: null安全性の問題あり（line 45: `getDrawerCategoriesData!`）
  2. **SearchScreen._checkPermission**: 再帰呼び出しによる無限ループの可能性
  3. **SearchBloc**: 複数のif文が並列で実行される可能性（else ifでないため）

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

- E-01: `lib/screens/search_screen/bloc/search_bloc.dart` - SearchBlocクラス定義（62行）
- E-02: `lib/screens/search_screen/bloc/search_event.dart` - イベントクラス定義（36行）
- E-03: `lib/screens/search_screen/bloc/search_state.dart` - 状態クラス定義（67行）
- E-04: `lib/screens/search_screen/bloc/search_repository.dart` - リポジトリクラス定義（48行）
- E-05: `lib/screens/search_screen/view/search_screen.dart` - 検索画面ウィジェット定義（332行）
- E-06: `lib/screens/search_screen/view/widget/categories_view.dart` - カテゴリビューウィジェット定義（95行）
- E-07: `lib/screens/search_screen/view/widget/product_list.dart` - 商品リストウィジェット定義（93行）
- E-08: `lib/screens/search_screen/utils/index.dart` - エクスポートファイル（30行）

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

### SearchBloc関連（UT-SRC-001〜009）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | SearchBarTextEventで空でないテキストが渡された場合にAppBarSearchTextStateが発行される | E-01 (line 26-31) | ○ |
| C-02 | SearchBarTextEventで空文字が渡された場合にClearSearchBarTextStateが発行される | E-01 (line 27-28) | ○ |
| C-03 | CircularBarEventでローダー表示フラグがtrueの場合CircularBarStateが発行される | E-01 (line 33-35) | ○ |
| C-04 | CircularBarEventでローダー表示フラグがfalseの場合CircularBarStateが発行される | E-01 (line 33-35) | ○ |
| C-05 | FetchSearchEventで正常にAPIレスポンスを受信した場合FetchSearchDataState.successが発行される | E-01 (line 36-46) | ○ |
| C-06 | FetchSearchEventでAPI呼び出しが失敗した場合FetchSearchDataState.failが発行される | E-01 (line 42-44) | ○ |
| C-07 | FetchCategoryPageEventで正常にカテゴリリストを取得した場合FetchCategoriesPageDataState.successが発行される | E-01 (line 48-58) | ○ |
| C-08 | FetchCategoryPageEventでresponseStatusがfalseの場合FetchCategoriesPageDataState.failが発行される | E-01 (line 53-54) | ○ |
| C-09 | FetchCategoryPageEventで例外が発生した場合FetchCategoriesPageDataState.failが発行される | E-01 (line 56-58) | ○ |

### SearchRepositoryImp関連（UT-SRC-010〜014）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-10 | 有効なフィルタで商品検索APIを呼び出した場合NewProductsModelが返却される | E-04 (line 21-32) | ○ |
| C-11 | nullのフィルタで商品検索APIを呼び出した場合nullまたはデフォルト結果が返却される | E-04 (line 22-26) | ○ |
| C-12 | API呼び出しで例外が発生した場合nullが返却される | E-04 (line 27-30) | ○ |
| C-13 | 有効なフィルタでカテゴリリストAPIを呼び出した場合GetDrawerCategoriesDataが返却される | E-04 (line 35-46) | ○ |
| C-14 | API呼び出しで例外が発生した場合null参照エラーが発生する可能性がある | E-04 (line 45: `getDrawerCategoriesData!`) | ○ |

### SearchScreen関連（UT-SRC-015〜042）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 | 画面初期化時にFetchCategoryPageEventが発行される | E-05 (line 42-46) | ○ |
| C-16 | 音声認識機能が正しく初期化される | E-05 (line 50-58) | ○ |
| C-17 | 音声認識結果が3文字以上の場合に検索が実行される | E-05 (line 60-73, line 64) | ○ |
| C-18 | 音声認識結果が2文字以下の場合は検索が実行されない | E-05 (line 64: `transcription.length > 2`) | ○ |
| C-19 | AppBarSearchTextStateを受信した場合に検索テキストが更新される | E-05 (line 80-88) | ○ |
| C-20 | ClearSearchBarTextStateを受信した場合に検索テキストがクリアされる | E-05 (line 81-82) | ○ |
| C-21 | CircularBarStateでisReqToShowLoaderがtrueの場合にローディング表示される | E-05 (line 89-91, 118-124) | ○ |
| C-22 | FetchCategoriesPageDataState.successを受信した場合にカテゴリデータが設定される | E-05 (line 92-97) | ○ |
| C-23 | FetchSearchDataState.successを受信した場合に商品データが設定される | E-05 (line 98-104) | ○ |
| C-24 | 検索結果が空の場合にEmptyDataViewが表示される | E-05 (line 105-112, 138-145) | ○ |
| C-25 | テキストフィールドに3文字以上入力された場合に検索が実行される | E-05 (line 162-169) | ○ |
| C-26 | テキストフィールドに2文字以下入力された場合は検索が実行されない | E-05 (line 163: `value.length > 2`) | ○ |
| C-27 | 検索テキストがある場合にクリアボタンが表示される | E-05 (line 183-192) | ○ |
| C-28 | クリアボタン押下時にSearchBarTextEvent(空文字)が発行される | E-05 (line 188-189) | ○ |
| C-29 | 商品リストがある場合にProductListウィジェットが返却される | E-05 (line 225-229) | ○ |
| C-30 | 商品リストがnullまたは空の場合にSizedBoxが返却される | E-05 (line 227-229) | ○ |
| C-31 | 音声認識が開始され_isListeningがtrueになる | E-05 (line 268-274) | ○ |
| C-32 | 音声認識が停止され_isListeningがfalseになる | E-05 (line 262-266) | ○ |
| C-33 | _isListeningがtrueの場合にアニメーションコンテナが表示される | E-05 (line 233-260) | ○ |
| C-34 | 指定されたradiusでコンテナが作成される | E-05 (line 276-285) | ○ |
| C-35 | カメラ権限が許可された場合にMethodChannelが呼び出される | E-05 (line 288-308, line 290-296) | ○ |
| C-36 | カメラ権限が拒否された場合に再度権限リクエストが行われる | E-05 (line 303-304) | ○ |
| C-37 | カメラ権限が永久に拒否された場合にアプリ設定が開かれる | E-05 (line 305-306) | ○ |
| C-38 | PlatformExceptionが発生した場合に警告メッセージが表示される | E-05 (line 297-301) | ○ |
| C-39 | ネットワーク接続がある場合に検索が実行される | E-05 (line 310-324) | ○ |
| C-40 | ネットワーク接続がない場合にネットワークエラーダイアログが表示される | E-05 (line 319-323) | ○ |
| C-41 | ネットワーク接続がある場合にtrueが返却される | E-05 (line 326-330) | ○ |
| C-42 | ネットワーク接続がない場合にfalseが返却される | E-05 (line 326-330) | ○ |

### イベントクラス関連（UT-SRC-043〜048）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-43 | FetchSearchEvent.filtersが正しく設定される | E-02 (line 14-17) | ○ |
| C-44 | FetchCategoryPageEvent.filtersが正しく設定される | E-02 (line 20-23) | ○ |
| C-45 | FetchCategoryPageEvent.filtersがnullでもインスタンス作成可能 | E-02 (line 21: `List<Map<String, dynamic>>?`) | ○ |
| C-46 | CircularBarEvent.isReqToShowLoaderが正しく設定される | E-02 (line 26-29) | ○ |
| C-47 | SearchBarTextEvent.searchTextが正しく設定される | E-02 (line 31-35) | ○ |
| C-48 | SearchBarTextEvent.searchTextがnullでもインスタンス作成可能 | E-02 (line 33: `String?`) | ○ |

### 状態クラス関連（UT-SRC-049〜056）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | FetchSearchDataState.successでproductsが設定されstatusがsuccessになる | E-03 (line 22-27) | ○ |
| C-50 | FetchSearchDataState.failでerrorが設定されstatusがfailになる | E-03 (line 29) | ○ |
| C-51 | FetchCategoriesPageDataState.successでgetCategoriesDataが設定されstatusがsuccessになる | E-03 (line 31-38) | ○ |
| C-52 | FetchCategoriesPageDataState.failでerrorが設定されstatusがfailになる | E-03 (line 40) | ○ |
| C-53 | ClearSearchBarTextStateインスタンスが正しく作成される | E-03 (line 44-46) | ○ |
| C-54 | CircularBarState.isReqToShowLoaderが正しく設定される | E-03 (line 49-53) | ○ |
| C-55 | AppBarSearchTextState.searchTextが正しく設定される | E-03 (line 56-60) | ○ |
| C-56 | AppBarState.searchQueryが正しく設定される | E-03 (line 62-66) | ○ |

### CategoriesView関連（UT-SRC-057〜061）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | カテゴリリストが正しく表示される | E-06 (line 39-86) | ○ |
| C-58 | dataがnullの場合に空のリストが表示される | E-06 (line 40: `data?.length ?? 0`) | ○ |
| C-59 | dataが空の場合に空のリストが表示される | E-06 (line 40) | ○ |
| C-60 | childrenが存在するカテゴリタップでdrawerSubCategoryScreenに遷移 | E-06 (line 46-50) | ○ |
| C-61 | childrenが存在しないカテゴリタップでcategoryScreenに遷移 | E-06 (line 52-59) | ○ |

### ProductList関連（UT-SRC-062〜069）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | 商品リストが正しく表示される | E-07 (line 22-90) | ○ |
| C-63 | model.dataがnullの場合に空のリストが表示される | E-07 (line 25: `model?.data?.length ?? 0`) | ○ |
| C-64 | model.dataが空の場合に空のリストが表示される | E-07 (line 25) | ○ |
| C-65 | 商品タップでproductScreenに遷移 | E-07 (line 30-35) | ○ |
| C-66 | 商品画像がある場合にImageViewで表示される | E-07 (line 47-57) | ○ |
| C-67 | 商品画像がない場合に空のImageViewが表示される | E-07 (line 58-67) | ○ |
| C-68 | 商品価格が正しく表示される | E-07 (line 79-81) | ○ |
| C-69 | formattedFinalPriceがない場合にformattedRegularPriceが表示される | E-07 (line 79-80: `??`演算子) | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし - 全てのテストケースについてソースコードから根拠を確認できました

## 5) リスクフラグ（レビュー観点）
- **1（中リスク）**: `SearchRepositoryImp.getCategoriesList`のline 45で`getDrawerCategoriesData!`による強制アンラップが行われており、例外発生時にnull参照エラーになる可能性がある
- **1（中リスク）**: `SearchScreen._checkPermission`でPermissionStatus.deniedの場合に再帰呼び出しが行われるが、ユーザーが繰り返し拒否した場合の終了条件が不明確
- **0（低リスク）**: `SearchBloc.mapEventToState`で複数の`if`文が並列に書かれており（`else if`ではない）、1つのイベントで複数のブロックが実行される可能性がある（意図的な設計の可能性もある）

## 6) レビュアーチェックリスト（最小）
- [ ] SearchRepositoryImp.getCategoriesListのnull安全性を確認（line 45）
- [ ] SearchScreen._checkPermissionの再帰呼び出しの終了条件を確認（line 303-304）
- [ ] SearchBloc.mapEventToStateの複数if文の意図を確認（line 26, 33, 36, 48）
- [ ] 音声認識の最小文字数（3文字）の妥当性を確認（line 64, 163）
- [ ] ネットワーク接続確認のタイムアウト設定を確認（connectedToNetwork）
- [ ] カメラ検索機能のMethodChannel呼び出しの戻り値型を確認（line 293-294）
