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

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：109 / 109、根拠なし：0
- 優先レビュー（高）
  1. **サムネイル生成機能（UT-MED-057〜069）**：画像処理の重要なロジック
  2. **ファイル名バリデーション（UT-MED-080〜087）**：セキュリティに関わる検証
  3. **未使用メディア削除（UT-MED-102〜109）**：データ整合性に関わる機能

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

- E-01: `src/Core/Content/Media/MediaEntity.php` (682行)
- E-02: `src/Core/Content/Media/MediaCollection.php` (37行)
- E-03: `src/Core/Content/Media/MediaService.php` (146行)
- E-04: `src/Core/Content/Media/MediaFolderService.php` (150行)
- E-05: `src/Core/Content/Media/Aggregate/MediaFolder/MediaFolderEntity.php` (170行)
- E-06: `src/Core/Content/Media/Aggregate/MediaThumbnail/MediaThumbnailEntity.php` (151行)
- E-07: `src/Core/Content/Media/Aggregate/MediaThumbnailSize/MediaThumbnailSizeEntity.php` (84行)
- E-08: `src/Core/Content/Media/Aggregate/MediaFolderConfiguration/MediaFolderConfigurationEntity.php` (125行)
- E-09: `src/Core/Content/Media/Aggregate/MediaDefaultFolder/MediaDefaultFolderEntity.php` (41行)
- E-10: `src/Core/Content/Media/Aggregate/MediaTranslation/MediaTranslationEntity.php` (63行)
- E-11: `src/Core/Content/Media/Thumbnail/ThumbnailService.php` (514行)
- E-12: `src/Core/Content/Media/Thumbnail/ThumbnailSizeCalculator.php` (70行)
- E-13: `src/Core/Content/Media/File/FileSaver.php` (459行)
- E-14: `src/Core/Content/Media/File/FileLoader.php` (83行)
- E-15: `src/Core/Content/Media/File/FileNameValidator.php` (118行)
- E-16: `src/Core/Content/Media/File/MediaFile.php` (44行)
- E-17: `src/Core/Content/Media/TypeDetector/TypeDetector.php` (31行)
- E-18: `src/Core/Content/Media/MediaType/MediaType.php` (65行)
- E-19: `src/Core/Content/Media/MediaType/ImageType.php` (17行)
- E-20: `src/Core/Content/Media/UnusedMediaPurger.php` (306行)
- E-21: `src/Core/Content/Media/Aggregate/MediaFolder/MediaFolderCollection.php` (24行)
- E-22: `src/Core/Content/Media/Aggregate/MediaThumbnail/MediaThumbnailCollection.php` (24行)
- E-23: `src/Core/Content/Media/Aggregate/MediaThumbnailSize/MediaThumbnailSizeCollection.php` (24行)

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

### MediaEntity関連（UT-MED-001〜016）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | MediaEntity.hasFile()がmimeType, fileExtension, fileNameの存在を確認 | E-01 (line 341-346) | ○ |
| C-02 | MediaEntity.hasFile()がpathの存在も確認 | E-01 (line 345) | ○ |
| C-03 | MediaEntity.getFileNameIncludingExtension()がファイル名と拡張子を結合 | E-01 (line 353-360) | ○ |
| C-04 | MediaEntity.get()がhasFileプロパティをhasFile()メソッドで取得 | E-01 (line 156-163) | ○ |
| C-05 | MediaEntity.getPath()がnullの場合に空文字を返却 | E-01 (line 636-639) | ○ |
| C-06 | MediaEntity.isPrivate()がprivateプロパティを返却 | E-01 (line 555-558) | ○ |
| C-07 | MediaEntity.isSpatialObject()がSpatialObjectType判定を行う | E-01 (line 669-672) | ○ |
| C-08 | MediaEntity.jsonSerialize()がmetaDataRawとmediaTypeRawを除外 | E-01 (line 496-503) | ○ |

### MediaCollection関連（UT-MED-017〜020）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | MediaCollection.getUserIds()がfmapでuserIdを抽出 | E-02 (line 17-19) | ○ |
| C-10 | MediaCollection.filterByUserId()がfilterメソッドを使用 | E-02 (line 22-24) | ○ |
| C-11 | MediaCollection.getApiAlias()が"media_collection"を返却 | E-02 (line 27-29) | ○ |

### MediaFolderEntity関連（UT-MED-021〜025）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-12 | MediaFolderEntity.getMedia()がnullの場合に空のMediaCollectionを返却 | E-05 (line 86-93) | ○ |
| C-13 | MediaFolderEntity.getUseParentConfiguration()が設定継承フラグを返却 | E-05 (line 120-123) | ○ |

### MediaThumbnailEntity関連（UT-MED-026〜030）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | MediaThumbnailEntity.getIdentifier()が幅x高さ形式を返却 | E-06 (line 136-139) | ○ |
| C-15 | MediaThumbnailEntity.getUrl()がnullの場合に空文字を返却 | E-06 (line 64-71) | ○ |
| C-16 | MediaThumbnailEntity.getPath()がnullの場合に空文字を返却 | E-06 (line 141-144) | ○ |

