---
generated_at: 2026-01-29 12:30:00
metrics:
  claims_total: 171
  claims_with_evidence: 171
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート: Core-Framework-Webhook 単体テストケース一覧

## 本レポートについて

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

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

1. **根拠の有無確認**: 各テストケースに対して、ソースコード・既存設計書・要件定義書などの根拠(Evidence)が存在するか
2. **根拠との整合性**: テストケースの内容が根拠となるコードと矛盾していないか
3. **網羅性**: テスト対象のクラス・メソッドを適切にカバーしているか

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

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

---

## 1) サマリー(まず見るところ)
- 総合信頼度(derived): **1.00**
  - 根拠あり: 171 / 171、根拠なし: 0
- 優先レビュー(高)
  1. **UT-WBH-098〜105**: WebhookEventMessageHandler - HTTPリクエスト送信の実際の動作確認が必要
  2. **UT-WBH-066〜079**: WebhookManager - 複雑な条件分岐の網羅性確認が必要
  3. **UT-WBH-160〜165**: RetryWebhookMessageFailedSubscriber - エラー処理の境界値テストが重要

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

- E-01: `src/Core/Framework/Webhook/WebhookDefinition.php` - Webhookエンティティ定義
- E-02: `src/Core/Framework/Webhook/WebhookEntity.php` - Webhookエンティティクラス
- E-03: `src/Core/Framework/Webhook/WebhookCollection.php` - Webhookコレクションクラス
- E-04: `src/Core/Framework/Webhook/EventLog/WebhookEventLogDefinition.php` - イベントログ定義
- E-05: `src/Core/Framework/Webhook/EventLog/WebhookEventLogEntity.php` - イベントログエンティティ
- E-06: `src/Core/Framework/Webhook/EventLog/WebhookEventLogCollection.php` - イベントログコレクション
- E-07: `src/Core/Framework/Webhook/AclPrivilegeCollection.php` - ACL権限コレクション
- E-08: `src/Core/Framework/Webhook/WebhookException.php` - Webhook例外クラス
- E-09: `src/Core/Framework/Webhook/Message/WebhookEventMessage.php` - 非同期メッセージ
- E-10: `src/Core/Framework/Webhook/Service/WebhookManager.php` - Webhook管理サービス
- E-11: `src/Core/Framework/Webhook/Service/WebhookLoader.php` - Webhook読み込みサービス
- E-12: `src/Core/Framework/Webhook/Service/WebhookCleanup.php` - ログクリーンアップサービス
- E-13: `src/Core/Framework/Webhook/Service/RelatedWebhooks.php` - 関連Webhook更新サービス
- E-14: `src/Core/Framework/Webhook/WebhookDispatcher.php` - イベントディスパッチャー
- E-15: `src/Core/Framework/Webhook/Handler/WebhookEventMessageHandler.php` - メッセージハンドラー
- E-16: `src/Core/Framework/Webhook/BusinessEventEncoder.php` - ビジネスイベントエンコーダー
- E-17: `src/Core/Framework/Webhook/Hookable.php` - Hookableインターフェース
- E-18: `src/Core/Framework/Webhook/Hookable/HookableEventFactory.php` - Hookableイベントファクトリ
- E-19: `src/Core/Framework/Webhook/Hookable/HookableBusinessEvent.php` - Hookableビジネスイベント
- E-20: `src/Core/Framework/Webhook/Hookable/HookableEntityWrittenEvent.php` - Hookableエンティティ書き込みイベント
- E-21: `src/Core/Framework/Webhook/Hookable/WriteResultMerger.php` - WriteResultマージャー
- E-22: `src/Core/Framework/Webhook/Hookable/HookableEventCollector.php` - Hookableイベントコレクター
- E-23: `src/Core/Framework/Webhook/WebhookCacheClearer.php` - キャッシュクリアラー
- E-24: `src/Core/Framework/Webhook/Subscriber/RetryWebhookMessageFailedSubscriber.php` - 失敗時リトライサブスクライバー
- E-25: `src/Core/Framework/Webhook/ScheduledTask/CleanupWebhookEventLogTask.php` - スケジュールタスク
- E-26: `src/Core/Framework/Webhook/ScheduledTask/CleanupWebhookEventLogTaskHandler.php` - タスクハンドラー
- E-27: `src/Core/Framework/Webhook/Event/PreWebhooksDispatchEvent.php` - ディスパッチ前イベント
- E-28: `src/Core/Framework/Webhook/Webhook.php` - WebhookDTO

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

