---
generated_at: 2026-01-29 10:30:00
metrics:
  claims_total: 95
  claims_with_evidence: 93
  claims_without_evidence: 2
confidence_derived: 0.98
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：93 / 95、根拠なし：2
- 優先レビュー（高）
  1. **UT-CUS-063 (encrypt/decrypt)**: 暗号化の具体的な動作検証が必要
  2. **UT-CUS-041 (バッチサイズ100)**: 定数確認は行ったが実行時テストが必要

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

- E-01: `src/Core/Checkout/Customer/CustomerEntity.php` - 顧客エンティティの実装
- E-02: `src/Core/Checkout/Customer/CustomerDefinition.php` - 顧客定義クラス
- E-03: `src/Core/Checkout/Customer/CustomerCollection.php` - 顧客コレクションクラス
- E-04: `src/Core/Checkout/Customer/Aggregate/CustomerAddress/CustomerAddressEntity.php` - 住所エンティティ
- E-05: `src/Core/Checkout/Customer/Aggregate/CustomerAddress/CustomerAddressDefinition.php` - 住所定義クラス
- E-06: `src/Core/Checkout/Customer/Aggregate/CustomerAddress/CustomerAddressCollection.php` - 住所コレクション
- E-07: `src/Core/Checkout/Customer/Aggregate/CustomerGroup/CustomerGroupEntity.php` - 顧客グループエンティティ
- E-08: `src/Core/Checkout/Customer/Aggregate/CustomerGroup/CustomerGroupDefinition.php` - 顧客グループ定義
- E-09: `src/Core/Checkout/Customer/Aggregate/CustomerWishlist/CustomerWishlistEntity.php` - お気に入りエンティティ
- E-10: `src/Core/Checkout/Customer/Aggregate/CustomerRecovery/CustomerRecoveryEntity.php` - リカバリーエンティティ
- E-11: `src/Core/Checkout/Customer/Service/EmailIdnConverter.php` - メールIDN変換サービス
- E-12: `src/Core/Checkout/Customer/Service/ProductReviewCountService.php` - レビュー数更新サービス
- E-13: `src/Core/Checkout/Customer/Service/GuestAuthenticator.php` - ゲスト認証サービス
- E-14: `src/Core/Checkout/Customer/DeleteUnusedGuestCustomerService.php` - 未使用ゲスト削除サービス
- E-15: `src/Core/Checkout/Customer/Password/LegacyPasswordVerifier.php` - レガシーパスワード検証
- E-16: `src/Core/Checkout/Customer/Password/LegacyEncoder/Md5.php` - MD5エンコーダー
- E-17: `src/Core/Checkout/Customer/Password/LegacyEncoder/Sha256.php` - SHA256エンコーダー
- E-18: `src/Core/Checkout/Customer/SalesChannel/AccountService.php` - アカウントサービス
- E-19: `src/Core/Checkout/Customer/ImitateCustomerTokenGenerator.php` - 模擬トークン生成
- E-20: `src/Core/Checkout/Customer/Rule/CustomerGroupRule.php` - 顧客グループルール
- E-21: `src/Core/Checkout/Customer/Rule/IsGuestCustomerRule.php` - ゲスト顧客ルール
- E-22: `src/Core/Checkout/Customer/Rule/CustomerAgeRule.php` - 顧客年齢ルール
- E-23: `src/Core/Checkout/Customer/Rule/OrderCountRule.php` - 注文数ルール
- E-24: `src/Core/Checkout/Customer/Rule/BillingCountryRule.php` - 請求先国ルール
- E-25: `src/Core/Checkout/Customer/Rule/EmailRule.php` - メールルール
- E-26: `src/Core/Checkout/Customer/Rule/CustomerNumberRule.php` - 顧客番号ルール
- E-27: `src/Core/Checkout/Customer/Rule/CustomerTagRule.php` - 顧客タグルール
- E-28: `src/Core/Checkout/Customer/Rule/DaysSinceLastOrderRule.php` - 最終注文からの日数ルール

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | CustomerEntity.__toString()はfirstName + lastNameを返す | E-01 (L175-178) | ○ |
| C-02 | hasLegacyPassword()はlegacyPasswordとlegacyEncoderの両方が非nullの時trueを返す | E-01 (L532-535) | ○ |
| C-03 | getActiveBillingAddress()はactiveBillingAddressがnullの時defaultBillingAddressを返す | E-01 (L607-610) | ○ |
| C-04 | getActiveShippingAddress()はactiveShippingAddressがnullの時defaultShippingAddressを返す | E-01 (L620-623) | ○ |
| C-05 | CustomerCollectionのfilterByGroupId()は指定グループIDでフィルタする | E-03 (L26-29) | ○ |
| C-06 | CustomerCollectionのfilterBySalesChannelId()は指定SalesChannelIDでフィルタする | E-03 (L39-42) | ○ |
| C-07 | CustomerCollectionのfilterByVatId()は指定VAT IDでフィルタする | E-03 (L127-129) | ○ |
| C-08 | CustomerAddressEntity.setZipcode()は空文字をnullに変換する | E-04 (L125-128) | ○ |
| C-09 | CustomerAddressCollectionのsortByDefaultAddress()はデフォルト住所を先頭に配置する | E-06 (L70-85) | ○ |
| C-10 | EmailIdnConverter.decode()はxn--で始まるドメインをUTF-8に変換する | E-11 (L13-25) | ○ |
| C-11 | EmailIdnConverter.encode()は非ASCIIドメインをIDNに変換する | E-11 (L27-41) | ○ |
| C-12 | ProductReviewCountService.updateReviewCountForCustomer()はreview_countを更新する | E-12 (L40-48) | ○ |
| C-13 | GuestAuthenticator.validate()はゲスト顧客でない場合例外をスローする | E-13 (L16-20) | ○ |
| C-14 | GuestAuthenticator.validate()はemail/zipcodeが一致しない場合例外をスローする | E-13 (L29-34) | ○ |
| C-15 | DeleteUnusedGuestCustomerService.countUnusedCustomers()はmaxLifeTime=0の時0を返す | E-14 (L33-47) | ○ |
| C-16 | DeleteUnusedGuestCustomerService.DELETE_CUSTOMERS_BATCH_SIZE定数は100 | E-14 (L20) | ○ |
| C-17 | LegacyPasswordVerifier.verify()はlegacyEncoder/Passwordがnullの時例外をスローする | E-15 (L24-26) | ○ |
| C-18 | LegacyPasswordVerifier.verify()は存在しないエンコーダーの時例外をスローする | E-15 (L36) | ○ |
| C-19 | Md5エンコーダーはソルトあり/なし両方のハッシュを検証できる | E-16 (L16-24) | ○ |
| C-20 | Sha256エンコーダーはiterations:salt:hash形式を検証する | E-17 (L16-32) | ○ |
| C-21 | AccountService.loginByCredentials()は空のemail/passwordで例外をスローする | E-18 (L97-101) | ○ |
| C-22 | AccountService.loginById()は無効なUUIDで例外をスローする | E-18 (L76-79) | ○ |
| C-23 | AccountService.getCustomerByLogin()は長すぎるパスワードで例外をスローする | E-18 (L118-120) | ○ |
| C-24 | AccountService.getCustomerByLogin()はダブルオプトイン未完了で例外をスローする | E-18 (L139-142) | ○ |
| C-25 | ImitateCustomerTokenGenerator.encrypt()は暗号化を行う | E-19 (L113-123) | ○ |
| C-26 | ImitateCustomerTokenGenerator.decrypt()はIV長が不正な場合例外をスローする | E-19 (L136-138) | ○ |
| C-27 | CustomerGroupRule.match()はCheckoutRuleScopeでない場合falseを返す | E-20 (L36-38) | ○ |
| C-28 | IsGuestCustomerRule.match()は顧客がnullの場合falseを返す | E-21 (L34-37) | ○ |
| C-29 | CustomerAgeRule.match()はageがnullでOPERATOR_EMPTY以外の場合例外をスローする | E-22 (L42-44) | ○ |
| C-30 | OrderCountRule.match()は顧客がnullの場合否定演算子でtrueを返す | E-23 (L31-33) | ○ |
| C-31 | BillingCountryRule.match()は請求住所がnullの場合否定演算子でtrueを返す | E-24 (L43-45) | ○ |
| C-32 | EmailRule.match()はワイルドカードパターンをサポートする | E-25 (L43-48) | ○ |
| C-33 | CustomerNumberRule.match()は大文字小文字を無視して比較する | E-26 (L48) | ○ |
| C-34 | CustomerTagRule.match()はタグIDがない場合空配列を返す | E-27 (L73-81) | ○ |
| C-35 | DaysSinceLastOrderRule.getDate()は顧客のlastOrderDateを返す | E-28 (L20-23) | ○ |
| C-36 | CustomerDefinition.getDefaults()はaccountType=privateを返す | E-02 (L82-87) | ○ |
| C-37 | ImitateCustomerTokenGenerator.encrypt/decryptの暗号化動作が正しいこと | **根拠不足** | △ |
| C-38 | deleteUnusedCustomersのバッチサイズ上限の実行時動作確認 | **根拠不足** | △ |

