Skip to content

test(worker,shared): add unit tests for core logic (summarize, rate-limit, github-ip) #223

Description

@liplus-lin-lay

目的

これまでテストが 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本:

  1. shared/src/summarize.tssummarizeEvent の全分岐(issue / pull_request / discussion / check_run / workflow_run、number/title/url の優先順位フォールバック、workflow_run 固有フィールド、null 安全)。現状ゼロカバー。worker と local-mcp/mcp-server が共有。
  2. worker/src/rate-limit.ts — sliding window(webhook 300/min・api 120/min)、窓リセット、checkTenantQuota(mock stub で allowed / 429 / 404 passthrough)、rateLimitResponse
  3. 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 に分離する。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestin-progress着手中、実装または検証が進行中readybody converged for implementation

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions