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

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

## 本レポートについて

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

### チェック方法
以下の観点でドキュメントの内容（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/live-preview/src/index.ts` - モジュールのエクスポート定義
- E-02: `packages/live-preview/src/types.ts` - 型定義（CollectionPopulationRequestHandler, LivePreviewMessageEvent）
- E-03: `packages/live-preview/src/subscribe.ts` - subscribe関数の実装
- E-04: `packages/live-preview/src/handleMessage.ts` - handleMessage関数とresetCache関数の実装
- E-05: `packages/live-preview/src/mergeData.ts` - mergeData関数とdefaultRequestHandlerの実装
- E-06: `packages/live-preview/src/isLivePreviewEvent.ts` - isLivePreviewEvent関数の実装
- E-07: `packages/live-preview/src/isDocumentEvent.ts` - isDocumentEvent関数の実装
- E-08: `packages/live-preview/src/ready.ts` - ready関数の実装
- E-09: `packages/live-preview/src/unsubscribe.ts` - unsubscribe関数の実装

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

### subscribe.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | subscribeが正しいonMessage関数を返却すること | E-03: L12, L36 `return onMessage` | ○ |
| C-02 | resetCacheが呼び出されること | E-03: L17 `resetCache()` | ○ |
| C-03 | window.addEventListenerでmessageイベントが登録されること | E-03: L32-34 `if (typeof window !== 'undefined') { window.addEventListener('message', onMessage) }` | ○ |
| C-04 | windowが未定義の場合イベントリスナーが登録されないこと | E-03: L32 `if (typeof window !== 'undefined')` | ○ |
| C-05 | onMessageがcallbackを呼び出すこと | E-03: L29 `callback(mergedData)` | ○ |
| C-45 | requestHandlerが指定された場合handleMessageに渡されること | E-03: L20-27 handleMessageへの引数 | ○ |

### handleMessage.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | previousDataがundefinedにリセットされること | E-04: L19-21 `resetCache` 関数実装 | ○ |
| C-07 | 有効なライブプレビューイベントでデータがマージされること | E-04: L33, L42-52 `mergeData` 呼び出し | ○ |
| C-08 | globalSlugが指定された場合でもデータがマージされること | E-04: L38 `!collectionSlug && !globalSlug` の条件 | ○ |
| C-09 | previousDataが保存されること | E-04: L54 `_payloadLivePreview.previousData = mergedData` | ○ |
| C-10 | collectionSlugとglobalSlugの両方がない場合initialDataが返却されること | E-04: L37-40 `if (!collectionSlug && !globalSlug) { return initialData }` | ○ |
| C-11 | ライブプレビューイベントでない場合previousDataまたはinitialDataが返却されること | E-04: L59-63 | ○ |
| C-12 | previousDataが未定義の場合initialDataがpreviousDataにセットされること | E-04: L59-61 `if (!_payloadLivePreview.previousData) { _payloadLivePreview.previousData = initialData }` | ○ |
| C-46 | previousDataが存在する場合それがinitialDataとして使用されること | E-04: L48 `initialData: _payloadLivePreview?.previousData \|\| initialData` | ○ |
| C-47 | localeパラメータがmergeDataに渡されること | E-04: L49 `locale` | ○ |

### mergeData.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | 正しいURLでfetchが呼び出されること | E-05: L9 `const url = \`\${serverURL}\${apiPath}/\${endpoint}\`` | ○ |
| C-14 | リクエストボディにdataがJSON形式で含まれること | E-05: L12 `body: JSON.stringify(data)` | ○ |
| C-15 | POSTメソッドでリクエストが送信されること | E-05: L18 `method: 'POST'` | ○ |
| C-16 | 適切なヘッダーが設定されること | E-05: L14-17 Content-Type, X-Payload-HTTP-Method-Override | ○ |
| C-17 | credentials: 'include'が設定されること | E-05: L13 `credentials: 'include'` | ○ |
| C-18 | collectionSlugが指定された場合正しいエンドポイントが生成されること | E-05: L55-57 エンドポイント生成ロジック | ○ |
| C-19 | globalSlugが指定された場合正しいエンドポイントが生成されること | E-05: L55-56 `\${globalSlug ? 'globals/' : ''}` | ○ |
| C-20 | カスタムrequestHandlerが使用されること | E-05: L44 `const requestHandler = args.requestHandler \|\| defaultRequestHandler` | ○ |
| C-21 | requestHandlerが未指定の場合defaultRequestHandlerが使用されること | E-05: L44 `\|\| defaultRequestHandler` | ○ |
| C-22 | apiRouteが指定された場合それが使用されること | E-05: L47 `apiPath: apiRoute \|\| '/api'` | ○ |
| C-23 | apiRouteが未指定の場合'/api'がデフォルトで使用されること | E-05: L47 `\|\| '/api'` | ○ |
| C-24 | depthパラメータがリクエストに含まれること | E-05: L50 `depth` | ○ |
| C-25 | localeパラメータがリクエストに含まれること | E-05: L53 `locale` | ○ |
| C-26 | flattenLocalesがfalseでリクエストされること | E-05: L52 `flattenLocales: false` | ○ |
| C-27 | レスポンスがJSONとしてパースされ返却されること | E-05: L59 `.then((res) => res.json())` | ○ |
| C-28 | エンドポイントに特殊文字が含まれる場合encodeURIでエスケープされること | E-05: L55 `encodeURI(...)` | ○ |
| C-48 | incomingDataが空オブジェクトの場合も正常に処理されること | E-05: L48-49 data構造（空オブジェクトでも送信可能） | ○ |
| C-49 | initialData.idがundefinedの場合もエンドポイントが生成されること | E-05: L57 `initialData.id` 参照 | ○ |
| C-50 | fetch失敗時にエラーがスローされること | E-05: L46-59 Promiseチェーン（未処理エラーは伝播） | ○ |