## 4) 不足情報（Unknown / Missing）
- ImitateCustomerTokenGeneratorのencrypt/decryptメソッドについて、暗号化アルゴリズム（AES-256-CBC）の正確な動作検証には実行時テストが必要
  - 候補：暗号化ライブラリのドキュメント / 既存のテストコード / セキュリティ監査レポート
- DeleteUnusedGuestCustomerServiceのバッチ処理について、100件以上の顧客が存在する場合の動作は定数で確認できるが、実行時の挙動確認が必要
  - 候補：既存のテストコード / インテグレーションテスト結果

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - CustomerEntity, CustomerAddressEntity, CustomerGroupEntity, Collectionクラス（プロパティアクセサ、フィルタメソッド）
- **1: 中リスク** - EmailIdnConverter, ProductReviewCountService, Rule系クラス（入力変換、集計処理、ルール評価）
- **2: 高リスク** - AccountService, LegacyPasswordVerifier, GuestAuthenticator, ImitateCustomerTokenGenerator（認証、セキュリティ関連）

## 6) レビュアーチェックリスト（最小）
- [ ] 認証関連テストケース（UT-CUS-042〜UT-CUS-065）のカバレッジが十分か確認
- [ ] パスワード検証ロジック（MD5/SHA256）のテストケースがセキュリティ要件を満たしているか確認
- [ ] GuestAuthenticator.validate()の例外パターンが全て網羅されているか確認
- [ ] Rule系クラスの境界値テストが十分か確認
- [ ] DeleteUnusedGuestCustomerServiceのバッチ処理テストが本番環境の負荷を考慮しているか確認
- [ ] ImitateCustomerTokenGeneratorの暗号化テストがセキュリティ監査基準を満たしているか確認
