---
generated_at: 2026-02-24 18:00:00
metrics:
  claims_total: 82
  claims_with_evidence: 82
  claims_without_evidence: 0
confidence_derived: 1.00
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：82 / 82、根拠なし：0
- 優先レビュー（高）
  1. 全てのテストケースはソースコードから直接導出されており、根拠不足の項目はありません

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

- E-01: `packages/storage/src/types.ts` - ストレージインターフェース定義（GiselleStorage型）
- E-02: `packages/storage/src/fs-storage-driver.ts` - ファイルシステムベースのストレージドライバ実装
- E-03: `packages/storage/src/memory-storage-driver.ts` - メモリベースのストレージドライバ実装
- E-04: `packages/storage/src/index.ts` - エクスポート定義

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

### fsStorageDriver関連テストケース

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getJson: 有効なJSONファイルを正常に読み込めること | E-02 (21-52行目) | ○ |
| C-02 | getJson: リトライ機構が正常に動作すること | E-02 (29-45行目: maxRetries=5, exponential backoff) | ○ |
| C-03 | getJson: 存在しないファイルでエラー | E-02 (26行目: fs.access) | ○ |
| C-04 | getJson: スキーマバリデーション失敗でエラー | E-02 (51行目: params.schema.parse) | ○ |
| C-05 | getJson: 不正なJSONフォーマットでエラー | E-02 (36行目: JSON.parse) | ○ |
| C-06 | setJson: JSONデータを正常に書き込み | E-02 (54-63行目) | ○ |
| C-07 | setJson: スキーマ指定時にバリデーション後書き込み | E-02 (59-61行目: params.schema.parse) | ○ |
| C-08 | setJson: 親ディレクトリ自動作成 | E-02 (58行目: ensureDir, 15-17行目) | ○ |
| C-09 | setJson: スキーマバリデーション失敗でエラー | E-02 (60行目) | ○ |
| C-10 | getBlob: バイナリファイル正常読み込み | E-02 (65-74行目) | ○ |
| C-11 | getBlob: rangeオプションで部分読み込み | E-02 (76-102行目) | ○ |
| C-12 | getBlob: end未指定でファイル末尾まで読み込み | E-02 (88-91行目) | ○ |
| C-13 | getBlob: start超過時に空配列返却 | E-02 (84, 95-97行目) | ○ |
| C-14 | getBlob: length=0で空配列返却 | E-02 (95-97行目) | ○ |
| C-15 | getBlob: ファイル未存在でエラー | E-02 (69-73行目: fs.readFile) | ○ |
| C-16 | setBlob: バイナリデータ正常書き込み | E-02 (108-113行目) | ○ |
| C-17 | setBlob: Uint8Array書き込み | E-02 (111行目: new Uint8Array(data)) | ○ |
| C-18 | setBlob: ArrayBuffer書き込み | E-02 (111行目: new Uint8Array(data)) | ○ |
| C-19 | setBlob: 親ディレクトリ自動作成 | E-02 (110行目: ensureDir) | ○ |
| C-20 | copy: ファイル正常コピー | E-02 (115-120行目) | ○ |
| C-21 | copy: コピー先親ディレクトリ自動作成 | E-02 (118行目: ensureDir) | ○ |
| C-22 | copy: コピー元未存在でエラー | E-02 (119行目: fs.copyFile) | ○ |
| C-23 | remove: ファイル正常削除 | E-02 (122-125行目) | ○ |
| C-24 | remove: ディレクトリ再帰削除 | E-02 (124行目: recursive: true) | ○ |
| C-25 | remove: 未存在パスでもエラーなし | E-02 (124行目: force: true) | ○ |
| C-26 | exists: 存在ファイルでtrue | E-02 (127-135行目) | ○ |
| C-27 | exists: 未存在ファイルでfalse | E-02 (132-134行目: catch -> false) | ○ |
| C-28 | contentLength: ファイルサイズ取得 | E-02 (137-141行目) | ○ |
| C-29 | contentLength: ファイル未存在でエラー | E-02 (139行目: fs.stat) | ○ |
| C-30 | listBlobs: ファイル一覧取得 | E-02 (143-243行目) | ○ |
| C-31 | listBlobs: prefixフィルタリング | E-02 (145, 199-203行目) | ○ |
| C-32 | listBlobs: limit件数制限 | E-02 (222-227行目) | ○ |
| C-33 | listBlobs: cursorページネーション | E-02 (147-154, 229行目) | ○ |
| C-34 | listBlobs: hasMore=trueでnextCursor返却 | E-02 (231-232行目) | ○ |
| C-35 | listBlobs: 全件取得時hasMore=false | E-02 (231行目) | ○ |
| C-36 | listBlobs: 空ディレクトリで空配列 | E-02 (171-174行目: ENOENT処理) | ○ |
| C-37 | listBlobs: 不正cursor値でエラー | E-02 (152-154行目) | ○ |
| C-38 | listBlobs: 負cursor値でエラー | E-02 (152行目: startIndex < 0) | ○ |
| C-39 | ensureDir: ディレクトリ正常作成 | E-02 (15-17行目: recursive: true) | ○ |
| C-40 | ensureDir: 既存ディレクトリでもエラーなし | E-02 (16行目: recursive: true) | ○ |

