- Add self-mention/bot loop prevention in actor.ts (blocks actor matching bot_name) - Switch Forgejo permission check to actor-level via getCollaboratorPermissionLevel with fallback to token-level repos.get() when collaborator API returns 403 - Close empty-body PR review comment trigger bypass (now returns false instead of true) - Add platform detection cross-validation (reject PLATFORM=forgejo on github.com) - Document URL builder defense-in-depth rationale in comment-logic.ts - Update/add tests across 6 test files (actor, permissions, trigger, platform, mcp, m7) Progress: 50% complete (3/6 milestones) — next: M4 test coverage review Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
109 lines
3.7 KiB
TypeScript
109 lines
3.7 KiB
TypeScript
import { detectPlatform, _resetPlatformCache } from "../src/platform/detector";
|
|
import { describe, it, expect, beforeEach } from "bun:test";
|
|
|
|
describe("detectPlatform", () => {
|
|
beforeEach(() => {
|
|
// Reset memoized result and env vars before each test
|
|
_resetPlatformCache();
|
|
delete process.env.PLATFORM;
|
|
delete process.env.FORGEJO;
|
|
delete process.env.GITHUB_SERVER_URL;
|
|
});
|
|
|
|
// Restore original env after all tests in this file
|
|
// (bun:test doesn't have afterAll cleanup issues like jest, but let's be safe)
|
|
|
|
describe("explicit PLATFORM env var", () => {
|
|
it("should return 'forgejo' when PLATFORM is 'forgejo'", () => {
|
|
process.env.PLATFORM = "forgejo";
|
|
expect(detectPlatform()).toBe("forgejo");
|
|
});
|
|
|
|
it("should return 'github' when PLATFORM is 'github'", () => {
|
|
process.env.PLATFORM = "github";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should take precedence over FORGEJO env var", () => {
|
|
process.env.PLATFORM = "github";
|
|
process.env.FORGEJO = "true";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should take precedence over GITHUB_SERVER_URL", () => {
|
|
process.env.PLATFORM = "github";
|
|
process.env.GITHUB_SERVER_URL = "https://git.example.com";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should ignore unrecognized PLATFORM values and fall through", () => {
|
|
process.env.PLATFORM = "gitlab";
|
|
// No other env vars set, should default to github
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should reject PLATFORM=forgejo when GITHUB_SERVER_URL is github.com", () => {
|
|
process.env.PLATFORM = "forgejo";
|
|
process.env.GITHUB_SERVER_URL = "https://github.com";
|
|
// Cross-validation guard: prevent forcing Forgejo mode on GitHub.com
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should accept PLATFORM=forgejo when GITHUB_SERVER_URL is not github.com", () => {
|
|
process.env.PLATFORM = "forgejo";
|
|
process.env.GITHUB_SERVER_URL = "https://git.example.com";
|
|
expect(detectPlatform()).toBe("forgejo");
|
|
});
|
|
});
|
|
|
|
describe("FORGEJO env var", () => {
|
|
it("should return 'forgejo' when FORGEJO is 'true'", () => {
|
|
process.env.FORGEJO = "true";
|
|
expect(detectPlatform()).toBe("forgejo");
|
|
});
|
|
|
|
it("should not detect forgejo when FORGEJO is 'false'", () => {
|
|
process.env.FORGEJO = "false";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should not detect forgejo when FORGEJO is empty", () => {
|
|
process.env.FORGEJO = "";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
});
|
|
|
|
describe("GITHUB_SERVER_URL heuristic", () => {
|
|
it("should return 'forgejo' for non-github.com server URLs", () => {
|
|
process.env.GITHUB_SERVER_URL = "https://git.wxs.ro";
|
|
expect(detectPlatform()).toBe("forgejo");
|
|
});
|
|
|
|
it("should return 'forgejo' for gitea/forgejo instances", () => {
|
|
process.env.GITHUB_SERVER_URL = "https://forgejo.example.org";
|
|
expect(detectPlatform()).toBe("forgejo");
|
|
});
|
|
|
|
it("should return 'github' for github.com", () => {
|
|
process.env.GITHUB_SERVER_URL = "https://github.com";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should return 'github' for GitHub Enterprise (contains github.com)", () => {
|
|
process.env.GITHUB_SERVER_URL = "https://github.com/enterprise";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
|
|
it("should return 'github' when GITHUB_SERVER_URL is empty", () => {
|
|
process.env.GITHUB_SERVER_URL = "";
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
});
|
|
|
|
describe("default behavior", () => {
|
|
it("should return 'github' when no env vars are set", () => {
|
|
expect(detectPlatform()).toBe("github");
|
|
});
|
|
});
|
|
});
|