fix: commentBody may be null (#706)

* fix: `commentBody` may be `null`

This handles the cases where `pull_request_review` events have no
comments (`commentBody` field is `null`). In those cases, the `null`
value is converted to the empty string.

The issue was testing `!commentBody` which was triggerring on empty
strings as well. This guard was removed (which is the fix), but for
clarity, the `commentBody` field was also made optional to make it clear
that the comment may be missing.

* fix: bun run format
This commit is contained in:
Philippe Laflamme
2025-12-03 20:34:31 -05:00
committed by GitHub
parent 469fc9c1a4
commit 2acd1f7011
4 changed files with 67 additions and 6 deletions

View File

@@ -192,11 +192,6 @@ export function prepareContext(
if (!isPR) { if (!isPR) {
throw new Error("IS_PR must be true for pull_request_review event"); throw new Error("IS_PR must be true for pull_request_review event");
} }
if (!commentBody) {
throw new Error(
"COMMENT_BODY is required for pull_request_review event",
);
}
eventData = { eventData = {
eventName: "pull_request_review", eventName: "pull_request_review",
isPR: true, isPR: true,

View File

@@ -23,7 +23,7 @@ type PullRequestReviewEvent = {
eventName: "pull_request_review"; eventName: "pull_request_review";
isPR: true; isPR: true;
prNumber: string; prNumber: string;
commentBody: string; commentBody?: string; // May be absent for approvals without comments
claudeBranch?: string; claudeBranch?: string;
baseBranch?: string; baseBranch?: string;
}; };

View File

@@ -401,6 +401,53 @@ export const mockPullRequestReviewContext: ParsedGitHubContext = {
inputs: { ...defaultInputs, triggerPhrase: "@claude" }, inputs: { ...defaultInputs, triggerPhrase: "@claude" },
}; };
export const mockPullRequestReviewWithoutCommentContext: ParsedGitHubContext = {
runId: "1234567890",
eventName: "pull_request_review",
eventAction: "dismissed",
repository: defaultRepository,
actor: "senior-developer",
payload: {
action: "submitted",
review: {
id: 11122233,
body: null, // Simulating approval without comment
user: {
login: "senior-developer",
id: 44444,
avatar_url: "https://avatars.githubusercontent.com/u/44444",
html_url: "https://github.com/senior-developer",
},
state: "approved",
html_url:
"https://github.com/test-owner/test-repo/pull/321#pullrequestreview-11122233",
submitted_at: "2024-01-15T15:30:00Z",
},
pull_request: {
number: 321,
title: "Refactor: Improve error handling in API layer",
body: "This PR improves error handling across all API endpoints",
user: {
login: "backend-developer",
id: 33333,
avatar_url: "https://avatars.githubusercontent.com/u/33333",
html_url: "https://github.com/backend-developer",
},
},
repository: {
name: "test-repo",
full_name: "test-owner/test-repo",
private: false,
owner: {
login: "test-owner",
},
},
} as PullRequestReviewEvent,
entityNumber: 321,
isPR: true,
inputs: { ...defaultInputs, triggerPhrase: "@claude" },
};
export const mockPullRequestReviewCommentContext: ParsedGitHubContext = { export const mockPullRequestReviewCommentContext: ParsedGitHubContext = {
runId: "1234567890", runId: "1234567890",
eventName: "pull_request_review_comment", eventName: "pull_request_review_comment",

View File

@@ -10,6 +10,7 @@ import {
mockPullRequestCommentContext, mockPullRequestCommentContext,
mockPullRequestReviewContext, mockPullRequestReviewContext,
mockPullRequestReviewCommentContext, mockPullRequestReviewCommentContext,
mockPullRequestReviewWithoutCommentContext,
} from "./mockContext"; } from "./mockContext";
const BASE_ENV = { const BASE_ENV = {
@@ -126,6 +127,24 @@ describe("parseEnvVarsWithContext", () => {
}); });
}); });
describe("pull_request_review event without comment", () => {
test("should parse pull_request_review event correctly", () => {
process.env = BASE_ENV;
const result = prepareContext(
mockPullRequestReviewWithoutCommentContext,
"12345",
);
expect(result.eventData.eventName).toBe("pull_request_review");
expect(result.eventData.isPR).toBe(true);
expect(result.triggerUsername).toBe("senior-developer");
if (result.eventData.eventName === "pull_request_review") {
expect(result.eventData.prNumber).toBe("321");
expect(result.eventData.commentBody).toBe("");
}
});
});
describe("pull_request_review_comment event", () => { describe("pull_request_review_comment event", () => {
test("should parse pull_request_review_comment event correctly", () => { test("should parse pull_request_review_comment event correctly", () => {
process.env = BASE_ENV; process.env = BASE_ENV;