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

# 根拠レポート：plugin-nested-docs 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

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

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

- E-01: `packages/plugin-nested-docs/src/index.ts` - プラグインのエントリポイント、nestedDocsPlugin関数の定義
- E-02: `packages/plugin-nested-docs/src/types.ts` - 型定義（Breadcrumb, NestedDocsPluginConfig, GenerateURL, GenerateLabel）
- E-03: `packages/plugin-nested-docs/src/fields/breadcrumbs.ts` - createBreadcrumbsField関数の定義
- E-04: `packages/plugin-nested-docs/src/fields/parent.ts` - createParentField関数の定義
- E-05: `packages/plugin-nested-docs/src/fields/parentFilterOptions.ts` - parentFilterOptions関数の定義
- E-06: `packages/plugin-nested-docs/src/utilities/formatBreadcrumb.ts` - formatBreadcrumb関数の定義
- E-07: `packages/plugin-nested-docs/src/utilities/getParents.ts` - getParents関数の定義
- E-08: `packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts` - populateBreadcrumbs関数の定義
- E-09: `packages/plugin-nested-docs/src/hooks/populateBreadcrumbsBeforeChange.ts` - beforeChangeフック定義
- E-10: `packages/plugin-nested-docs/src/hooks/resaveSelfAfterCreate.ts` - afterChangeフック（自己再保存）定義
- E-11: `packages/plugin-nested-docs/src/hooks/resaveChildren.ts` - afterChangeフック（子ドキュメント再保存）定義

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

### nestedDocsPlugin（src/index.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 対象コレクションにフックとフィールドが追加される | E-01: L19-66のcollections.mapでフック/フィールド追加 | ○ |
| C-02 | 対象外のコレクションはそのまま返却される | E-01: L67-68のreturn collection | ○ |
| C-03 | 既存breadcrumbsフィールドがある場合は追加しない | E-01: L23-26のexistingBreadcrumbField検索、L46-48の条件分岐 | ○ |
| C-04 | 既存parentフィールドがある場合は追加しない | E-01: L28-30のexistingParentField検索、L40-44の条件分岐 | ○ |
| C-05 | 既存parentフィールドにfilterOptionsがない場合デフォルト設定 | E-01: L34-37のfilterOptions設定ロジック | ○ |
| C-06 | カスタムbreadcrumbsFieldSlugで検索される | E-01: L25のpluginConfig?.breadcrumbsFieldSlug参照 | ○ |
| C-07 | カスタムparentFieldSlugで検索される | E-01: L29のpluginConfig?.parentFieldSlug参照 | ○ |
| C-08 | collectionsが空配列の場合全コレクションがそのまま返却 | E-01: L20のindexOf条件で-1となり対象外扱い | ○ |
| C-09 | config.collectionsがundefinedの場合空配列として処理 | E-01: L19の(config.collections || [])によるフォールバック | ○ |

### createBreadcrumbsField（src/fields/breadcrumbs.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-10 | デフォルト設定でbreadcrumbsフィールド生成 | E-03: L3-47のフィールド定義（name='breadcrumbs', type='array', localized=true） | ○ |
| C-11 | オーバーライドオプションが適用される | E-03: L10のスプレッド構文(overrides || {})によるマージ | ○ |
| C-12 | admin.readOnlyがデフォルトでtrue | E-03: L12-14のadmin設定 | ○ |
| C-13 | 追加のfieldsがマージされる | E-03: L45の...(overrides?.fields || [])によるマージ | ○ |
| C-14 | overridesが空オブジェクトでもデフォルト設定適用 | E-03: L10のフォールバック処理 | ○ |

### createParentField（src/fields/parent.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 | デフォルト設定でparentフィールド生成 | E-04: L3-22のフィールド定義（name='parent', type='relationship', maxDepth=1） | ○ |
| C-16 | admin.positionがデフォルトでsidebar | E-04: L12-14のadmin.position='sidebar' | ○ |
| C-17 | オーバーライドオプションが適用される | E-04: L21のスプレッド構文...(overrides || {})によるマージ | ○ |
| C-18 | overridesがundefinedでもデフォルト設定適用 | E-04: L14の(overrides?.admin || {})によるフォールバック | ○ |

