---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 121
  claims_with_evidence: 115
  claims_without_evidence: 6
confidence_derived: 0.95
---

# 根拠レポート：decap-cms-widget-relation 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：115 / 121、根拠なし：6
- 優先レビュー（高）
  1. **C-007 (arrayMove 負のto値)**: 負のインデックスの具体的な挙動は実行時確認が必要
  2. **C-043, C-044, C-045 (isValid min/max検証)**: validations.validateMinMaxの内部実装が外部ライブラリ依存
  3. **C-072, C-073 (i18n対応)**: i18nデータ構造の仕様が外部仕様に依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/decap-cms-widget-relation/src/index.js` - Widget関数、エクスポート定義
- E-02: `packages/decap-cms-widget-relation/src/RelationControl.js` - RelationControlクラス、ユーティリティ関数群
- E-03: `packages/decap-cms-widget-relation/src/RelationPreview.js` - RelationPreviewコンポーネント
- E-04: `packages/decap-cms-widget-relation/src/schema.js` - スキーマ定義オブジェクト
- E-05: `packages/decap-cms-widget-relation/src/RelationCache.js` - RelationCacheクラス
- E-06: `packages/decap-cms-widget-relation/src/__tests__/relation.spec.js` - 既存テストコード
- E-07: `packages/decap-cms-widget-relation/package.json` - パッケージ依存関係

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | Widget関数がデフォルト引数で正しくオブジェクト生成 | E-01 (L5-13) | ○ |
| C-002 | カスタムオプションでWidget生成 | E-01 (L5-13, スプレッド演算子) | ○ |
| C-003 | 空オブジェクトでデフォルト維持 | E-01 (L5-13) | ○ |
| C-004 | DecapCmsWidgetRelationエクスポート | E-01 (L15-16) | ○ |
| C-005 | arrayMoveの基本動作 | E-02 (L31-35) | ○ |
| C-006 | arrayMove同位置移動 | E-02 (L31-35) | ○ |
| C-007 | arrayMove負のto値 | E-02 (L33, `to < 0 ? array.length + to : to`) | △ |
| C-008 | arrayMove空配列 | E-02 (L31-35) | ○ |
| C-009 | arrayMove 1要素 | E-02 (L31-35) | ○ |
| C-010 | optionToString正常系 | E-02 (L132-134) | ○ |
| C-011 | optionToString null | E-02 (L133, `option && option.value`) | ○ |
| C-012 | optionToString undefined | E-02 (L133) | ○ |
| C-013 | optionToString valueなし | E-02 (L133) | ○ |
| C-014 | convertToOption文字列 | E-02 (L136-139) | ○ |
| C-015 | convertToOption Immutable Map | E-02 (L141) | ○ |
| C-016 | convertToOption プレーンオブジェクト | E-02 (L141) | ○ |
| C-017 | getSelectedOptions Immutable List | E-02 (L144-152) | ○ |
| C-018 | getSelectedOptions 通常配列 | E-02 (L144-152) | ○ |
| C-019 | getSelectedOptions null | E-02 (L147-148) | ○ |
| C-020 | getSelectedOptions undefined | E-02 (L147-148) | ○ |
| C-021 | getSelectedOptions 文字列 | E-02 (L147-148) | ○ |
| C-022 | uniqOptions重複なし | E-02 (L154-156) | ○ |
| C-023 | uniqOptions重複あり | E-02 (L154-156, uniqByの使用) | ○ |
| C-024 | uniqOptions両方空 | E-02 (L154-156) | ○ |
| C-025 | getFieldArray Immutable List | E-02 (L158-164) | ○ |
| C-026 | getFieldArray単一値 | E-02 (L163) | ○ |
| C-027 | getFieldArray null | E-02 (L159-161) | ○ |
| C-028 | getFieldArray空文字列 | E-02 (L159, `!field`チェック) | ○ |
| C-029 | getSelectedValue単一選択 | E-02 (L166-181, L179) | ○ |
| C-030 | getSelectedValue複数選択 | E-02 (L167-177) | ○ |
| C-031 | getSelectedValue単一一致なし | E-02 (L179, `|| null`) | ○ |
| C-032 | getSelectedValue複数null | E-02 (L168-171) | ○ |
| C-033 | getSelectedValue複数空配列 | E-02 (L168-177) | ○ |
| C-034 | convertToSortableOption data.id付与 | E-02 (L183-192) | ○ |
| C-035 | convertToSortableOption文字列入力 | E-02 (L183-192, convertToOption呼び出し) | ○ |
| C-036 | MenuList配列children | E-02 (L112-130) | ○ |
| C-037 | MenuListローディング中 | E-02 (L113-115) | ○ |
| C-038 | MenuListオプション0件 | E-02 (L113) | ○ |
| C-039 | MenuList非配列children | E-02 (L113, `!Array.isArray(props.children)`) | ○ |
| C-040 | SortableSelect単一選択 | E-02 (L72-77) | ○ |
| C-041 | SortableSelect複数選択 | E-02 (L72-106) | ○ |
| C-042 | isValid単一選択 | E-02 (L214-232, L219-221) | ○ |
| C-043 | isValid複数min/max範囲内 | E-02 (L223-228), **外部依存: validations.validateMinMax** | △ |
| C-044 | isValid複数min未満 | E-02 (L223-228), **外部依存: validations.validateMinMax** | △ |
| C-045 | isValid複数max超過 | E-02 (L223-228), **外部依存: validations.validateMinMax** | △ |
| C-046 | isMultiple true | E-02 (L399-401) | ○ |
| C-047 | isMultiple false/未設定 | E-02 (L400, デフォルト値false) | ○ |
| C-048 | hasInitialValues複数選択値あり | E-02 (L253-259) | ○ |
| C-049 | hasInitialValues単一選択値あり | E-02 (L258) | ○ |
| C-050 | hasInitialValues空文字列 | E-02 (L258, `value && value !== ''`) | ○ |
| C-051 | hasInitialValues空配列 | E-02 (L255-256) | ○ |
| C-052 | shouldComponentUpdate value変更 | E-02 (L234-239, L236) | ○ |
| C-053 | shouldComponentUpdate hasActiveStyle変更 | E-02 (L237) | ○ |
| C-054 | shouldComponentUpdate queryHits変更 | E-02 (L238) | ○ |
| C-055 | shouldComponentUpdate変更なし | E-02 (L234-239) | ○ |
| C-056 | componentDidMount mounted=true | E-02 (L246) | ○ |
| C-057 | componentDidMount初期値ロード | E-02 (L247-250) | ○ |
| C-058 | componentDidMount初期値なしスキップ | E-02 (L248) | ○ |
| C-059 | componentWillUnmount mounted=false | E-02 (L332-334) | ○ |
| C-060 | parseHitOptionsオプション生成 | E-02 (L403-443), E-06 (テスト検証済み) | ○ |
| C-061 | parseHitOptionsデフォルトdisplay_fields | E-02 (L406), E-06 (L481-489) | ○ |
| C-062 | parseHitOptionsフィルタ機能 | E-02 (L410-423), E-06 (L623-644) | ○ |
| C-063 | parseHitOptions複数フィルタAND | E-02 (L411, `filters.every`), E-06 (L694-716) | ○ |
| C-064 | parseHitOptionsネストフィルタ | E-02 (L414-421), E-06 (L728-737) | ○ |
| C-065 | parseHitOptions空hits | E-02 (L409, reduce初期値[]) | ○ |
| C-066 | parseHitOptions空フィルタvalues | E-02 (L422), E-06 (L718-726) | ○ |
| C-067 | parseHitOptions存在しないフィルタフィールド | E-02 (L416-419, hasOwnPropertyチェック) | ○ |
| C-068 | parseHitOptionsワイルドカードパス | E-02 (L425-426), E-06 (L593-603) | ○ |
| C-069 | parseHitOptionsネストワイルドカード | E-02 (L425-435), E-06 (L605-620) | ○ |
| C-070 | parseNestedFields単純フィールド | E-02 (L383-397, L392) | ○ |
| C-071 | parseNestedFieldsテンプレート変数 | E-02 (L389-396), E-06 (L452-479) | ○ |
| C-072 | parseNestedFields i18n優先 | E-02 (L385-388) | △ |
| C-073 | parseNestedFields i18nフォールバック | E-02 (L385-388) | △ |
| C-074 | parseNestedFields深いネスト | E-02 (L392, lodash get使用) | ○ |
| C-075 | handleChange単一選択 | E-02 (L354-381, L371-380), E-06 (L381-399) | ○ |
| C-076 | handleChange複数選択 | E-02 (L354-370), E-06 (L522-549) | ○ |
| C-077 | handleChange単一null選択 | E-02 (L372-374) | ○ |
| C-078 | handleChange initialOptions更新 | E-02 (L359, L372) | ○ |
| C-079 | onSortEnd並べ替え | E-02 (L336-352) | ○ |
| C-080 | onSortEnd空オプション | E-02 (L343-350, isEmptyチェック) | ○ |
| C-081 | loadOptions検索クエリ | E-02 (L445-466), E-06 (L371-379) | ○ |
| C-082 | loadOptions options_length制限 | E-02 (L458-459), E-06 (L361-369) | ○ |
| C-083 | loadOptionsデフォルト20件制限 | E-02 (L458), E-06 (L351-359) | ○ |
| C-084 | loadOptionsクエリエラー | E-02 (L462-464) | ○ |
| C-085 | loadOptions重複除去統合 | E-02 (L459, uniqOptions使用) | ○ |
| C-086 | loadInitialOptionsキャッシュ取得 | E-02 (L261-290, L268-273) | ○ |
| C-087 | loadInitialOptions初期メタデータ更新 | E-02 (L282-286), E-06 (L401-428) | ○ |
| C-088 | loadInitialOptionsエラーハンドリング | E-02 (L287-289) | ○ |
| C-089 | loadInitialOptionsアンマウント後 | E-02 (L279) | ○ |
| C-090 | triggerInitialOnChange単一選択 | E-02 (L317-329), E-06 (L401-428) | ○ |
| C-091 | triggerInitialOnChange複数選択 | E-02 (L295-316), E-06 (L551-581) | ○ |
| C-092 | triggerInitialOnChange単一一致なし | E-02 (L318-319) | ○ |
| C-093 | triggerInitialOnChange複数一致なし | E-02 (L302-303) | ○ |
| C-094 | render基本レンダリング | E-02 (L468-504), E-06 (L351-359) | ○ |
| C-095 | render isClearable=true (required=false) | E-02 (L472) | ○ |
| C-096 | render isClearable=true (multiple) | E-02 (L472) | ○ |
| C-097 | render数値型保持 | E-02 (L434, parseNestedFieldsの戻り値型), E-06 (L490-519) | ○ |
| C-098 | renderテンプレート展開 | E-02 (L389-396), E-06 (L452-479) | ○ |
| C-099 | RelationPreview正常レンダリング | E-03 (L5-7) | ○ |
| C-100 | RelationPreview undefined | E-03 (L5-7, PropTypes.node) | ○ |
| C-101 | RelationPreview Reactノード | E-03 (L5-7, PropTypes.node) | ○ |
| C-102 | schema必須プロパティ(snake_case) | E-04 (L24-27) | ○ |
| C-103 | schema必須プロパティ(camelCase) | E-04 (L28-30) | ○ |
| C-104 | schemaフィルタ型定義 | E-04 (L12-22) | ○ |
| C-105 | schema search_fields minItems | E-04 (L5) | ○ |
| C-106 | RelationCache constructor | E-05 (L2-5) | ○ |
| C-107 | getOptionsキャッシュミス | E-05 (L7-29) | ○ |
| C-108 | getOptionsキャッシュヒット | E-05 (L10-12) | ○ |
| C-109 | getOptions重複リクエスト排除 | E-05 (L14-16) | ○ |
| C-110 | getOptionsキャッシュキー形式 | E-05 (L8) | ○ |
| C-111 | getOptionsエラー時クリーンアップ | E-05 (L26-28, finally句) | ○ |
| C-112 | getOptions空termキャッシュキー | E-05 (L8, `${term || ''}`) | ○ |
| C-113 | getOptions null fileキャッシュキー | E-05 (L8, `${file || ''}`) | ○ |
| C-114 | invalidateCollection指定削除 | E-05 (L31-37) | ○ |
| C-115 | invalidateCollection他コレクション非影響 | E-05 (L33, startsWith条件) | ○ |
| C-116 | invalidateCollection空キャッシュ | E-05 (L32, for-ofループ) | ○ |
| C-117 | ensureCacheSize範囲内 | E-05 (L39-44, maxSize=100条件) | ○ |
| C-118 | ensureCacheSize超過時削除 | E-05 (L41-43) | ○ |
| C-119 | ensureCacheSize境界値100 | E-05 (L40, `> maxSize`で100は含まない) | ○ |
| C-120 | clear両方クリア | E-05 (L47-50) | ○ |
| C-121 | clear空キャッシュ | E-05 (L47-50) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-007**: `arrayMove` の負のインデックス処理は、`to < 0 ? array.length + to : to` のロジックから推測できるが、`splice` との組み合わせによる正確な挙動は実行時テストで確認が望ましい
  - 候補：arrayMove関数の単体テスト実行結果 / Array.prototype.splice仕様書
- **C-043, C-044, C-045**: `validations.validateMinMax` は `decap-cms-lib-widgets` パッケージの外部関数であり、その内部実装の詳細（エラーメッセージの形式等）は本モジュールのソースコードからは確認不可
  - 候補：`packages/decap-cms-lib-widgets/src/validations.js` / lib-widgetsのテストコード
- **C-072, C-073**: i18n対応のデータ構造 (`hit.i18n[locale].data`) は本モジュールのコードから読み取れるが、実際のi18nデータがどのように構成されるかの仕様書が不在
  - 候補：decap-cmsのi18n設定ドキュメント / decap-cms-coreのi18n実装

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: schema.js のテストケース (C-102〜C-105) - 静的オブジェクトの構造検証のため、リスクは低い
- **0 (低リスク)**: RelationPreview のテストケース (C-099〜C-101) - 単純なラッパーコンポーネント
- **1 (中リスク)**: RelationCache のテストケース (C-106〜C-121) - キャッシュの並行処理・サイズ制限は正確な動作検証が重要
- **1 (中リスク)**: ユーティリティ関数群のテストケース (C-005〜C-035) - 型変換やnull処理の網羅性
- **2 (高リスク)**: RelationControl.isValid (C-042〜C-045) - バリデーション処理は外部ライブラリ依存で、エラーメッセージの形式が不明確
- **2 (高リスク)**: parseHitOptions フィルタ処理 (C-060〜C-069) - 複雑なネスト構造とワイルドカード展開の組み合わせ

## 6) レビュアーチェックリスト（最小）
- [ ] C-043〜C-045: `validations.validateMinMax` の実装を確認し、エラーメッセージの形式・min/maxの境界条件が正しいか検証
- [ ] C-072〜C-073: i18nデータ構造の仕様を確認し、テストケースの前提条件が妥当か検証
- [ ] C-007: `arrayMove` の負のインデックス処理の期待結果が正確か、実行時テストで確認
- [ ] C-060〜C-069: parseHitOptionsのフィルタ/ワイルドカード処理のテストケースが、既存テスト (relation.spec.js) のカバレッジと整合しているか確認
- [ ] 全体: 数値型のvalue_field (C-097) が型を維持するテストが、既存テスト (L490-519) と矛盾しないか確認
- [ ] RelationCacheの同時リクエスト排除 (C-109) が、非同期処理のタイミング問題を適切にカバーしているか確認