### WebhookDefinition (UT-WBH-001〜006)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getEntityNameが'webhook'を返す | E-01 (L23-28) | ○ |
| C-02 | getEntityClassがWebhookEntity::classを返す | E-01 (L30-33) | ○ |
| C-03 | getCollectionClassがWebhookCollection::classを返す | E-01 (L35-38) | ○ |
| C-04 | getDefaultsがactive=true, errorCount=0, onlyLiveVersion=falseを返す | E-01 (L45-52) | ○ |
| C-05 | sinceが'6.3.1.0'を返す | E-01 (L40-43) | ○ |
| C-06 | defineFieldsで必須フィールドが定義されている | E-01 (L54-69) | ○ |

### WebhookEntity (UT-WBH-007〜019)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-07 | getName/setNameが正しく動作する | E-02 (L31-39) | ○ |
| C-08 | getEventName/setEventNameが正しく動作する | E-02 (L41-49) | ○ |
| C-09 | getUrl/setUrlが正しく動作する | E-02 (L51-59) | ○ |
| C-10 | getOnlyLiveVersion/setOnlyLiveVersionが正しく動作する | E-02 (L61-69) | ○ |
| C-11 | getAppId/setAppIdがnull許容で動作する | E-02 (L71-79) | ○ |
| C-12 | getApp/setAppがAppEntityリレーションを返す | E-02 (L81-89) | ○ |
| C-13 | isActive/setActiveが正しく動作する | E-02 (L91-99) | ○ |
| C-14 | getErrorCount/setErrorCountが正しく動作する | E-02 (L101-109) | ○ |

### WebhookCollection (UT-WBH-020〜028)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 | filterForEventがeventNameでフィルタリングする | E-03 (L19-22) | ○ |
| C-16 | getAclRoleIdsAsBinaryがバイナリ形式のIDを返す | E-03 (L27-36) | ○ |
| C-17 | allowedForDispatchingがApp状態とイベント種別で判定する | E-03 (L41-63) | ○ |
| C-18 | getExpectedClassがWebhookEntity::classを返す | E-03 (L65-68) | ○ |

### WebhookEventLogDefinition (UT-WBH-029〜033)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | STATUS定数が定義されている(QUEUED, RUNNING, FAILED, SUCCESS) | E-04 (L24-30) | ○ |
| C-20 | getEntityNameが'webhook_event_log'を返す | E-04 (L34-37) | ○ |
| C-21 | getDefaultsがonlyLiveVersion=falseを返す | E-04 (L49-54) | ○ |
| C-22 | sinceが'6.4.1.0'を返す | E-04 (L56-59) | ○ |
| C-23 | defineFieldsで必須フィールドが定義されている | E-04 (L61-81) | ○ |

### WebhookEventLogEntity (UT-WBH-034〜044)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-24 | 各プロパティのgetter/setterが正しく動作する | E-05 (L53-211) | ○ |
| C-25 | getSerializedWebhookMessageがアクセス制限付きで動作する | E-05 (L198-211) | ○ |

### AclPrivilegeCollection (UT-WBH-045〜048)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-26 | コンストラクタで権限配列を受け取る | E-07 (L16-18) | ○ |
| C-27 | isAllowedがresource:privilege形式でチェックする | E-07 (L20-23) | ○ |

### WebhookException (UT-WBH-049〜054)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | webhookFailedExceptionが正しく生成される | E-08 (L17-26) | ○ |
| C-29 | appWebhookFailedExceptionが正しく生成される | E-08 (L28-36) | ○ |
| C-30 | invalidDataMappingが正しく生成される | E-08 (L42-50) | ○ |
| C-31 | unknownEventDataTypeが正しく生成される | E-08 (L55-63) | ○ |

### WebhookEventMessage (UT-WBH-055〜065)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-32 | 全てのgetterが正しく動作する | E-09 (L32-78) | ○ |

### WebhookManager (UT-WBH-066〜079)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-33 | dispatchがHookableイベントを処理する | E-10 (L68-77) | ○ |
| C-34 | reset/clearInternalXxxCacheがキャッシュをクリアする | E-10 (L79-93) | ○ |
| C-35 | callWebhooksが同期/非同期モードで動作する | E-10 (L95-127) | ○ |
| C-36 | filterWebhooksByLiveVersionがライブバージョンでフィルタする | E-10 (L358-385) | ○ |
| C-37 | filterPayloadByLiveVersionがペイロードをフィルタする | E-10 (L292-301) | ○ |
| C-38 | isEventDispatchingAllowedが権限チェックする | E-10 (L303-317) | ○ |

