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

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：125 / 125、根拠なし：0
- 優先レビュー（高）
  1. **PluginLifecycleService**：プラグインライフサイクル管理の中核クラス（26件）
  2. **PluginService**：プラグイン検出・同期の重要機能（8件）
  3. **RequirementsValidator**：依存関係チェックの重要機能（4件）

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

- E-01: `src/Core/Framework/Plugin/PluginEntity.php` - プラグインエンティティ定義
- E-02: `src/Core/Framework/Plugin/PluginDefinition.php` - DAL定義
- E-03: `src/Core/Framework/Plugin/PluginCollection.php` - コレクションクラス
- E-04: `src/Core/Framework/Plugin/PluginService.php` - プラグイン検出・同期サービス
- E-05: `src/Core/Framework/Plugin/PluginLifecycleService.php` - ライフサイクル管理サービス
- E-06: `src/Core/Framework/Plugin/PluginManagementService.php` - プラグイン管理サービス
- E-07: `src/Core/Framework/Plugin/PluginZipDetector.php` - ZIP検出
- E-08: `src/Core/Framework/Plugin/ExtensionExtractor.php` - ZIP展開
- E-09: `src/Core/Framework/Plugin/KernelPluginCollection.php` - カーネルプラグインコレクション
- E-10: `src/Core/Framework/Plugin/BundleConfigGenerator.php` - バンドル設定生成
- E-11: `src/Core/Framework/Plugin/Util/VersionSanitizer.php` - バージョンサニタイザー
- E-12: `src/Core/Framework/Plugin/Util/PluginFinder.php` - プラグイン検出
- E-13: `src/Core/Framework/Plugin/Util/AssetService.php` - アセット管理
- E-14: `src/Core/Framework/Plugin/Util/PluginIdProvider.php` - プラグインID取得
- E-15: `src/Core/Framework/Plugin/Util/ZipUtils.php` - ZIPユーティリティ
- E-16: `src/Core/Framework/Plugin/Requirement/RequirementsValidator.php` - 要件バリデーター
- E-17: `src/Core/Framework/Plugin/Context/InstallContext.php` - インストールコンテキスト
- E-18: `src/Core/Framework/Plugin/Context/ActivateContext.php` - アクティブ化コンテキスト
- E-19: `src/Core/Framework/Plugin/Context/DeactivateContext.php` - 非アクティブ化コンテキスト
- E-20: `src/Core/Framework/Plugin/Context/UpdateContext.php` - アップデートコンテキスト
- E-21: `src/Core/Framework/Plugin/Context/UninstallContext.php` - アンインストールコンテキスト
- E-22: `src/Core/Framework/Plugin/KernelPluginLoader/KernelPluginLoader.php` - カーネルプラグインローダー
- E-23: `src/Core/Framework/Plugin/KernelPluginLoader/StaticKernelPluginLoader.php` - 静的ローダー
- E-24: `src/Core/Framework/Plugin/Subscriber/PluginLoadedSubscriber.php` - ロードイベントサブスクライバー
- E-25: `src/Core/Framework/Plugin/Subscriber/PluginAclPrivilegesSubscriber.php` - ACL権限サブスクライバー
- E-26: `src/Core/Framework/Plugin/Struct/PluginFromFileSystemStruct.php` - ファイルシステム構造体
- E-27: `src/Core/Framework/Plugin/Aggregate/PluginTranslation/PluginTranslationEntity.php` - 翻訳エンティティ
- E-28: `src/Core/Framework/Plugin/Aggregate/PluginTranslation/PluginTranslationDefinition.php` - 翻訳定義
- E-29: `src/Core/Framework/Plugin/PluginException.php` - 例外クラス

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

### PluginEntity関連（C-01〜C-12）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | ベースクラス名が正しく取得できること | E-01 L75-78 | ○ |
| C-02 | ベースクラス名が正しく設定できること | E-01 L83-86 | ○ |
| C-03 | custom/配下にある場合にtrueを返すこと | E-01 L138-141 | ○ |
| C-04 | vendor/配下にある場合にfalseを返すこと | E-01 L138-141 | ○ |
| C-05 | pathがnullの場合にfalseを返すこと | E-01 L140 null合体演算子 | ○ |
| C-06 | custom/plugins/配下にある場合にtrueを返すこと | E-01 L143-146 | ○ |
| C-07 | custom/apps/配下にある場合にfalseを返すこと | E-01 L143-146 | ○ |
| C-08 | 翻訳コレクションが正しく取得できること | E-01 L286-289 | ○ |
| C-09 | 支払い方法コレクションが正しく取得できること | E-01 L296-299 | ○ |
| C-10 | iconRawがシリアライズから除外されること | E-01 L322-328 | ○ |
| C-11 | アクティブ状態が正しく取得できること | E-01 L108-111 | ○ |
| C-12 | Composer管理フラグが正しく取得できること | E-01 L118-121 | ○ |

### PluginDefinition/Collection関連（C-13〜C-17）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | エンティティ名が"plugin"を返すこと | E-02 L30, L32-35 | ○ |
| C-14 | コレクションクラスがPluginCollectionを返すこと | E-02 L37-40 | ○ |
| C-15 | エンティティクラスがPluginEntityを返すこと | E-02 L42-45 | ○ |
| C-16 | APIエイリアスがplugin_collectionを返すこと | E-03 L14-17 | ○ |
| C-17 | 期待クラスがPluginEntityを返すこと | E-03 L19-22 | ○ |

### PluginService関連（C-18〜C-25）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | ファイルシステムからプラグインが正しく読み込まれること | E-04 L46-141 refreshPlugins | ○ |
| C-19 | 無効なcomposer.jsonの場合エラーコレクションにエラーが追加されること | E-04 L60-67 | ○ |
| C-20 | ファイルシステムにないプラグインがDBから削除されること | E-04 L130-138 | ○ |
| C-21 | プラグイン名でエンティティが取得できること | E-04 L146-157 | ○ |
| C-22 | 存在しないプラグイン名の場合に例外がスローされること | E-04 L152-154 | ○ |
| C-23 | 新バージョンがある場合にtrueを返すこと | E-04 L164-167 version_compare | ○ |
| C-24 | 同バージョンの場合にfalseを返すこと | E-04 L164-167 | ○ |
| C-25 | 古いバージョンの場合にfalseを返すこと | E-04 L164-167 | ○ |

### PluginLifecycleService関連（C-26〜C-45）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-26 | プラグインが正しくインストールされること | E-05 L107-174 installPlugin | ○ |
| C-27 | 既にインストール済みの場合は何もしないこと | E-05 L121-123 | ○ |
| C-28 | マイグレーションが実行されること | E-05 L154, L583-590 | ○ |
| C-29 | PluginPreInstallEventが発火されること | E-05 L148 | ○ |
| C-30 | PluginPostInstallEventが発火されること | E-05 L164 | ○ |
| C-31 | プラグインが正しくアンインストールされること | E-05 L179-246 uninstallPlugin | ○ |
| C-32 | 未インストールの場合に例外がスローされること | E-05 L184-186 | ○ |
| C-33 | アクティブな場合は先に非アクティブ化されること | E-05 L188-190 | ○ |
| C-34 | keepUserData=trueの場合ユーザーデータが保持されること | E-05 L211-215, L219-220 | ○ |
| C-35 | プラグインが正しくアップデートされること | E-05 L251-329 updatePlugin | ○ |
| C-36 | 未インストールの場合に例外がスローされること | E-05 L253-255 | ○ |
| C-37 | アップデート失敗時にアクティブプラグインが非アクティブ化されること | E-05 L285-301 | ○ |
| C-38 | プラグインが正しくアクティブ化されること | E-05 L334-397 activatePlugin | ○ |
| C-39 | 未インストールの場合に例外がスローされること | E-05 L336-338 | ○ |
| C-40 | 既にアクティブな場合は何もしないこと | E-05 L351-353 | ○ |
| C-41 | reactivate=trueの場合は再アクティブ化されること | E-05 L351 | ○ |
| C-42 | プラグインが正しく非アクティブ化されること | E-05 L404-485 deactivatePlugin | ○ |
| C-43 | 未インストールの場合に例外がスローされること | E-05 L406-408 | ○ |
| C-44 | 非アクティブの場合に例外がスローされること | E-05 L410-412 | ○ |
| C-45 | 依存プラグインがアクティブな場合に例外がスローされること | E-05 L414-423 | ○ |

### PluginManagementService関連（C-46〜C-51）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | プラグインZIPが正しく展開されること | E-06 L35-54 extractPluginZip | ○ |
| C-47 | アプリZIPが正しく展開されること | E-06 L46-51 | ○ |
| C-48 | storeType指定時は検出をスキップすること | E-06 L37-44 | ○ |
| C-49 | アップロードされたプラグインが展開されること | E-06 L56-73 uploadPlugin | ○ |
| C-50 | プラグインが正しく削除されること | E-06 L99-111 deletePlugin | ○ |
| C-51 | Composer管理プラグインは削除できないこと | E-06 L103-105 | ○ |

### PluginZipDetector関連（C-52〜C-56）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | プラグインZIPが正しく検出されること | E-07 L18-35 detect | ○ |
| C-53 | アプリZIPが正しく検出されること | E-07 L27-29 | ○ |
| C-54 | プラグインでもアプリでもない場合に例外がスローされること | E-07 L30 | ○ |
| C-55 | composer.jsonがありmanifest.xmlがない場合にtrueを返すこと | E-07 L37-52 isPlugin | ○ |
| C-56 | manifest.xmlがある場合にtrueを返すこと | E-07 L54-67 isApp | ○ |