### parentFilterOptions（src/fields/parentFilterOptions.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | idが存在する場合、自身と子孫を除外するフィルタ返却 | E-05: L6-10のif(id)条件でフィルタオブジェクト返却 | ○ |
| C-20 | idがundefinedの場合true返却 | E-05: L13のreturn true | ○ |
| C-21 | カスタムbreadcrumbsFieldSlugが使用される | E-05: L9の`${breadcrumbsFieldSlug}.doc`テンプレートリテラル | ○ |
| C-22 | idが空文字の場合trueが返却される | E-05: L6のif(id)条件で空文字はfalsyとして扱われる | ○ |

### formatBreadcrumb（src/utilities/formatBreadcrumb.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | generateURLが関数の場合URLが生成される | E-06: L31-33のtypeof generateURL === 'function'チェック | ○ |
| C-24 | generateURLがない場合urlはundefined | E-06: L26のlet url: string | undefined = undefinedと条件不成立時の未代入 | ○ |
| C-25 | generateLabelが関数の場合ラベルが生成される | E-06: L35-36のtypeof generateLabel === 'function'チェック | ○ |
| C-26 | generateLabelがない場合useAsTitleフィールドの値がラベル | E-06: L37-40のelse分岐でcollection.admin.useAsTitle参照 | ○ |
| C-27 | useAsTitleの値が数値の場合文字列に変換 | E-06: L40のtypeof title === 'number'チェックとString(title) | ○ |
| C-28 | useAsTitleフィールドがない場合空文字がラベル | E-06: L38の三項演算子で空文字('')をデフォルト値として設定 | ○ |
| C-29 | 既存のbreadcrumbオブジェクトがマージされる | E-06: L44の...(breadcrumb || {})スプレッド構文 | ○ |
| C-30 | doc IDが最後のドキュメントから取得される | E-06: L29のlastDoc = docs[docs.length - 1]!、L45のdoc: lastDoc.id | ○ |

### getParents（src/utilities/getParents.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | 親ドキュメントがIDで参照されている場合取得して返却 | E-07: L18-26のtypeof parent === 'string' || typeof parent === 'number'チェックとfindByID呼び出し | ○ |
| C-32 | 親ドキュメントがオブジェクトで展開済みの場合そのまま使用 | E-07: L29-31のtypeof parent === 'object'チェック | ○ |
| C-33 | 多階層の親が再帰的に取得される | E-07: L34-38の再帰的getParents呼び出し | ○ |
| C-34 | 親が存在しない場合空配列が返却される | E-07: L45のreturn docs（初期値[]） | ○ |
| C-35 | カスタムparentFieldSlugが使用される | E-07: L12のconst parentSlug = pluginConfig?.parentFieldSlug || 'parent' | ○ |
| C-36 | findByIDがnullを返す場合親なしとして処理 | E-07: L33のif(retrievedParent)条件、L23のdisableErrors: true | ○ |
| C-37 | 親のIDが数値の場合も正しく処理される | E-07: L18のtypeof parent === 'number'条件 | ○ |

### populateBreadcrumbs（src/utilities/populateBreadcrumbs.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | breadcrumbsが正しく生成されデータに追加される | E-08: L49-58のformatBreadcrumbによる生成、L60の代入 | ○ |
| C-39 | カスタムbreadcrumbsFieldNameが使用される | E-08: L19のbreadcrumbsFieldName = 'breadcrumbs'デフォルト値、L60の動的プロパティアクセス | ○ |
| C-40 | 現在のドキュメントがbreadcrumbsの最後に含まれる | E-08: L47のallParentDocuments.push(currentDocument) | ○ |
| C-41 | originalDocとdataがマージされてcurrentDocument生成 | E-08: L30-34の...originalDoc, ...data, idのマージ処理 | ○ |
| C-42 | idがoriginalDocから優先的に取得される | E-08: L33のid: originalDoc?.id ?? data?.id（null合体演算子） | ○ |
| C-43 | 親がない場合自身のみのbreadcrumbs生成 | E-08: L47のpush、getParentsが空配列返却時も自身が追加される | ○ |