### WebhookLoader (UT-WBH-080〜083)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-39 | getWebhooksがアクティブなWebhookを取得する | E-11 (L57-97) | ○ |
| C-40 | getPrivilegesForRolesがロールIDから権限を取得する | E-11 (L29-52) | ○ |

### WebhookCleanup (UT-WBH-084〜088)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | removeOldLogsが古いログを削除する | E-12 (L33-46) | ○ |
| C-42 | entryLifetimeSeconds=-1で削除をスキップする | E-12 (L37-39) | ○ |
| C-43 | queuedは2倍の期間後に削除される | E-12 (L45) | ○ |
| C-44 | バッチサイズ500で削除される | E-12 (L21, L55-68) | ○ |

### RelatedWebhooks (UT-WBH-089〜090)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | updateRelatedが関連Webhookを更新する | E-13 (L27-34) | ○ |
| C-46 | fetchIdsが同一設定のWebhookIDを取得する | E-13 (L41-55) | ○ |

### WebhookDispatcher (UT-WBH-091〜097)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-47 | dispatchが内部ディスパッチャに転送する | E-14 (L26-37) | ○ |
| C-48 | HookableイベントがWebhookManagerに転送される | E-14 (L30-34) | ○ |
| C-49 | addListener/removeListenerが正しく動作する | E-14 (L42-58) | ○ |
| C-50 | getListeners/hasListenersが正しく動作する | E-14 (L67-81) | ○ |

### WebhookEventMessageHandler (UT-WBH-098〜105)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | __invokeがWebhookを送信する | E-15 (L43-143) | ○ |
| C-52 | シークレット付きリクエストが署名される | E-15 (L70-74) | ○ |
| C-53 | 成功時にerror_countが0にリセットされる | E-15 (L106-111) | ○ |
| C-54 | 失敗時にステータスがqueuedに更新される | E-15 (L113-136) | ○ |
| C-55 | BadResponseExceptionでappWebhookFailedExceptionがスローされる | E-15 (L137-139) | ○ |
| C-56 | updateLogIfItExistsがWriteTypeIntendExceptionを無視する | E-15 (L148-155) | ○ |

### BusinessEventEncoder (UT-WBH-106〜117)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | encodeがFlowEventAwareをエンコードする | E-16 (L36-39) | ○ |
| C-58 | encodeDataがEntityをエンコードする | E-16 (L47-71) | ○ |
| C-59 | encodePropertyが型別に処理する | E-16 (L94-116) | ○ |
| C-60 | getPropertyがgetter/isser/配列アクセスで取得する | E-16 (L123-142) | ○ |
| C-61 | 未知の型でWebhookExceptionがスローされる | E-16 (L114) | ○ |

### HookableEventFactory (UT-WBH-118〜125)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | isHookableが正しく判定する | E-18 (L28-31) | ○ |
| C-63 | createHookablesForが型別にHookableを生成する | E-18 (L36-59) | ○ |
| C-64 | StorableFlowで空配列が返される | E-18 (L40-42) | ○ |

### HookableBusinessEvent (UT-WBH-126〜132)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-65 | fromBusinessEventでインスタンスが生成される | E-19 (L30-35) | ○ |
| C-66 | getNameがイベント名を返す | E-19 (L37-40) | ○ |
| C-67 | getWebhookPayloadがエンコード済みペイロードを返す | E-19 (L42-45) | ○ |
| C-68 | isAllowedが権限をチェックする | E-19 (L47-56) | ○ |
| C-69 | checkPermissionsForDataTypeが再帰的に権限をチェックする | E-19 (L61-86) | ○ |

### HookableEntityWrittenEvent (UT-WBH-133〜139)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-70 | fromWrittenEventでインスタンスが生成される | E-20 (L23-27) | ○ |
| C-71 | getNameがイベント名を返す | E-20 (L29-32) | ○ |
| C-72 | getWebhookPayloadがWriteResultsからペイロードを生成する | E-20 (L37-73) | ○ |
| C-73 | isAllowedがread権限をチェックする | E-20 (L42-45) | ○ |