### ExtensionExtractor関連（C-57〜C-61）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | プラグインが正しく展開されること | E-08 L32-71 extract | ○ |
| C-58 | 書き込み不可ディレクトリの場合に例外がスローされること | E-08 L38-42 | ○ |
| C-59 | 既存プラグインがバックアップされること | E-08 L47-48 | ○ |
| C-60 | ディレクトリトラバーサルが検出された場合に例外がスローされること | E-08 L131-136 assertNoDirectoryTraversal | ○ |
| C-61 | プレフィックスが一致しないファイルで例外がスローされること | E-08 L118-129 assertPrefix | ○ |

### KernelPluginCollection関連（C-62〜C-70）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | プラグインが正しく追加されること | E-09 L20-29 add | ○ |
| C-63 | 重複プラグインは追加されないこと | E-09 L24-25 | ○ |
| C-64 | 存在するプラグインでtrueを返すこと | E-09 L41-44 has | ○ |
| C-65 | 存在しないプラグインでfalseを返すこと | E-09 L41-44 | ○ |
| C-66 | 存在するプラグインが取得できること | E-09 L46-49 get | ○ |
| C-67 | 存在しないプラグインでnullを返すこと | E-09 L46-49 | ○ |
| C-68 | アクティブなプラグインのみ返すこと | E-09 L62-69 getActives | ○ |
| C-69 | プラグインがない場合は空配列を返すこと | E-09 L64-65 | ○ |
| C-70 | 条件に一致するプラグインのみ含むコレクションを返すこと | E-09 L71-74 filter | ○ |

### BundleConfigGenerator関連（C-71〜C-76）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-71 | プラグインとアプリの設定が統合されること | E-10 L40-43 getConfig | ○ |
| C-72 | アクティブなプラグインのみ設定が生成されること | E-10 L62-64 | ○ |
| C-73 | theme.jsonがある場合にtrueを返すこと | E-10 L120-123 isTheme | ○ |
| C-74 | main.jsが存在する場合にパスを返すこと | E-10 L125-137 getEntryFile | ○ |
| C-75 | main.tsが存在する場合にパスを返すこと | E-10 L130-133 | ○ |
| C-76 | webpack.config.jsが存在する場合にパスを返すこと | E-10 L139-162 getWebpackConfig | ○ |

### VersionSanitizer関連（C-77〜C-79）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-77 | 4桁目のバージョン番号が削除されること | E-11 L10-31 sanitizePluginVersion | ○ |
| C-78 | 3桁のバージョンはそのまま返すこと | E-11 L10-31 | ○ |
| C-79 | 2桁のバージョンもそのまま返すこと | E-11 L10-31 | ○ |

### PluginFinder関連（C-80〜C-83）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-80 | ローカルとVendorのプラグインが統合されること | E-12 L33-42 findPlugins | ○ |
| C-81 | shopware-platform-pluginタイプでtrueを返すこと | E-12 L91-94 isShopwarePluginType | ○ |
| C-82 | 有効なcomposer.jsonでtrueを返すこと | E-12 L96-101 isPluginComposerValid | ○ |
| C-83 | shopware-plugin-classがない場合にfalseを返すこと | E-12 L98-100 | ○ |

### PluginIdProvider関連（C-84〜C-85）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-84 | ベースクラスからプラグインIDが取得できること | E-14 L25-35 getPluginIdByBaseClass | ○ |
| C-85 | 存在しないベースクラスで例外がスローされること | E-14 L30-32 | ○ |

### AssetService関連（C-86〜C-88）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-86 | プラグインのアセットがコピーされること | E-13 L71-84 copyAssets | ○ |
| C-87 | force=trueでマニフェストがリセットされること | E-13 L169-171 | ○ |
| C-88 | バンドルのアセットが削除されること | E-13 L115-130 removeAssetsOfBundle | ○ |

### ZipUtils関連（C-89〜C-91）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-89 | 有効なZIPファイルが開けること | E-15 L13-30 openZip | ○ |
| C-90 | ファイルが存在しない場合に例外がスローされること | E-15 L17-19 | ○ |
| C-91 | ZIPファイルでない場合に例外がスローされること | E-15 L21-23 | ○ |

### RequirementsValidator関連（C-92〜C-95）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-92 | Composer管理プラグインはバリデーションをスキップすること | E-16 L51-56 validateRequirements | ○ |
| C-93 | 要件が満たされない場合に例外がスローされること | E-16 L69 tryToThrow | ○ |
| C-94 | アクティブな依存プラグインのリストが返却されること | E-16 L79-88 resolveActiveDependants | ○ |
| C-95 | 非アクティブな依存は含まれないこと | E-16 L82-84 | ○ |

