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

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

## 本レポートについて

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

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

1. **根拠の有無確認**：各テストケースに対して、ソースコードが根拠（Evidence）として存在するか
2. **根拠との整合性**：テストケースの内容が実装コードと矛盾していないか
3. **網羅性**：主要な関数・メソッド・クラスを適切にカバーしているか

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

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

---

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

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

- E-01: `packages/plugin-form-builder/src/index.ts` - メインプラグイン関数 formBuilderPlugin
- E-02: `packages/plugin-form-builder/src/types.ts` - 型定義、isValidBlockConfig関数
- E-03: `packages/plugin-form-builder/src/utilities/replaceDoubleCurlys.ts` - テンプレート変数置換関数
- E-04: `packages/plugin-form-builder/src/utilities/getPaymentTotal.ts` - 支払い合計計算関数
- E-05: `packages/plugin-form-builder/src/utilities/keyValuePairToHtmlTable.ts` - HTML表生成関数
- E-06: `packages/plugin-form-builder/src/utilities/lexical/serializeLexical.ts` - Lexicalシリアライズ関数
- E-07: `packages/plugin-form-builder/src/utilities/lexical/converters/paragraph.ts` - 段落コンバーター
- E-08: `packages/plugin-form-builder/src/utilities/lexical/converters/text.ts` - テキストコンバーター
- E-09: `packages/plugin-form-builder/src/utilities/lexical/converters/heading.ts` - 見出しコンバーター
- E-10: `packages/plugin-form-builder/src/utilities/lexical/converters/link.ts` - リンクコンバーター
- E-11: `packages/plugin-form-builder/src/utilities/lexical/converters/list.ts` - リストコンバーター
- E-12: `packages/plugin-form-builder/src/utilities/lexical/converters/quote.ts` - 引用コンバーター
- E-13: `packages/plugin-form-builder/src/utilities/lexical/converters/linebreak.ts` - 改行コンバーター
- E-14: `packages/plugin-form-builder/src/utilities/lexical/nodeFormat.ts` - ノードフォーマット定数
- E-15: `packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts` - Slateシリアライズ関数
- E-16: `packages/plugin-form-builder/src/collections/Forms/index.ts` - フォームコレクション生成
- E-17: `packages/plugin-form-builder/src/collections/Forms/fields.ts` - フォームフィールドブロック定義
- E-18: `packages/plugin-form-builder/src/collections/FormSubmissions/index.ts` - サブミッションコレクション生成
- E-19: `packages/plugin-form-builder/src/collections/FormSubmissions/hooks/sendEmail.ts` - メール送信フック
- E-20: `packages/plugin-form-builder/src/collections/FormSubmissions/hooks/createCharge.ts` - 支払い処理フック
- E-21: `packages/plugin-form-builder/src/collections/FormSubmissions/fields/defaultPaymentFields.ts` - デフォルト支払いフィールド

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

### プラグインコア（UT-FRM-001 〜 UT-FRM-010）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | formBuilderPluginがデフォルト設定で正しく構成される | E-01（11-39行目） | ○ |
| C-02 | カスタムフィールド設定がマージされる | E-01（14-29行目） | ○ |
| C-03 | formsコレクションが追加される | E-01（33-37行目）, E-16 | ○ |
| C-04 | form-submissionsコレクションが追加される | E-01（33-37行目）, E-18 | ○ |
| C-05 | 既存コレクションがない場合でも動作する | E-01（34行目） | ○ |
| C-06 | isValidBlockConfigが有効なBlockConfigでtrueを返す | E-02（14-20行目） | ○ |
| C-07 | isValidBlockConfigが文字列でfalseを返す | E-02（15行目） | ○ |
| C-08 | slugがないオブジェクトでfalseを返す | E-02（17行目） | ○ |
| C-09 | fieldsが配列でないとfalseを返す | E-02（18行目） | ○ |
| C-10 | nullが渡された場合の挙動 | E-02（15-19行目） | ○ |

