目的
これまでテストが OAuth (worker/oauth.ts) と mcp-server のクライアント契約に偏っており、本流である webhook の核心ロジックがテストの外にあった。新インフラを足さず、既存ハーネス (tsx --test) でクリーンに単体テストできる純ロジック層を厚くカバーする。
前提
- 既存 CI (
.github/workflows/ci.yml) は worker で npm test (= tsx --test test/*.test.ts) を走らせ、CI gate job が branch protection の必須チェックになっている。
- 新規テストは
worker/test/*.test.ts に置けば既存 glob が自動的に拾う。CI 変更不要・新インフラ不要。
- 実行モード = auto。
スコープ(本 issue)
既存ハーネスで決定的にテストできる純ロジック3本:
shared/src/summarize.ts — summarizeEvent の全分岐(issue / pull_request / discussion / check_run / workflow_run、number/title/url の優先順位フォールバック、workflow_run 固有フィールド、null 安全)。現状ゼロカバー。worker と local-mcp/mcp-server が共有。
worker/src/rate-limit.ts — sliding window(webhook 300/min・api 120/min)、窓リセット、checkTenantQuota(mock stub で allowed / 429 / 404 passthrough)、rateLimitResponse。
worker/src/github-ip.ts — CIDR 一致判定(IPv4 演算・IPv6 passthrough・fallback CIDR)と isGitHubWebhookIP(CF-Connecting-IP 不在時 passthrough)。テスト容易化のため内部の純関数 ipMatchesCIDRs を export する最小リファクタを含む。
制約
- 既存の挙動を変えない(github-ip は visibility 追加の export のみ、ロジック不変)。
- テストは決定的に(実ネットワーク不使用。global fetch / stub を使う)。
- commit title / PR title = ASCII English、PR body = 日本語。
スコープ外(別 issue)
worker/src/store.ts / tenant.ts は Durable Object + ctx.storage.sql で、tsx --test では実行不可。本格テストには vitest-pool-workers(Miniflare) 導入=テストハーネス変更+workers-types のピン留めが必要。インフラ判断を伴うため別 issue に分離する。
目的
これまでテストが OAuth (
worker/oauth.ts) と mcp-server のクライアント契約に偏っており、本流である webhook の核心ロジックがテストの外にあった。新インフラを足さず、既存ハーネス (tsx --test) でクリーンに単体テストできる純ロジック層を厚くカバーする。前提
.github/workflows/ci.yml) は worker でnpm test(=tsx --test test/*.test.ts) を走らせ、CIgate job が branch protection の必須チェックになっている。worker/test/*.test.tsに置けば既存 glob が自動的に拾う。CI 変更不要・新インフラ不要。スコープ(本 issue)
既存ハーネスで決定的にテストできる純ロジック3本:
shared/src/summarize.ts—summarizeEventの全分岐(issue / pull_request / discussion / check_run / workflow_run、number/title/url の優先順位フォールバック、workflow_run 固有フィールド、null 安全)。現状ゼロカバー。worker と local-mcp/mcp-server が共有。worker/src/rate-limit.ts— sliding window(webhook 300/min・api 120/min)、窓リセット、checkTenantQuota(mock stub で allowed / 429 / 404 passthrough)、rateLimitResponse。worker/src/github-ip.ts— CIDR 一致判定(IPv4 演算・IPv6 passthrough・fallback CIDR)とisGitHubWebhookIP(CF-Connecting-IP 不在時 passthrough)。テスト容易化のため内部の純関数ipMatchesCIDRsを export する最小リファクタを含む。制約
スコープ外(別 issue)
worker/src/store.ts/tenant.tsは Durable Object +ctx.storage.sqlで、tsx --testでは実行不可。本格テストにはvitest-pool-workers(Miniflare) 導入=テストハーネス変更+workers-types のピン留めが必要。インフラ判断を伴うため別 issue に分離する。