### Context関連（C-96〜C-100）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-96 | プラグインインスタンスが取得できること | E-17 L24-27 getPlugin | ○ |
| C-97 | デフォルトでtrueを返すこと | E-17 L13 autoMigrate初期値 | ○ |
| C-98 | 自動マイグレーション設定が変更できること | E-17 L54-57 setAutoMigrate | ○ |
| C-99 | アップデート後のバージョンが取得できること | E-20 L23-26 getUpdatePluginVersion | ○ |
| C-100 | ユーザーデータ保持フラグが取得できること | E-21 L25-29 keepUserData | ○ |

### KernelPluginLoader関連（C-101〜C-109）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-101 | 絶対パスがそのまま返されること | E-22 L45-53 getPluginDir | ○ |
| C-102 | 相対パスがプロジェクトディレクトリと結合されること | E-22 L45-53 | ○ |
| C-103 | プラグインが初期化されること | E-22 L108-125 initializePlugins | ○ |
| C-104 | 2回目の呼び出しは何もしないこと | E-22 L110-112 | ○ |
| C-105 | アクティブプラグインと追加バンドルが返されること | E-22 L80-103 getBundles | ○ |
| C-106 | 未初期化の場合は何も返さないこと | E-22 L82-84 | ○ |
| C-107 | アクティブプラグインのインスタンスが返されること | E-22 L156-164 getPluginInstance | ○ |
| C-108 | 非アクティブの場合はnullを返すこと | E-22 L159-161 | ○ |
| C-109 | コンストラクタで渡されたプラグイン情報がそのまま使用されること | E-23 L11-19 | ○ |

### Subscriber関連（C-110〜C-113）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-110 | iconRawがBase64エンコードされてiconに設定されること | E-24 L27-34 unserialize | ○ |
| C-111 | iconRawがnullの場合はiconが設定されないこと | E-24 L30 条件分岐 | ○ |
| C-112 | プラグインの追加権限がロールにマージされること | E-25 L36-49 onAclRoleLoaded | ○ |
| C-113 | ALL_ROLE_KEYの権限が全ロールに追加されること | E-25 L44 | ○ |

### Struct/Translation関連（C-114〜C-119）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-114 | ベースクラスからプラグイン名が抽出されること | E-26 L40-47 getName | ○ |
| C-115 | 名前空間なしの場合はそのまま返すこと | E-26 L46 | ○ |
| C-116 | ラベルが取得できること | E-27 L39-42 getLabel | ○ |
| C-117 | 親プラグインが取得できること | E-27 L79-82 getPlugin | ○ |
| C-118 | エンティティ名がplugin_translationを返すこと | E-28 L18, L20-23 | ○ |
| C-119 | 親定義がPluginDefinitionを返すこと | E-28 L40-43 getParentDefinitionClass | ○ |

### PluginException関連（C-120〜C-125）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-120 | PluginNotFoundExceptionが生成されること | E-29 L161-164 notFound | ○ |
| C-121 | PluginNotInstalledExceptionが生成されること | E-29 L166-169 notInstalled | ○ |
| C-122 | PluginNotActivatedExceptionが生成されること | E-29 L171-174 notActivated | ○ |
| C-123 | PluginHasActiveDependantsExceptionが生成されること | E-29 L179-182 hasActiveDependants | ○ |
| C-124 | Composer管理削除エラーが生成されること | E-29 L53-61 cannotDeleteManaged | ○ |
| C-125 | PluginExtractionExceptionが生成されること | E-29 L293-296 pluginExtractionError | ○ |

## 4) 不足情報（Unknown / Missing）
- なし。すべてのテストケースはソースコードに基づいて生成されています。

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - すべてのテストケースはソースコードから直接導出されており、信頼性が高い
- 注意点:
  - PluginLifecycleServiceのテストは複雑な状態遷移を含むため、実装時に注意が必要
  - RequirementsValidatorはComposerパッケージとの依存関係があり、モック設計が重要
  - ExtensionExtractorのセキュリティテスト（ディレクトリトラバーサル）は特に重要

## 6) レビュアーチェックリスト（最小）
- [ ] PluginLifecycleServiceのインストール/アンインストール/アクティブ化/非アクティブ化の状態遷移テストケースが網羅されているか
- [ ] PluginServiceのプラグイン検出・同期ロジックのエッジケースがカバーされているか
- [ ] セキュリティ関連（ディレクトリトラバーサル、Composer管理プラグイン削除制限）のテストケースが適切か
- [ ] 例外ハンドリングのテストケースが各異常系を網羅しているか
- [ ] 依存関係チェック（RequirementsValidator）のテストケースが十分か