### populateBreadcrumbsBeforeChange（src/hooks/populateBreadcrumbsBeforeChange.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 | beforeChangeフックでpopulateBreadcrumbs呼び出し | E-09: L9-19のpopulateBreadcrumbs呼び出しとreturn | ○ |
| C-45 | pluginConfigの設定がpopulateBreadcrumbsに渡される | E-09: L11-17の引数渡し（breadcrumbsFieldSlug, generateLabel, generateURL等） | ○ |

### resaveSelfAfterCreate（src/hooks/resaveSelfAfterCreate.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | create操作時にドキュメントが再保存される | E-10: L11-13のoperation !== 'create'チェック、L20-34のpayload.update呼び出し | ○ |
| C-47 | update操作時には何も行われない | E-10: L11-13のreturn undefined | ○ |
| C-48 | breadcrumbsの最後の要素のdocが新しいドキュメントIDで更新 | E-10: L25-28のmap処理、breadcrumbs.length === i + 1条件でdoc.id設定 | ○ |
| C-49 | カスタムbreadcrumbsFieldSlugが使用される | E-10: L16のpluginConfig.breadcrumbsFieldSlug || 'breadcrumbs' | ○ |
| C-50 | ドラフトモードが正しく設定される | E-10: L31のdraft: collection?.versions?.drafts && doc._status !== 'published' | ○ |
| C-51 | 公開済みドキュメントはdraft=falseで更新される | E-10: L31の条件で_status === 'published'の場合draft=false | ○ |
| C-52 | payload.updateがエラーを投げた場合エラーログ出力 | E-10: L35-40のcatchブロックでpayload.logger.error呼び出し | ○ |
| C-53 | breadcrumbsが空配列の場合空配列で更新 | E-10: L28の|| []フォールバック | ○ |
| C-54 | breadcrumbsがundefinedの場合空配列で更新 | E-10: L24-28のbreadcrumbs?.map || []パターン | ○ |

### resaveChildren（src/hooks/resaveChildren.ts）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | 子ドキュメントのbreadcrumbsが更新される | E-11: L68-86のfor...ofループでpayload.update呼び出し | ○ |
| C-56 | ドラフトと公開済みの両方の子が処理される | E-11: L19-47のdraftChildrenとpublishedChildrenの取得、L49-55のマージ | ○ |
| C-57 | 親がドラフトの場合子の再保存が行われない | E-11: L12-15のif条件でreturn | ○ |
| C-58 | 子ドキュメントがupdatedAtでソートされる | E-11: L57-64のsort処理、a.updatedAt比較 | ○ |
| C-59 | 同じIDの子でドラフトと公開版がある場合公開版が後に処理 | E-11: L62のa._status === 'published' ? 1 : -1ソート条件 | ○ |
| C-60 | カスタムparentFieldSlugが使用される | E-11: L17のpluginConfig?.parentFieldSlug || 'parent' | ○ |
| C-61 | 子ドキュメントが存在しない場合何も行われない | E-11: L66のif(sortedChildren.length)条件 | ○ |
| C-62 | 子の更新でエラーが発生した場合エラーログ出力 | E-11: L88-92のcatchブロックでpayload.logger.error呼び出し | ○ |
| C-63 | ValidationErrorの場合APIErrorがスローされる | E-11: L94-101のValidationError判定とthrow new APIError | ○ |
| C-64 | localeがreqから取得されて使用される | E-11: L24, L42, L84のlocale: req.locale使用 | ○ |

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

## 5) リスクフラグ（レビュー観点）
- 0（低リスク）：すべてのテストケースがソースコード実装に直接対応しており、推測による主張は含まれていません。

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースの網羅性：すべてのpublic関数がテスト対象になっているか
- [ ] 境界値テスト：空配列、undefined、nullのケースが適切にカバーされているか
- [ ] 異常系テスト：エラーハンドリングのケースが網羅されているか
- [ ] 統合テスト必要性：フック間の連携動作は単体テストではカバーしきれない可能性あり
- [ ] モック戦略：payload.find, payload.update, payload.findByIDのモック方針を確認
