---
generated_at: 2026-01-29 10:30:00
metrics:
  claims_total: 127
  claims_with_evidence: 127
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：Core-System-User 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：127 / 127、根拠なし：0
- 優先レビュー（高）
  1. **パスワード関連テスト（UT-USR-007〜009）**：セキュリティ上重要、checkIfPropertyAccessIsAllowedの動作確認が必要
  2. **UserRecoveryService テスト（UT-USR-086〜097）**：パスワードリカバリフローの完全性確認が必要
  3. **UserValidationService テスト（UT-USR-108〜113）**：ユーザー名・メール重複チェックの境界値確認が必要

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `src/Core/System/User/UserEntity.php` - UserEntityクラス定義
- E-02: `src/Core/System/User/UserDefinition.php` - Userエンティティ定義（フィールド、リレーション）
- E-03: `src/Core/System/User/UserCollection.php` - UserCollectionクラス定義
- E-04: `src/Core/System/User/UserException.php` - User例外クラス定義
- E-05: `src/Core/System/User/UserEvents.php` - Userイベント定数定義
- E-06: `src/Core/System/User/Aggregate/UserAccessKey/UserAccessKeyEntity.php` - UserAccessKeyEntityクラス定義
- E-07: `src/Core/System/User/Aggregate/UserAccessKey/UserAccessKeyDefinition.php` - UserAccessKeyエンティティ定義
- E-08: `src/Core/System/User/Aggregate/UserAccessKey/UserAccessKeyCollection.php` - UserAccessKeyCollectionクラス定義
- E-09: `src/Core/System/User/Aggregate/UserConfig/UserConfigEntity.php` - UserConfigEntityクラス定義
- E-10: `src/Core/System/User/Aggregate/UserConfig/UserConfigDefinition.php` - UserConfigエンティティ定義
- E-11: `src/Core/System/User/Aggregate/UserConfig/UserConfigCollection.php` - UserConfigCollectionクラス定義
- E-12: `src/Core/System/User/Aggregate/UserRecovery/UserRecoveryEntity.php` - UserRecoveryEntityクラス定義
- E-13: `src/Core/System/User/Aggregate/UserRecovery/UserRecoveryDefinition.php` - UserRecoveryエンティティ定義
- E-14: `src/Core/System/User/Aggregate/UserRecovery/UserRecoveryCollection.php` - UserRecoveryCollectionクラス定義
- E-15: `src/Core/System/User/Recovery/UserRecoveryService.php` - パスワードリカバリサービス
- E-16: `src/Core/System/User/Recovery/UserRecoveryRequestEvent.php` - リカバリリクエストイベント
- E-17: `src/Core/System/User/Service/UserValidationService.php` - ユーザーバリデーションサービス
- E-18: `src/Core/System/User/Api/UserRecoveryController.php` - リカバリAPIコントローラ
- E-19: `src/Core/System/User/Api/UserValidationController.php` - バリデーションAPIコントローラ

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

### UserEntity（UT-USR-001〜039）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getLocaleId/setLocaleIdメソッドが存在し正常動作すること | E-01 (L105-113) | ○ |
| C-02 | getAvatarId/setAvatarIdメソッドがnull許容で動作すること | E-01 (L115-123) | ○ |
| C-03 | getUsername/setUsernameメソッドが存在し正常動作すること | E-01 (L125-133) | ○ |
| C-04 | getPassword/setPasswordがcheckIfPropertyAccessIsAllowedを呼び出すこと | E-01 (L135-151) | ○ |
| C-05 | getFirstName/setFirstName, getLastName/setLastNameが存在すること | E-01 (L153-171) | ○ |
| C-06 | getEmail/setEmailメソッドが存在し正常動作すること | E-01 (L173-181) | ○ |
| C-07 | getActive/setActive, isAdmin/setAdminがbool型で動作すること | E-01 (L183-279) | ○ |
| C-08 | getTitle/setTitleがnull許容で動作すること | E-01 (L291-299) | ○ |
| C-09 | リレーションgetter（getLocale, getAvatarMedia等）がnull許容であること | E-01 (L193-251) | ○ |
| C-10 | getStoreTokenがcheckIfPropertyAccessIsAllowedを呼び出すこと | E-01 (L254-269) | ○ |
| C-11 | getLastUpdatedPasswordAtがnull許容DateTimeInterfaceであること | E-01 (L341-349) | ○ |
| C-12 | getTimeZone/setTimeZoneが存在すること | E-01 (L351-359) | ○ |
| C-13 | 監査用リレーション（createdOrders等）が存在すること | E-01 (L301-339) | ○ |

### UserDefinition（UT-USR-040〜047）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | ENTITY_NAMEが'user'であること | E-02 (L45) | ○ |
| C-15 | getCollectionClassがUserCollection::classを返すこと | E-02 (L52-55) | ○ |
| C-16 | getEntityClassがUserEntity::classを返すこと | E-02 (L57-60) | ○ |
| C-17 | since()が'6.0.0.0'を返すこと | E-02 (L62-65) | ○ |
| C-18 | getDefaults()がtimeZone='UTC'を返すこと | E-02 (L67-72) | ○ |
| C-19 | defineProtections()がWriteProtection(SYSTEM_SCOPE)を含むこと | E-02 (L74-77) | ○ |
| C-20 | defineFields()が必須フィールドとリレーションを定義すること | E-02 (L79-111) | ○ |

### UserCollection（UT-USR-048〜053）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-21 | getLocaleIds()がlocaleIdの配列を返すこと | E-03 (L17-20) | ○ |
| C-22 | filterByLocaleId()が指定IDでフィルタすること | E-03 (L22-25) | ○ |
| C-23 | getApiAlias()が'user_collection'を返すこと | E-03 (L27-30) | ○ |
| C-24 | getExpectedClass()がUserEntity::classを返すこと | E-03 (L32-35) | ○ |