### WriteResultMerger (UT-WBH-140〜146)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-74 | mergeWriteResultsがWriteResultをマージする | E-21 (L24-59) | ○ |
| C-75 | EntityDeletedEventはそのまま返される | E-21 (L28-30) | ○ |
| C-76 | getMergedWriteResultが翻訳をマージする | E-21 (L61-87) | ○ |
| C-77 | findWriteResultByPrimaryKeyがlanguageIdを除外する | E-21 (L95-110) | ○ |

### HookableEventCollector (UT-WBH-147〜154)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-78 | getHookableEventNamesWithPrivilegesがイベント名と権限を返す | E-22 (L48-55) | ○ |
| C-79 | getPrivilegesFromBusinessEventDefinitionが権限を抽出する | E-22 (L60-73) | ○ |
| C-80 | getEntityWrittenEventNamesWithPrivilegesがwritten/deletedイベントを生成する | E-22 (L78-91) | ○ |
| C-81 | getHookableEntitiesがHookableエンティティを取得する | E-22 (L98-126) | ○ |
| C-82 | resetがキャッシュをリセットする | E-22 (L128-132) | ○ |

### WebhookCacheClearer (UT-WBH-155〜158)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | getSubscribedEventsがacl_role.writtenを返す | E-23 (L24-28) | ○ |
| C-84 | resetが両方のキャッシュをクリアする | E-23 (L33-38) | ○ |
| C-85 | clearWebhookCache/clearPrivilegesCacheが個別にクリアする | E-23 (L40-48) | ○ |

### RetryWebhookMessageFailedSubscriber (UT-WBH-159〜165)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-86 | MAX_WEBHOOK_ERROR_COUNTが10に定義されている | E-24 (L21) | ○ |
| C-87 | failedがリトライ予定時にスキップする | E-24 (L41-43) | ○ |
| C-88 | failedがWebhookEventMessage以外をスキップする | E-24 (L45-48) | ○ |
| C-89 | failedがログステータスをfailedに更新する | E-24 (L55-58) | ○ |
| C-90 | failedがerror_countをインクリメントする | E-24 (L72-73) | ○ |
| C-91 | MAX到達でactive=0, error_count=0に更新する | E-24 (L75-80) | ○ |

### ScheduledTask (UT-WBH-166〜169)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-92 | getTaskNameが'webhook_event_log.cleanup'を返す | E-25 (L14-17) | ○ |
| C-93 | getDefaultIntervalがDAILYを返す | E-25 (L19-22) | ○ |
| C-94 | shouldRescheduleOnFailureがtrueを返す | E-25 (L24-27) | ○ |
| C-95 | runがwebhookCleanup.removeOldLogsを呼ぶ | E-26 (L33-36) | ○ |

### PreWebhooksDispatchEvent (UT-WBH-170〜171)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-96 | コンストラクタでwebhooksを受け取る | E-27 (L17-19) | ○ |
| C-97 | webhooksプロパティがpublicでアクセス可能 | E-27 (L17) | ○ |

## 4) 不足情報(Unknown / Missing)
- なし - 全てのテストケースにソースコードの根拠があります

## 5) リスクフラグ(レビュー観点)
- 0: 低リスク - エンティティ定義、getter/setter、コレクションメソッド
- 1: 中リスク - キャッシュ管理、スケジュールタスク、イベントサブスクライバー
- 2: 高リスク - WebhookManager(同期/非同期配信)、WebhookEventMessageHandler(HTTP通信)、RetryWebhookMessageFailedSubscriber(エラーカウント・自動無効化)

## 6) レビュアーチェックリスト(最小)
- [ ] WebhookManager: 同期/非同期モードの切り替えロジックが正しくテストされているか
- [ ] WebhookEventMessageHandler: HTTPエラー時の例外処理が網羅されているか
- [ ] RetryWebhookMessageFailedSubscriber: MAX_WEBHOOK_ERROR_COUNT=10到達時の自動無効化ロジックが正しいか
- [ ] WebhookCollection.allowedForDispatching: ライフサイクルイベント(AppInstalledEvent等)の例外処理が正しいか
- [ ] WebhookCleanup: queuedステータスの2倍期間削除ロジックが正しいか
- [ ] BusinessEventEncoder: 全ての型(Scalar, Entity, EntityCollection, Object, Array)のエンコードが網羅されているか
- [ ] WriteResultMerger: 翻訳イベントとのマージロジックが正しいか