### isLivePreviewEvent.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 | 有効なライブプレビューイベントでtrueが返却されること | E-06: L1-5 全条件がtrueの場合 | ○ |
| C-30 | originがserverURLと異なる場合falseが返却されること | E-06: L2 `event.origin === serverURL` | ○ |
| C-31 | event.dataがundefinedの場合falseが返却されること | E-06: L3 `event.data &&` | ○ |
| C-32 | event.dataがオブジェクトでない場合falseが返却されること | E-06: L4 `typeof event.data === 'object'` | ○ |
| C-33 | event.data.typeがpayload-live-previewでない場合falseが返却されること | E-06: L5 `event.data.type === 'payload-live-preview'` | ○ |

### isDocumentEvent.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | 有効なドキュメントイベントでtrueが返却されること | E-07: L1-5 全条件がtrueの場合 | ○ |
| C-35 | originがserverURLと異なる場合falseが返却されること | E-07: L2 `event.origin === serverURL` | ○ |
| C-36 | event.dataがundefinedの場合falseが返却されること | E-07: L3 `event.data &&` | ○ |
| C-37 | event.dataがオブジェクトでない場合falseが返却されること | E-07: L4 `typeof event.data === 'object'` | ○ |
| C-38 | event.data.typeがpayload-document-eventでない場合falseが返却されること | E-07: L5 `event.data.type === 'payload-document-event'` | ○ |

### ready.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-39 | window.openerが存在する場合openerにpostMessageが送信されること | E-08: L8 `window?.opener \|\| window?.parent` | ○ |
| C-40 | window.parentが存在する場合parentにpostMessageが送信されること | E-08: L8 `\|\| window?.parent` | ○ |
| C-41 | 正しいメッセージフォーマットで送信されること | E-08: L11-14 `{ type: 'payload-live-preview', ready: true }` | ○ |
| C-42 | windowが未定義の場合postMessageが呼び出されないこと | E-08: L4 `if (typeof window !== 'undefined')` | ○ |

### unsubscribe.ts 関連テストケース
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-43 | window.removeEventListenerでcallbackが解除されること | E-09: L3 `window.removeEventListener('message', callback)` | ○ |
| C-44 | windowが未定義の場合removeEventListenerが呼び出されないこと | E-09: L2 `if (typeof window !== 'undefined')` | ○ |

## 4) 不足情報（Unknown / Missing）
- なし（全テストケースにソースコード根拠あり）

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースがソースコードから直接導出されている

## 6) レビュアーチェックリスト（最小）
- [ ] mergeData関数のエラーハンドリング（C-50）が十分にカバーされているか確認
- [ ] SSR環境でのwindow未定義時の動作テスト（C-04, C-42, C-44）が網羅的か確認
- [ ] セキュリティ関連のorigin検証テスト（C-30, C-35）の優先度が適切か確認
- [ ] 境界値テスト（C-48, C-49）の追加が必要か検討