### 変数置換ユーティリティ（UT-FRM-011 〜 UT-FRM-018）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-11 | 単一変数が正しく置換される | E-03（10-38行目） | ○ |
| C-12 | 複数変数が正しく置換される | E-03（26-31行目） | ○ |
| C-13 | ワイルドカード*が全変数を展開する | E-03（14-16行目） | ○ |
| C-14 | ワイルドカード*:tableがHTML表を生成する | E-03（17-24行目）, E-05 | ○ |
| C-15 | 存在しない変数名がそのまま返される | E-03（34行目） | ○ |
| C-16 | variablesがundefinedの場合元の文字列が返される | E-03（12, 37行目） | ○ |
| C-17 | strがundefinedの場合undefinedが返される | E-03（12, 37行目） | ○ |
| C-18 | 空の変数配列でも動作する | E-03（26-31行目） | ○ |

### 支払い計算ユーティリティ（UT-FRM-019 〜 UT-FRM-029）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | basePriceのみの場合そのまま返される | E-04（8, 52行目） | ○ |
| C-20 | add演算子で価格が加算される | E-04（27-30行目） | ○ |
| C-21 | subtract演算子で価格が減算される | E-04（39-42行目） | ○ |
| C-22 | multiply演算子で価格が乗算される | E-04（35-38行目） | ○ |
| C-23 | divide演算子で価格が除算される | E-04（31-34行目） | ○ |
| C-24 | equals条件が正しく評価される | E-04（22行目） | ○ |
| C-25 | notEquals条件が正しく評価される | E-04（23行目） | ○ |
| C-26 | フィールドが存在しない場合条件が無視される | E-04（19行目） | ○ |
| C-27 | priceConditionsが空配列の場合basePriceが返される | E-04（12行目） | ○ |
| C-28 | basePriceが指定されていない場合0がデフォルトになる | E-04（8行目） | ○ |
| C-29 | 複数の条件が順番に適用される | E-04（13行目、forEach） | ○ |

### HTML表生成ユーティリティ（UT-FRM-030 〜 UT-FRM-032）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | 単一キーバリューペアがHTML表に変換される | E-05（1-10行目） | ○ |
| C-31 | 複数キーバリューペアがHTML表に変換される | E-05（4-6行目） | ○ |
| C-32 | 空オブジェクトの場合空のテーブルが返される | E-05（4-6行目、Object.entries） | ○ |

### Lexicalシリアライズ（UT-FRM-033 〜 UT-FRM-061）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-33 | Lexicalデータが正しくHTMLに変換される | E-06（5-17行目） | ○ |
| C-34 | dataがundefinedの場合空文字が返される | E-06（8, 16行目） | ○ |
| C-35 | root.childrenが空の場合空文字が返される | E-06（8行目） | ○ |
| C-36 | 未知のノードタイプがunknownコンバーターで処理される | E-06（30, 38-46行目） | ○ |
| C-37 | コンバーターがない未知ノードがデフォルトメッセージを返す | E-06（47行目） | ○ |
| C-38 | 段落ノードが<p>タグに変換される | E-07（5-19行目） | ○ |
| C-39 | テキストノードがそのまま出力される | E-08（7-37行目） | ○ |
| C-40 | 太字フォーマットが<strong>タグに変換される | E-08（14-15行目） | ○ |
| C-41 | 斜体フォーマットが<em>タグに変換される | E-08（17-18行目） | ○ |
| C-42 | 取り消し線フォーマットがstyle属性に変換される | E-08（20-21行目） | ○ |
| C-43 | 下線フォーマットがstyle属性に変換される | E-08（23-24行目） | ○ |
| C-44 | コードフォーマットが<code>タグに変換される | E-08（26-27行目） | ○ |
| C-45 | 下付き文字が<sub>タグに変換される | E-08（29-30行目） | ○ |
| C-46 | 上付き文字が<sup>タグに変換される | E-08（32-33行目） | ○ |
| C-47 | 複数フォーマットが組み合わせて適用される | E-08（14-33行目、ビット演算） | ○ |
| C-48 | submissionDataがある場合変数が置換される | E-08（10-12行目） | ○ |
| C-49 | 見出しノードが適切なタグに変換される | E-09（5-25行目） | ○ |
| C-50 | フォーマット（配置）がstyle属性に変換される | E-09（16-21行目） | ○ |
| C-51 | インデントがpadding-inline-startに変換される | E-09（18行目） | ○ |
| C-52 | カスタムURLリンクが<a>タグに変換される | E-10（6-27行目） | ○ |
| C-53 | newTabがtrueの場合target=_blankが追加される | E-10（24行目） | ○ |
| C-54 | リンクURL内の変数が置換される | E-10（21-23行目） | ○ |
| C-55 | 順序なしリストが<ul>タグに変換される | E-11（5-20行目） | ○ |
| C-56 | 順序付きリストが<ol>タグに変換される | E-11（17行目） | ○ |
| C-57 | リストアイテムが<li>タグに変換される | E-11（22-50行目） | ○ |
| C-58 | チェックリストアイテムが正しく変換される | E-11（33-44行目） | ○ |
| C-59 | 引用ノードが<blockquote>タグに変換される | E-12（5-26行目） | ○ |
| C-60 | 引用のフォーマットとインデントがstyle属性に変換される | E-12（16-21行目） | ○ |
| C-61 | 改行ノードが<br>タグに変換される | E-13（3-8行目） | ○ |