### MediaThumbnailSizeEntity関連（UT-MED-031〜032）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | MediaThumbnailSizeEntity.getWidth()がint<1, max>型を返却 | E-07 (line 34-37) | ○ |
| C-18 | MediaThumbnailSizeEntity.getHeight()がint<1, max>型を返却 | E-07 (line 48-51) | ○ |

### MediaFolderConfigurationEntity関連（UT-MED-033〜037）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | MediaFolderConfigurationEntity.getCreateThumbnails()がサムネイル生成フラグを返却 | E-08 (line 47-50) | ○ |
| C-20 | MediaFolderConfigurationEntity.getKeepAspectRatio()がアスペクト比維持フラグを返却 | E-08 (line 57-60) | ○ |
| C-21 | MediaFolderConfigurationEntity.getThumbnailQuality()が品質値を返却 | E-08 (line 77-80) | ○ |
| C-22 | MediaFolderConfigurationEntity.isPrivate()がプライベートフラグを返却 | E-08 (line 87-90) | ○ |

### MediaDefaultFolderEntity関連（UT-MED-038〜039）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | MediaDefaultFolderEntity.getEntity()がエンティティ名を返却 | E-09 (line 21-24) | ○ |
| C-24 | MediaDefaultFolderEntity.getFolder()が関連フォルダを返却 | E-09 (line 31-34) | ○ |

### MediaTranslationEntity関連（UT-MED-040〜041）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | MediaTranslationEntity.getTitle()がタイトルを返却 | E-10 (line 33-36) | ○ |
| C-26 | MediaTranslationEntity.getAlt()が代替テキストを返却 | E-10 (line 43-46) | ○ |

### MediaService関連（UT-MED-042〜052）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | MediaService.createMediaInFolder()がUuid::randomHex()でIDを生成 | E-03 (line 37-52) | ○ |
| C-28 | MediaService.saveMediaFile()がfileSaver.persistFileToMediaを呼び出し | E-03 (line 54-69) | ○ |
| C-29 | MediaService.saveFile()がfileFetcher.fetchBlobを使用 | E-03 (line 71-91) | ○ |
| C-30 | MediaService.loadFile()がfileLoader.loadMediaFileを呼び出し | E-03 (line 93-96) | ○ |
| C-31 | MediaService.loadFileStream()がfileLoader.loadMediaFileStreamを呼び出し | E-03 (line 98-101) | ○ |
| C-32 | MediaService.fetchFile()がcontent_typeに基づいて処理を分岐 | E-03 (line 103-116) | ○ |
| C-33 | MediaService.getAttachment()がcontent, fileName, mimeTypeを含む配列を返却 | E-03 (line 121-134) | ○ |

### MediaFolderService関連（UT-MED-053〜056）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | MediaFolderService.dissolve()がフォルダを削除 | E-04 (line 32-39) | ○ |
| C-35 | MediaFolderService.dissolve()がmoveMediaToParentFolderを呼び出し | E-04 (line 36, 41-58) | ○ |
| C-36 | MediaFolderService.dissolve()がmoveSubFoldersToParentを呼び出し | E-04 (line 37, 60-94) | ○ |
| C-37 | MediaFolderService.fetchFolder()が存在しないフォルダでMediaExceptionをスロー | E-04 (line 139-148) | ○ |

### ThumbnailService関連（UT-MED-057〜064）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | ThumbnailService.generate()がremoteThumbnailsEnableでMediaExceptionをスロー | E-11 (line 56-59) | ○ |
| C-39 | ThumbnailService.generate()がthumbnails未ロードでMediaExceptionをスロー | E-11 (line 67-69) | ○ |
| C-40 | ThumbnailService.updateThumbnails()がサムネイル更新を実行 | E-11 (line 126-190) | ○ |
| C-41 | ThumbnailService.deleteThumbnails()がサムネイル削除を実行 | E-11 (line 192-199) | ○ |

### ThumbnailSizeCalculator関連（UT-MED-065〜069）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-42 | ThumbnailSizeCalculator.calculate()がアスペクト比を考慮してサイズ計算 | E-12 (line 22-45) | ○ |
| C-43 | ThumbnailSizeCalculator.determineValidSize()が元画像より小さいサイズのみ許可 | E-12 (line 54-68) | ○ |

### FileSaver関連（UT-MED-070〜076）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 | FileSaver.persistFileToMedia()がファイル保存とサムネイル生成メッセージをディスパッチ | E-13 (line 65-108) | ○ |
| C-45 | FileSaver.persistFileToMedia()がvalidateFileNameを呼び出し | E-13 (line 72) | ○ |
| C-46 | FileSaver.persistFileToMedia()がensureFileNameIsUniqueを呼び出し | E-13 (line 73-78) | ○ |
| C-47 | FileSaver.renameMedia()がファイル名変更を実行 | E-13 (line 110-132) | ○ |