### UserException（UT-USR-054）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | salesChannelNotFound()がHTTP 412で例外を返すこと | E-04 (L12-21) | ○ |

### UserAccessKey関連（UT-USR-055〜067）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-26 | UserAccessKeyEntityのgetter/setterが正常動作すること | E-06 (L27-75) | ○ |
| C-27 | UserAccessKeyDefinitionのENTITY_NAMEが'user_access_key'であること | E-07 (L22) | ○ |
| C-28 | getParentDefinitionClass()がUserDefinition::classを返すこと | E-07 (L44-47) | ○ |
| C-29 | UserAccessKeyCollectionのメソッドが正常動作すること | E-08 (L17-35) | ○ |

### UserConfig関連（UT-USR-068〜078）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | UserConfigEntityのgetter/setterが正常動作すること | E-09 (L26-70) | ○ |
| C-31 | UserConfigDefinitionのENTITY_NAMEが'user_config'であること | E-10 (L20) | ○ |
| C-32 | since()が'6.3.5.0'を返すこと | E-10 (L37-40) | ○ |
| C-33 | UserConfigCollectionのgetApiAliasが正常動作すること | E-11 (L14-17) | ○ |

### UserRecovery関連（UT-USR-079〜085）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | UserRecoveryEntityのgetter/setterが正常動作すること | E-12 (L21-49) | ○ |
| C-35 | UserRecoveryDefinitionのENTITY_NAMEが'user_recovery'であること | E-13 (L20) | ○ |
| C-36 | UserRecoveryCollectionのgetApiAliasが正常動作すること | E-14 (L14-17) | ○ |

### UserRecoveryService（UT-USR-086〜097）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 | generateUserRecovery()がリカバリレコードを生成しイベントを発火すること | E-15 (L49-109) | ○ |
| C-38 | generateUserRecovery()が存在しないメールでサイレント終了すること | E-15 (L51-55) | ○ |
| C-39 | generateUserRecovery()が既存リカバリを削除してから再生成すること | E-15 (L63-65) | ○ |
| C-40 | checkHash()が2時間以内のハッシュでtrueを返すこと | E-15 (L111-123) | ○ |
| C-41 | updatePassword()がハッシュ検証後にパスワードを更新すること | E-15 (L125-147) | ○ |
| C-42 | getUserByHash()がハッシュからユーザーを取得すること | E-15 (L149-158) | ○ |
| C-43 | getSalesChannel()がセールスチャネル未存在時に例外を投げること | E-15 (L188-201) | ○ |

### UserRecoveryRequestEvent（UT-USR-098〜107）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 | getName()が'user.recovery.request'を返すこと | E-16 (L24, L35-38) | ○ |
| C-45 | getUserRecovery()がUserRecoveryEntityを返すこと | E-16 (L40-43) | ○ |
| C-46 | getAvailableData()がuserRecoveryとresetUrlを含むこと | E-16 (L50-56) | ○ |
| C-47 | getMailStruct()がMailRecipientStructを生成・キャッシュすること | E-16 (L68-80) | ○ |
| C-48 | getSalesChannelId()がnullを返すこと | E-16 (L82-85) | ○ |

### UserValidationService（UT-USR-108〜113）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | checkEmailUnique()が自己除外フィルタで重複チェックすること | E-17 (L30-45) | ○ |
| C-50 | checkUsernameUnique()が自己除外フィルタで重複チェックすること | E-17 (L50-65) | ○ |

### UserRecoveryController（UT-USR-114〜121）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | createUserRecovery()がレートリミット付きでリカバリを生成すること | E-18 (L29-42) | ○ |
| C-52 | checkUserRecovery()がハッシュ検証結果に応じてレスポンスを返すこと | E-18 (L44-54) | ○ |
| C-53 | updateUserPassword()がパスワード確認・ハッシュ検証を行うこと | E-18 (L56-80) | ○ |

### UserValidationController（UT-USR-122〜127）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-54 | isEmailUnique()が必須パラメータチェック後にバリデーション結果を返すこと | E-19 (L27-44) | ○ |
| C-55 | isUsernameUnique()が必須パラメータチェック後にバリデーション結果を返すこと | E-19 (L46-63) | ○ |

## 4) 不足情報（Unknown / Missing）
- 現時点で根拠なしの項目はありません
- 全てのテストケースはソースコードから直接導出されています

## 5) リスクフラグ（レビュー観点）
- **リスク1（高）**: パスワード関連（getPassword, setPassword, updatePassword）- セキュリティ上重要なため、checkIfPropertyAccessIsAllowedの実装詳細と例外発生条件の確認が必要
- **リスク1（高）**: ハッシュ有効期限（checkHash）- 2時間という有効期限がハードコードされているため、設定可能性の確認が必要
- **リスク0（低）**: タイムゾーンデフォルト値 - 'UTC'がハードコードされているが、適切なデフォルト値

## 6) レビュアーチェックリスト（最小）
- [ ] パスワード保護メカニズム（checkIfPropertyAccessIsAllowed）の動作を確認
- [ ] UserRecoveryServiceの2時間有効期限が要件を満たすか確認
- [ ] レートリミッターの設定値（RateLimiter::USER_RECOVERY）が適切か確認
- [ ] WriteProtection(Context::SYSTEM_SCOPE)によるユーザーエンティティ保護が十分か確認
- [ ] メールアドレス/ユーザー名のユニーク制約がデータベースレベルでも保証されているか確認