### Slateシリアライズ（UT-FRM-062 〜 UT-FRM-075）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | テキストノードが<span>タグで囲まれる | E-15（22-25行目） | ○ |
| C-63 | 太字テキストが<strong>タグで囲まれる | E-15（27-33行目） | ○ |
| C-64 | 斜体テキストが<em>タグで囲まれる | E-15（43-49行目） | ○ |
| C-65 | コードテキストが<code>タグで囲まれる | E-15（35-41行目） | ○ |
| C-66 | 見出しh1が<h1>タグに変換される | E-15（59-64行目） | ○ |
| C-67 | リンクが<a>タグに変換される | E-15（107-112行目） | ○ |
| C-68 | 順序なしリストが<ul><li>に変換される | E-15（125-130行目） | ○ |
| C-69 | 順序付きリストが<ol><li>に変換される | E-15（113-118行目） | ○ |
| C-70 | 引用が<blockquote>タグに変換される | E-15（119-124行目） | ○ |
| C-71 | インデントがpadding-left付きの<p>に変換される | E-15（95-100行目） | ○ |
| C-72 | {{*を含むテキストでワイルドカード置換が行われる | E-15（23-24行目） | ○ |
| C-73 | childrenがundefinedの場合undefinedが返される | E-15（19行目、オプショナルチェイン） | ○ |
| C-74 | 空配列の場合空文字が返される | E-15（140-141行目、filter + join） | ○ |
| C-75 | nullノードがフィルタリングされる | E-15（54-56行目、140行目） | ○ |

### フォームコレクション生成（UT-FRM-076 〜 UT-FRM-083）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-76 | デフォルトslugが'forms'である | E-16（229行目） | ○ |
| C-77 | カスタムslugが適用される | E-16（229行目） | ○ |
| C-78 | 有効なフィールドがブロックとして含まれる | E-16（78-101行目） | ○ |
| C-79 | 無効なフィールドがブロックから除外される | E-16（81行目） | ○ |
| C-80 | redirectRelationshipsが設定されている場合リダイレクトフィールドにrelationshipが追加される | E-16（28-67行目） | ○ |
| C-81 | formOverrides.fieldsが関数の場合呼び出される | E-16（239-242行目） | ○ |
| C-82 | アクセス権限のデフォルトが設定される | E-16（231-232行目） | ○ |
| C-83 | カスタムブロック設定がマージされる | E-16（88-89行目、deepMergeWithSourceArrays） | ○ |

### サブミッションコレクション生成（UT-FRM-084 〜 UT-FRM-093）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-84 | デフォルトslugが'form-submissions'である | E-18（85行目） | ○ |
| C-85 | カスタムslugが適用される | E-18（85行目） | ○ |
| C-86 | paymentフィールドが有効な場合支払いフィールドが追加される | E-18（15, 80行目） | ○ |
| C-87 | paymentフィールドが無効な場合支払いフィールドが除外される | E-18（15, 80行目） | ○ |
| C-88 | afterChangeフックにsendEmailが含まれる | E-18（103-104行目） | ○ |
| C-89 | beforeChangeフックにcreateChargeが含まれる | E-18（107-108行目） | ○ |
| C-90 | カスタムフックが追加される | E-18（105, 109行目） | ○ |
| C-91 | formフィールドのrelationToが正しいslugを参照する | E-18（13, 21行目） | ○ |
| C-92 | createアクセスがデフォルトでtrueを返す | E-18（87行目） | ○ |
| C-93 | updateアクセスがデフォルトでfalseを返す | E-18（89行目） | ○ |

### メール送信フック（UT-FRM-094 〜 UT-FRM-105）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-94 | create操作時にメールが送信される | E-19（15, 89-101行目） | ○ |
| C-95 | update操作時にメールが送信されない | E-19（15行目） | ○ |
| C-96 | Lexical形式のメッセージがHTMLに変換される | E-19（65-68行目） | ○ |
| C-97 | Slate形式のメッセージがHTMLに変換される | E-19（65-69行目） | ○ |
| C-98 | beforeEmail関数が呼び出されてメールを変更できる | E-19（85-87行目） | ○ |
| C-99 | emailToが未設定の場合defaultToEmailが使用される | E-19（57行目） | ○ |
| C-100 | defaultToEmailも未設定の場合payload.email.defaultFromAddressが使用される | E-19（57行目） | ○ |
| C-101 | submissionDataに変数置換が適用される | E-19（59-63, 77行目） | ○ |
| C-102 | formSubmissionIDがsubmissionDataに追加される | E-19（36-42行目） | ○ |
| C-103 | emailsが空配列の場合ログが出力される | E-19（103-105行目） | ○ |
| C-104 | メール送信エラー時にログが出力される | E-19（96-99行目） | ○ |
| C-105 | フォーム取得エラー時にログが出力される | E-19（106-109行目） | ○ |

### 支払い処理フック（UT-FRM-106 〜 UT-FRM-109）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-106 | create操作時にhandlePaymentが呼び出される | E-20（11, 14-17行目） | ○ |
| C-107 | update操作時にhandlePaymentが呼び出されない | E-20（11行目） | ○ |
| C-108 | handlePaymentが未設定の場合元のデータが返される | E-20（9, 20行目） | ○ |
| C-109 | handlePaymentの戻り値が返される | E-20（16行目） | ○ |

### フィールドブロック定義（UT-FRM-110 〜 UT-FRM-118）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-110 | paymentProcessorが設定されている場合selectフィールドが生成される | E-17（539-549行目） | ○ |
| C-111 | paymentProcessorが未設定の場合nullがフィルタリングされる | E-17（590, 693行目） | ○ |
| C-112 | 各ブロックが正しいslugを持つ | E-17（38, 121, 211, 259行目等） | ○ |
| C-113 | Select/Radioブロックにoptionsフィールドが含まれる | E-17（78-106, 169-201行目） | ○ |
| C-114 | 全ブロックにnameフィールドが含まれる | E-17（5-10行目、共通フィールド定義） | ○ |
| C-115 | IS_BOLDが1である | E-14（20行目） | ○ |
| C-116 | IS_ITALICがビットシフトで2である | E-14（21行目） | ○ |
| C-117 | boldがIS_BOLD値にマッピングされる | E-14（70行目） | ○ |
| C-118 | centerがIS_ALIGN_CENTER値にマッピングされる | E-14（86行目） | ○ |

## 4) 不足情報（Unknown / Missing）
- なし - 全てのテストケースに対応するソースコードが存在

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**：全テストケースがソースコードに基づいており、論理的な整合性が確認できる

### 注意点
1. **DynamicFieldSelector / DynamicPriceSelector**：これらはReactコンポーネント（クライアントサイド）であり、単体テストにはReactテスト環境が必要
2. **非同期処理**：sendEmail、serializeLexical等の非同期関数のテストにはモック/スタブが必要
3. **Payloadコンテキスト依存**：多くのフックがpayload.findByID、payload.sendEmail等を使用しており、統合テスト環境が必要

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースの網羅性：全ての公開関数/メソッドがカバーされているか
- [ ] 境界値テスト：空配列、undefined、null等のエッジケースが含まれているか
- [ ] 異常系テスト：エラーハンドリングのテストが含まれているか
- [ ] 優先度の妥当性：ビジネスクリティカルな機能（支払い処理、メール送信）が高優先度になっているか
- [ ] テスト実行可能性：モック/スタブ等の前提条件が明確か