### FileLoader関連（UT-MED-077〜079）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | FileLoader.loadMediaFile()がファイル内容を文字列で返却 | E-14 (line 35-39) | ○ |
| C-49 | FileLoader.loadMediaFileStream()がStreamInterfaceを返却 | E-14 (line 42-48) | ○ |
| C-50 | FileLoader.findMediaById()が存在しないIDでMediaExceptionをスロー | E-14 (line 69-81) | ○ |

### FileNameValidator関連（UT-MED-080〜087）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | FileNameValidator.validateFileName()が空文字でMediaExceptionをスロー | E-15 (line 46-48) | ○ |
| C-52 | FileNameValidator.validateFileName()が禁止文字を検証 | E-15 (line 78-88, 13-30) | ○ |
| C-53 | FileNameValidator.validateFileName()がドット開始/終了を検証 | E-15 (line 67-76) | ○ |
| C-54 | FileNameValidator.validateFileName()がスペース終端を検証 | E-15 (line 102-106) | ○ |
| C-55 | FileNameValidator.validateFileName()が255文字制限を検証 | E-15 (line 109-116, 32) | ○ |
| C-56 | FileNameValidator.validateFileName()が制御文字を検証 | E-15 (line 90-99) | ○ |

### MediaFile関連（UT-MED-088〜093）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | MediaFile.getFileName()がファイル名を返却 | E-16 (line 19-22) | ○ |
| C-58 | MediaFile.getMimeType()がMIMEタイプを返却 | E-16 (line 24-27) | ○ |
| C-59 | MediaFile.getFileExtension()が拡張子を返却 | E-16 (line 29-32) | ○ |
| C-60 | MediaFile.getFileSize()がファイルサイズを返却 | E-16 (line 34-37) | ○ |
| C-61 | MediaFile.getHash()がハッシュを返却（nullable） | E-16 (line 39-42) | ○ |

### TypeDetector関連（UT-MED-094〜095）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | TypeDetector.detect()が複数のTypeDetectorをチェーン処理 | E-17 (line 21-29) | ○ |

### MediaType関連（UT-MED-096〜101）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | MediaType.is()がフラグ判定を行う | E-18 (line 47-50) | ○ |
| C-64 | MediaType.setFlags()がフラグを設定 | E-18 (line 23-28) | ○ |
| C-65 | MediaType.addFlag()がフラグを追加 | E-18 (line 30-35) | ○ |
| C-66 | MediaType.addFlags()が複数フラグを追加 | E-18 (line 40-45) | ○ |
| C-67 | MediaType.getApiAlias()がmedia_type_プレフィックスを付与 | E-18 (line 60-63) | ○ |

### UnusedMediaPurger関連（UT-MED-102〜109）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | UnusedMediaPurger.getNotUsedMedia()が未使用メディアをジェネレータで返却 | E-20 (line 54-89) | ○ |
| C-69 | UnusedMediaPurger.getNotUsedMedia()がgracePeriodDaysでフィルタ | E-20 (line 70-71, 149-162) | ○ |
| C-70 | UnusedMediaPurger.deleteNotUsedMedia()が未使用メディアを削除 | E-20 (line 91-122) | ○ |
| C-71 | UnusedMediaPurger.deleteNotUsedMedia()がイベントをディスパッチ | E-20 (line 105) | ○ |
| C-72 | UnusedMediaPurger.createFilterForNotUsedMedia()が存在しないフォルダでMediaExceptionをスロー | E-20 (line 268-269) | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし
  - 全テストケースがソースコードに基づいて生成されており、根拠が明確です。

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全テストケースがソースコードに直接対応しており、信頼度は高い
- 以下の項目は特に重点的なレビューを推奨：
  1. **サムネイル生成機能（ThumbnailService）**：画像処理の複雑なロジックを含むため、エッジケースの追加検討を推奨
  2. **ファイル名バリデーション（FileNameValidator）**：セキュリティに関わるため、追加の攻撃パターンのテストを検討
  3. **未使用メディア削除（UnusedMediaPurger）**：データ削除を伴うため、関連テーブルへの影響を確認

## 6) レビュアーチェックリスト（最小）
- [ ] MediaEntity.hasFile()のロジックが全パターンカバーされているか
- [ ] ThumbnailServiceのremoteThumbnailsEnable設定による分岐が適切にテストされているか
- [ ] FileNameValidatorの禁止文字リストが最新のセキュリティ要件を満たしているか
- [ ] UnusedMediaPurgerの削除対象判定ロジックが正確か
- [ ] プライベート/パブリックファイルシステムの分岐が適切にテストされているか
- [ ] 例外ハンドリングのテストケースが全ての例外タイプをカバーしているか
