Files
claude-code-action/test/modes/detector.test.ts
T
Takaki SatoandGitHub d573b167d3 fix: support labeled action for pull_request events in track_progress (#1586)
Adds "labeled" to the valid pull_request actions for track_progress,
mirroring the existing support for issue events. Previously, adding
a label to a PR (e.g. to trigger a label-driven Claude review) would
fail validation even though the same pattern works for issues.

Fixes #1585
2026-08-07 07:55:20 -07:00

279 lines
8.4 KiB
TypeScript

import { describe, expect, it } from "bun:test";
import { detectMode } from "../../src/modes/detector";
import type { GitHubContext } from "../../src/github/context";
describe("detectMode with enhanced routing", () => {
const baseContext = {
runId: "test-run",
eventAction: "opened",
repository: {
owner: "test-owner",
repo: "test-repo",
full_name: "test-owner/test-repo",
},
actor: "test-user",
inputs: {
prompt: "",
triggerPhrase: "@claude",
assigneeTrigger: "",
labelTrigger: "",
branchPrefix: "claude/",
useStickyComment: false,
classifyInlineComments: true,
useCommitSigning: false,
sshSigningKey: "",
botId: "123456",
botName: "claude-bot",
allowedBots: "",
allowedNonWriteUsers: "",
trackProgress: false,
includeFixLinks: true,
includeCommentsByActor: "",
excludeCommentsByActor: "",
},
};
describe("PR Events with track_progress", () => {
it("should use tag mode when track_progress is true for pull_request.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use tag mode when track_progress is true for pull_request.synchronize", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "synchronize",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode when track_progress is false for pull_request.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: false },
};
expect(detectMode(context)).toBe("agent");
});
it("should use tag mode when track_progress is true for pull_request.labeled", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "labeled",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should throw error when track_progress is used with unsupported PR action", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "closed",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(() => detectMode(context)).toThrow(
/track_progress for pull_request events is only supported for actions/,
);
});
});
describe("Issue Events with track_progress", () => {
it("should use tag mode when track_progress is true for issues.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode when track_progress is false for issues", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, trackProgress: false },
};
expect(detectMode(context)).toBe("agent");
});
it("should use agent mode for issues with explicit prompt", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test issue" } } as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, prompt: "Analyze this issue" },
};
expect(detectMode(context)).toBe("agent");
});
it("should use tag mode for issues with @claude mention and no prompt", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "@claude help" } } as any,
entityNumber: 1,
isPR: false,
};
expect(detectMode(context)).toBe("tag");
});
});
describe("Comment Events (unchanged behavior)", () => {
it("should use tag mode for issue_comment with @claude mention", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issue_comment",
payload: {
issue: { number: 1, body: "Test" },
comment: { body: "@claude help" },
} as any,
entityNumber: 1,
isPR: false,
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode for issue_comment with prompt provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issue_comment",
payload: {
issue: { number: 1, body: "Test" },
comment: { body: "@claude help" },
} as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, prompt: "Review this PR" },
};
expect(detectMode(context)).toBe("agent");
});
it("should use tag mode for PR review comments with @claude mention", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request_review_comment",
payload: {
pull_request: { number: 1, body: "Test" },
comment: { body: "@claude check this" },
} as any,
entityNumber: 1,
isPR: true,
};
expect(detectMode(context)).toBe("tag");
});
});
describe("Automation Events (should error with track_progress)", () => {
it("should throw error when track_progress is used with workflow_dispatch", () => {
const context: GitHubContext = {
...baseContext,
eventName: "workflow_dispatch",
payload: {} as any,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(() => detectMode(context)).toThrow(
/track_progress is only supported /,
);
});
it("should use agent mode for workflow_dispatch without track_progress", () => {
const context: GitHubContext = {
...baseContext,
eventName: "workflow_dispatch",
payload: {} as any,
inputs: { ...baseContext.inputs, prompt: "Run workflow" },
};
expect(detectMode(context)).toBe("agent");
});
});
describe("Custom prompt injection in tag mode", () => {
it("should use tag mode for PR events when both track_progress and prompt are provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: {
...baseContext.inputs,
trackProgress: true,
prompt: "Review for security issues",
},
};
expect(detectMode(context)).toBe("tag");
});
it("should use tag mode for issue events when both track_progress and prompt are provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: {
...baseContext.inputs,
trackProgress: true,
prompt: "Analyze this issue",
},
};
expect(detectMode(context)).toBe("tag");
});
});
});