### memoryStorageDriver関連テストケース

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | getJson: JSONデータ正常取得 | E-03 (59-68行目) | ○ |
| C-42 | getJson: パス未存在でエラー | E-03 (63-64行目) | ○ |
| C-43 | getJson: スキーマバリデーション失敗でエラー | E-03 (66行目: params.schema.parse) | ○ |
| C-44 | setJson: JSONデータ正常保存 | E-03 (70-77行目) | ○ |
| C-45 | setJson: スキーマ指定時バリデーション後保存 | E-03 (71-73行目) | ○ |
| C-46 | setJson: uploadedAt記録 | E-03 (75行目: recordUpload) | ○ |
| C-47 | setJson: スキーマバリデーション失敗でエラー | E-03 (72行目) | ○ |
| C-48 | getBlob: バイナリデータ正常取得 | E-03 (79-85行目) | ○ |
| C-49 | getBlob: パス未存在でエラー | E-03 (81-83行目) | ○ |
| C-50 | setBlob: バイナリデータ正常保存 | E-03 (87-92行目) | ○ |
| C-51 | setBlob: Buffer保存 | E-03 (88行目: new Uint8Array(data)) | ○ |
| C-52 | setBlob: ArrayBuffer保存 | E-03 (88行目) | ○ |
| C-53 | setBlob: uploadedAt記録 | E-03 (90行目: recordUpload) | ○ |
| C-54 | copy: JSONデータ正常コピー | E-03 (94-100行目) | ○ |
| C-55 | copy: Blobデータ正常コピー | E-03 (102-107行目) | ○ |
| C-56 | copy: uploadedAt記録 | E-03 (98, 105行目: recordUpload) | ○ |
| C-57 | copy: コピー元未存在でエラー | E-03 (109行目) | ○ |
| C-58 | remove: JSONデータ正常削除 | E-03 (112-113行目) | ○ |
| C-59 | remove: Blobデータ正常削除 | E-03 (114行目) | ○ |
| C-60 | remove: uploadedAt同時削除 | E-03 (115行目) | ○ |
| C-61 | remove: 未存在パスでもエラーなし | E-03 (112-117行目: delete操作は存在確認しない) | ○ |
| C-62 | exists: JSON存在でtrue | E-03 (119-121行目: jsonStore.has) | ○ |
| C-63 | exists: Blob存在でtrue | E-03 (120行目: blobStore.has) | ○ |
| C-64 | exists: 未存在でfalse | E-03 (120行目: || 論理和) | ○ |
| C-65 | contentLength: JSONサイズ取得 | E-03 (123-128行目) | ○ |
| C-66 | contentLength: Blobサイズ取得 | E-03 (130-133行目) | ○ |
| C-67 | contentLength: パス未存在でエラー | E-03 (135行目) | ○ |
| C-68 | listBlobs: JSON/Blob一覧取得 | E-03 (138-196行目) | ○ |
| C-69 | listBlobs: prefixフィルタリング | E-03 (161-165行目) | ○ |
| C-70 | listBlobs: limit件数制限 | E-03 (167-172行目) | ○ |
| C-71 | listBlobs: cursorページネーション | E-03 (142-151, 174行目) | ○ |
| C-72 | listBlobs: JSON contentType=application/json | E-03 (184行目) | ○ |
| C-73 | listBlobs: Blob contentType=undefined | E-03 (184行目: 条件分岐) | ○ |
| C-74 | listBlobs: size正しく計算 | E-03 (178行目: contentLengthForKey) | ○ |
| C-75 | listBlobs: 空ストアで空配列 | E-03 (153-159行目: allKeys空の場合) | ○ |
| C-76 | listBlobs: 不正cursor値でエラー | E-03 (147-151行目) | ○ |
| C-77 | listBlobs: 負cursor値でエラー | E-03 (147行目: startIndex < 0) | ○ |
| C-78 | 初期化: initialJsonでデータ初期化 | E-03 (17-19行目) | ○ |
| C-79 | 初期化: initialBlobでデータ初期化 | E-03 (20-25行目) | ○ |
| C-80 | 初期化: 初期データuploadedAt設定 | E-03 (36-37行目: initializeUploadedAt) | ○ |
| C-81 | 初期化: 空configでインスタンス生成 | E-03 (15行目: config = {}) | ○ |
| C-82 | 初期化: configなしでインスタンス生成 | E-03 (15行目: default parameter) | ○ |

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

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全テストケースがソースコードに基づいており、根拠が明確

### 補足事項
1. **fsStorageDriverのリトライ機構**: getJsonメソッドのリトライロジック（maxRetries=5, exponential backoff）は、一時的なファイルアクセス障害に対する耐性を提供。テストでは適切にモック化が必要。
2. **range読み込み**: getBlobのrange指定は、start/endの境界値処理が複雑なため、境界値テストを重点的に確認。
3. **listBlobsのcursor**: 文字列ベースのカーソル（インデックス番号を文字列化）を使用。不正値のバリデーションを確認。

## 6) レビュアーチェックリスト（最小）
- [ ] fsStorageDriver: ファイルシステム操作のモック化戦略が適切か確認
- [ ] fsStorageDriver: リトライロジックのテスト方法（タイムアウト考慮）を確認
- [ ] fsStorageDriver: range読み込みの境界値テストが十分か確認
- [ ] memoryStorageDriver: 初期化時のデータコピー（参照コピーでないこと）を確認
- [ ] listBlobs: ページネーションのエッジケース（cursor=0、末尾ページなど）を確認
- [ ] 両ドライバ: GiselleStorageインターフェースの全メソッドがテスト対象に含まれているか確認
