---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 50
  claims_with_evidence: 50
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：storage-gcs 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：50 / 50、根拠なし：0
- 優先レビュー（高）
  1. **なし**：全てのテストケースにソースコードの根拠あり

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

- E-01: `packages/storage-gcs/src/index.ts` - gcsStorage関数、gcsStorageInternal関数の定義
- E-02: `packages/storage-gcs/src/generateURL.ts` - getGenerateURL関数の定義
- E-03: `packages/storage-gcs/src/handleDelete.ts` - getHandleDelete関数の定義
- E-04: `packages/storage-gcs/src/handleUpload.ts` - getHandleUpload関数の定義
- E-05: `packages/storage-gcs/src/staticHandler.ts` - getHandler関数の定義
- E-06: `packages/storage-gcs/src/generateSignedURL.ts` - getGenerateSignedURLHandler関数の定義
- E-07: `packages/storage-gcs/src/client/GcsClientUploadHandler.ts` - GcsClientUploadHandler定義
- E-08: `packages/storage-gcs/src/exports/client.ts` - クライアントエクスポート定義

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

### gcsStorage / gcsStorageInternal（index.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 有効な設定でPluginが生成されること | E-01: L73-148 gcsStorage関数定義 | ○ |
| C-02 | enabled=trueでプラグインが有効化 | E-01: L89, L108-110 enabled判定ロジック | ○ |
| C-03 | enabled=falseでプラグインが無効化 | E-01: L108-110 isPluginDisabled判定 | ○ |
| C-04 | clientCacheKeyが使用される | E-01: L76 cacheKey設定 | ○ |
| C-05 | Storageクライアントがキャッシュされる | E-01: L78-85 getStorageClient, gcsClients Map | ○ |
| C-06 | collectionsにアダプターが設定される | E-01: L113-124 collectionsWithAdapter生成 | ○ |
| C-07 | disableLocalStorageがtrueに設定 | E-01: L129-142 collection.upload設定 | ○ |
| C-08 | クライアントアップロードが初期化される | E-01: L91-106 initClientUploads呼び出し | ○ |
| C-09 | 空collectionsでエラーなし | E-01: L113-124 Object.entries処理 | ○ |
| C-10 | GeneratedAdapterが正しいプロパティを持つ | E-01: L154-169 gcsStorageInternal戻り値 | ○ |
| C-11 | clientUploadsが設定に含まれる | E-01: L157 clientUploads設定 | ○ |

### getGenerateURL（generateURL.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-12 | 公開URLが正しく生成される | E-02: L11-17 publicUrl()呼び出し | ○ |
| C-13 | prefixがURLに含まれる | E-02: L15 path.posix.join(prefix, filename) | ○ |
| C-14 | 日本語ファイル名がデコードされる | E-02: L14 decodeURIComponent | ○ |
| C-15 | 空ファイル名のエッジケース | E-02: L13 filename引数 | ○ |

### getHandleDelete（handleDelete.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 | ファイルが正常に削除される | E-03: L11-16 delete()呼び出し | ○ |
| C-17 | prefixでパス結合される | E-03: L13 path.posix.join(prefix, filename) | ○ |
| C-18 | 存在しないファイルでエラーなし | E-03: L13-15 ignoreNotFound: true | ○ |
| C-19 | prefixデフォルト値が使用される | E-03: L12 prefix = '' デフォルト値 | ○ |

### getHandleUpload（handleUpload.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | ファイルがアップロードされる | E-04: L25-29 gcsFile.save()呼び出し | ○ |
| C-21 | Content-Typeが設定される | E-04: L27 contentType: file.mimeType | ○ |
| C-22 | acl=PublicでmakePublic()呼び出し | E-04: L31-33 acl判定とメソッド呼び出し | ○ |
| C-23 | acl=PrivateでmakePrivate()呼び出し | E-04: L31-33 `make${acl}()`動的呼び出し | ○ |
| C-24 | acl未設定時にACLメソッド呼び出されない | E-04: L31 if (acl)判定 | ○ |
| C-25 | data.prefixが優先される | E-04: L22 data.prefix || prefix | ○ |
| C-26 | dataオブジェクトが返却される | E-04: L35 return data | ○ |
| C-27 | 空prefixのエッジケース | E-04: L19 prefix = '' デフォルト値 | ○ |

### getHandler（staticHandler.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | ファイルが取得される | E-05: L69-91 ReadableStream生成 | ○ |
| C-29 | Content-Typeヘッダーが設定される | E-05: L45 headers.append('Content-Type', ...) | ○ |
| C-30 | ETagヘッダーが設定される | E-05: L46 headers.append('ETag', ...) | ○ |
| C-31 | SVGでContent-Security-Policy設定 | E-05: L49-51 svg+xml判定とCSP設定 | ○ |
| C-32 | If-None-Match一致で304返却 | E-05: L61-66 etag比較とstatus 304 | ○ |
| C-33 | Rangeリクエストが処理される | E-05: L24-33 getRangeRequestInfo呼び出し | ○ |
| C-34 | 無効なRangeでエラー返却 | E-05: L28-33 type === 'invalid'判定 | ○ |
| C-35 | ファイル未検出で404返却 | E-05: L93-94 ApiError code 404判定 | ○ |
| C-36 | GCSエラーで500返却 | E-05: L96-97 エラーハンドリング | ○ |
| C-37 | modifyResponseHeadersが呼び出される | E-05: L53-59 modifyResponseHeaders判定と呼び出し | ○ |

### getGenerateSignedURLHandler（generateSignedURL.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | 署名付きURLが生成される | E-06: L52-62 getSignedUrl()呼び出し | ○ |
| C-39 | ファイル名がサニタイズされる | E-06: L49 sanitizeFilename(filename) | ○ |
| C-40 | prefixが適用される | E-06: L43-50 prefix取得とpath.posix.join | ○ |
| C-41 | req.json未定義でAPIError | E-06: L28-30 if (!req.json)判定 | ○ |
| C-42 | コレクション未検出でAPIError | E-06: L39-41 !collectionS3Config判定 | ○ |
| C-43 | アクセス拒否でForbidden | E-06: L45-47 access()判定とForbiddenスロー | ○ |
| C-44 | デフォルトアクセス関数がreq.user確認 | E-06: L19 defaultAccess関数定義 | ○ |
| C-45 | 有効期限が5時間に設定 | E-06: L58 expires: Date.now() + 60 * 60 * 5 | ○ |

### GcsClientUploadHandler（client/GcsClientUploadHandler.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | 署名URL取得とファイルアップロード | E-07: L12-28 fetch呼び出し2回 | ○ |
| C-47 | Content-Lengthヘッダー設定 | E-07: L26 'Content-Length': file.size.toString() | ○ |
| C-48 | Content-Typeヘッダー設定 | E-07: L26 'Content-Type': file.type | ○ |
| C-49 | credentials=include設定 | E-07: L18 credentials: 'include' | ○ |
| C-50 | prefixが返却される | E-07: L30-32 return { prefix } | ○ |

## 4) 不足情報（Unknown / Missing）
- **なし**：全てのテストケースがソースコードから直接導出されている

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**：全テストケースにソースコードの根拠あり
- 外部依存（@google-cloud/storage）のモック戦略についてはテスト実装時に検討が必要

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースが主要な関数・メソッドを網羅しているか確認
- [ ] 正常系・異常系・境界値のバランスが適切か確認
- [ ] GCSクライアントのモック戦略が実装可能か確認
- [ ] セキュリティ関連テスト（パストラバーサル、アクセス制御）が含まれているか確認
- [ ] エラーハンドリングのテストケースが適切か確認
