diff --git a/src/test/java/com/codepilot/module/github/webhook/GitHubWebhookPayloadParserTest.java b/src/test/java/com/codepilot/module/github/webhook/GitHubWebhookPayloadParserTest.java index b69ef53..cff80f1 100644 --- a/src/test/java/com/codepilot/module/github/webhook/GitHubWebhookPayloadParserTest.java +++ b/src/test/java/com/codepilot/module/github/webhook/GitHubWebhookPayloadParserTest.java @@ -134,6 +134,60 @@ void shouldParseMentionChatCommandIssueCommentEvent() { assertThat(payload.getMentionedBot()).isTrue(); } + @Test + void shouldParseRepresentativeCommentTypesWithDeterministicRouting() { + GitHubPullRequestWebhookPayload legacyReviewPayload = parserWithoutClassifierButLlmAvailable() + .parse("issue_comment", issueCommentPayload("created", "/review", true)); + assertThat(legacyReviewPayload.isIgnored()).isFalse(); + assertThat(legacyReviewPayload.getCommandType()).isEqualTo(GithubCommandType.REVIEW.name()); + assertThat(legacyReviewPayload.getMentionedBot()).isFalse(); + + GitHubPullRequestWebhookPayload explicitReviewPayload = parserWithoutClassifierButLlmAvailable() + .parse("issue_comment", issueCommentPayload("created", "@x-pilotx review this PR", true)); + assertThat(explicitReviewPayload.isIgnored()).isFalse(); + assertThat(explicitReviewPayload.getCommandType()).isEqualTo(GithubCommandType.REVIEW.name()); + assertThat(explicitReviewPayload.getMentionedBot()).isTrue(); + + GitHubPullRequestWebhookPayload summaryPayload = parserWithoutClassifierButLlmAvailable() + .parse("issue_comment", issueCommentPayload("created", "@x-pilotx summarize the current review findings", true)); + assertThat(summaryPayload.isIgnored()).isFalse(); + assertThat(summaryPayload.getCommandType()).isEqualTo(GithubCommandType.CHAT.name()); + assertThat(summaryPayload.getMentionedBot()).isTrue(); + } + + @Test + void shouldParseRepresentativeCommentTypesThroughClassifierWhenNeeded() { + GitHubWebhookPayloadParser fixParser = parserWithAiResponse(""" + { + "type": "FIX", + "dryRun": false, + "reason": "asks the bot to fix the above issues" + } + """); + GitHubPullRequestWebhookPayload fixPayload = fixParser.parse( + "issue_comment", + issueCommentPayload("created", "@x-pilotx please fix the above issues", true) + ); + assertThat(fixPayload.isIgnored()).isFalse(); + assertThat(fixPayload.getCommandType()).isEqualTo(GithubCommandType.FIX.name()); + assertThat(fixPayload.getMentionedBot()).isTrue(); + + GitHubWebhookPayloadParser chatParser = parserWithAiResponse(""" + { + "type": "CHAT", + "dryRun": false, + "reason": "greeting" + } + """); + GitHubPullRequestWebhookPayload chatPayload = chatParser.parse( + "issue_comment", + issueCommentPayload("created", "@x-pilotx hi", true) + ); + assertThat(chatPayload.isIgnored()).isFalse(); + assertThat(chatPayload.getCommandType()).isEqualTo(GithubCommandType.CHAT.name()); + assertThat(chatPayload.getMentionedBot()).isTrue(); + } + @Test void shouldParseUnknownMentionAsCommand() { GitHubWebhookPayloadParser aiParser = parserWithAiResponse(""" diff --git a/src/test/java/com/codepilot/module/review/validation/ReviewBotValidationFixtureTest.java b/src/test/java/com/codepilot/module/review/validation/ReviewBotValidationFixtureTest.java new file mode 100644 index 0000000..7d05449 --- /dev/null +++ b/src/test/java/com/codepilot/module/review/validation/ReviewBotValidationFixtureTest.java @@ -0,0 +1,15 @@ +package com.codepilot.module.review.validation; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ReviewBotValidationFixtureTest { + + @Test + void shouldKeepAnObviousSqlRiskSnippetForReviewBotValidation() { + String unsafeSql = "SELECT * FROM users WHERE id = ${id}"; + + assertThat(unsafeSql).contains("${id}"); + } +}