diff --git a/src/main/java/pl/commit/gen/controller/CommitController.java b/src/main/java/pl/commit/gen/controller/CommitController.java deleted file mode 100644 index f1cbfbf..0000000 --- a/src/main/java/pl/commit/gen/controller/CommitController.java +++ /dev/null @@ -1,26 +0,0 @@ -package pl.commit.gen.controller; - -import org.springframework.web.bind.annotation.*; -import pl.commit.gen.service.CommitService; - -@RestController -@RequestMapping("/api/commit") -public class CommitController { - - private final CommitService commitService; - - public CommitController(CommitService commitService) { - this.commitService = commitService; - } - - @PostMapping("/generate") - public String generateCommit(@RequestBody CommitRequest commitRequest) { - return commitService.generateCommit( - commitRequest.major(), - commitRequest.type(), - commitRequest.component(), - commitRequest.changeDescription(), - commitRequest.details() - ); - } -} diff --git a/src/main/java/pl/commit/gen/controller/CommitTranslateController.java b/src/main/java/pl/commit/gen/controller/CommitTranslateController.java new file mode 100644 index 0000000..daa073d --- /dev/null +++ b/src/main/java/pl/commit/gen/controller/CommitTranslateController.java @@ -0,0 +1,27 @@ +package pl.commit.gen.controller; + +import org.springframework.web.bind.annotation.*; +import pl.commit.gen.service.CommitService; + +@RestController +@RequestMapping("/api/commit-translate") +public class CommitTranslateController { + + private final CommitService commitService; + + public CommitTranslateController(CommitService commitService) { + this.commitService = commitService; + } + + @PostMapping("/generate") + public String generateCommit(@RequestBody CommitTranslateRequest commitTranslateRequest) { + return commitService.generateTranslateCommit( + commitTranslateRequest.major(), + commitTranslateRequest.type(), + commitTranslateRequest.component(), + commitTranslateRequest.changeDescription(), + commitTranslateRequest.details(), + commitTranslateRequest.wholeGitCommand() + ); + } +} diff --git a/src/main/java/pl/commit/gen/controller/CommitRequest.java b/src/main/java/pl/commit/gen/controller/CommitTranslateRequest.java similarity index 60% rename from src/main/java/pl/commit/gen/controller/CommitRequest.java rename to src/main/java/pl/commit/gen/controller/CommitTranslateRequest.java index fcf2c9a..672234a 100644 --- a/src/main/java/pl/commit/gen/controller/CommitRequest.java +++ b/src/main/java/pl/commit/gen/controller/CommitTranslateRequest.java @@ -1,9 +1,10 @@ package pl.commit.gen.controller; -public record CommitRequest( +public record CommitTranslateRequest( String major, String type, String component, String changeDescription, - String details + String details, + boolean wholeGitCommand ) {} diff --git a/src/main/java/pl/commit/gen/flow/CommitFlowController.java b/src/main/java/pl/commit/gen/flow/CommitFlowController.java new file mode 100644 index 0000000..bac1520 --- /dev/null +++ b/src/main/java/pl/commit/gen/flow/CommitFlowController.java @@ -0,0 +1,30 @@ +package pl.commit.gen.flow; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import pl.commit.gen.service.CommitService; + +@RestController +@RequestMapping("/api/commit-flow") +public class CommitFlowController { + + private final CommitService commitService; + + public CommitFlowController(CommitService commitService) { + this.commitService = commitService; + } + + @PostMapping("/generate") + public String generateCommit(@RequestBody CommitFlowRequest commitFlowRequest) { + return commitService.generateFlowCommit( + commitFlowRequest.major(), + commitFlowRequest.type(), + commitFlowRequest.component(), + commitFlowRequest.changeDescription(), + commitFlowRequest.details(), + commitFlowRequest.wholeGitCommand() + ); + } +} diff --git a/src/main/java/pl/commit/gen/flow/CommitFlowRequest.java b/src/main/java/pl/commit/gen/flow/CommitFlowRequest.java new file mode 100644 index 0000000..714e2ee --- /dev/null +++ b/src/main/java/pl/commit/gen/flow/CommitFlowRequest.java @@ -0,0 +1,11 @@ +package pl.commit.gen.flow; + +record CommitFlowRequest( + String major, + String type, + String component, + String changeDescription, + String details, + boolean wholeGitCommand +) {} + diff --git a/src/main/java/pl/commit/gen/pattern/BasicModelPattern.java b/src/main/java/pl/commit/gen/pattern/BasicModelPattern.java index 892a630..783b5df 100644 --- a/src/main/java/pl/commit/gen/pattern/BasicModelPattern.java +++ b/src/main/java/pl/commit/gen/pattern/BasicModelPattern.java @@ -3,6 +3,10 @@ sealed class BasicModelPattern permits CommitModelPattern { private static final String TARGET_LANG = "EN"; + protected BasicModelPattern() { + throw new IllegalStateException("Utility class"); + } + public static String getTargetLanguage() { return TARGET_LANG; } diff --git a/src/main/java/pl/commit/gen/pattern/CommitModelPattern.java b/src/main/java/pl/commit/gen/pattern/CommitModelPattern.java index f2c093e..971ba42 100644 --- a/src/main/java/pl/commit/gen/pattern/CommitModelPattern.java +++ b/src/main/java/pl/commit/gen/pattern/CommitModelPattern.java @@ -2,13 +2,97 @@ public final class CommitModelPattern extends BasicModelPattern { private static final String GIT_COMMAND = "git commit -m"; - private static final String COMMITING_WORK_PATTERN = "%s \"%s %s(%s): %s\n\n%s\""; - public static String getCommittingWorkPattern() { + private static final String GIT_COMMAND_COMMITING_WORK_PATTERN = GIT_COMMAND + " \"%s %s(%s): %s\n\n%s\""; + private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT = GIT_COMMAND + " \"%s %s: %s\n\n%s\""; + private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_DETAILS = GIT_COMMAND + " \"%s %s(%s): %s\""; + private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS = GIT_COMMAND + " \"%s %s: %s\""; + + private static final String COMMITING_WORK_PATTERN = "%s %s(%s): %s\n\n%s"; + private static final String COMMITING_WORK_PATTERN_WITHOUT_COMPONENT = "%s %s: %s\n\n%s"; + private static final String COMMITING_WORK_PATTERN_WITHOUT_DETAILS = "%s %s(%s): %s"; + private static final String COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS = "%s %s: %s"; + + private static String getGitCommandCommittingWorkPattern() { + return GIT_COMMAND_COMMITING_WORK_PATTERN; + } + + private static String getGitCommandCommittingWorkPatternWithoutComponent() { + return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT; + } + + private static String getGitCommandCommittingWorkPatternWithoutDetails() { + return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_DETAILS; + } + + private static String getGitCommandCommittingWorkPatternWithoutComponentAndDetails() { + return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS; + } + + private static String getCommittingWorkPattern() { return COMMITING_WORK_PATTERN; } - public static String getGitCommandPattern() { - return GIT_COMMAND; + private static String getCommittingWorkPatternWithoutComponent() { + return COMMITING_WORK_PATTERN_WITHOUT_COMPONENT; + } + + private static String getCommittingWorkPatternWithoutDetails() { + return COMMITING_WORK_PATTERN_WITHOUT_DETAILS; + } + + private static String getCommittingWorkPatternWithoutComponentAndDetails() { + return COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS; + } + + /** + * Główna metoda wybierająca odpowiedni wzorzec na podstawie flagi `wholeGitCommand`, `component` i `details`. + * @param wholeGitCommand - jeśli true, zwraca wzorzec z pełnym git commit. + * @param component - nazwa komponentu, może być pusta. + * @param details - szczegóły, mogą być puste. + * @return odpowiedni wzorzec. + */ + public static String getPattern(boolean wholeGitCommand, String component, String details) { + if (wholeGitCommand) { + return getPatternWithGitCommand(component, details); + } else { + return getPatternWithoutGitCommand(component, details); + } + } + + /** + * Zwraca odpowiedni wzorzec z pełnym poleceniem Git, w zależności od tego, czy `component` i `details` są puste. + * @param component - nazwa komponentu. + * @param details - szczegóły. + * @return wzorzec z pełnym poleceniem Git. + */ + private static String getPatternWithGitCommand(String component, String details) { + if (component.isEmpty() && details.isEmpty()) { + return getGitCommandCommittingWorkPatternWithoutComponentAndDetails(); + } else if (component.isEmpty()) { + return getGitCommandCommittingWorkPatternWithoutComponent(); + } else if (details.isEmpty()) { + return getGitCommandCommittingWorkPatternWithoutDetails(); + } else { + return getGitCommandCommittingWorkPattern(); + } + } + + /** + * Zwraca odpowiedni wzorzec bez pełnego polecenia Git, w zależności od tego, czy `component` i `details` są puste. + * @param component - nazwa komponentu. + * @param details - szczegóły. + * @return wzorzec bez pełnego polecenia Git. + */ + private static String getPatternWithoutGitCommand(String component, String details) { + if (component.isEmpty() && details.isEmpty()) { + return getCommittingWorkPatternWithoutComponentAndDetails(); + } else if (component.isEmpty()) { + return getCommittingWorkPatternWithoutComponent(); + } else if (details.isEmpty()) { + return getCommittingWorkPatternWithoutDetails(); + } else { + return getCommittingWorkPattern(); + } } } diff --git a/src/main/java/pl/commit/gen/service/CommitService.java b/src/main/java/pl/commit/gen/service/CommitService.java index dc4b529..8395912 100644 --- a/src/main/java/pl/commit/gen/service/CommitService.java +++ b/src/main/java/pl/commit/gen/service/CommitService.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import pl.commit.gen.pattern.CommitModelPattern; import pl.commit.translate.TranslateCommiting; @@ -10,21 +11,42 @@ public class CommitService { private final TranslateCommiting translateCommiting; - public String generateCommit(String major, String type, String component, String changeDescription, String details) { - if (!isValidType(type)) { + public String generateTranslateCommit(String major, String type, String component, String changeDescription, String details, boolean wholeGitCommand) { + if (isValidType(type)) { throw new IllegalArgumentException("Invalid commit type: " + type); } + MajorNumber majorNumber = MajorNumberPreparer.of(major).getMajorNumber(); String changeDescriptionTranslated = getChangeDescriptionTranslated(changeDescription); String detailsTranslated = !details.isEmpty() ? getChangeDescriptionTranslated(details) : ""; + String pattern = CommitModelPattern.getPattern(wholeGitCommand, component, detailsTranslated); + return String.format( - CommitModelPattern.getCommittingWorkPattern(), - CommitModelPattern.getGitCommandPattern(), + pattern, majorNumber != null ? majorNumber.issueNumber() : "", type, - component, + component.isEmpty() ? changeDescriptionTranslated : component, changeDescriptionTranslated, - detailsTranslated.isEmpty() ? "" : detailsTranslated + detailsTranslated + ).trim(); + } + + public String generateFlowCommit(String major, String type, String component, String changeDescription, String details, boolean wholeGitCommand) { + if (isValidType(type)) { + throw new IllegalArgumentException("Invalid commit type: " + type); + } + + MajorNumber majorNumber = MajorNumberPreparer.of(major).getMajorNumber(); + String detailsFlow = details.isEmpty() ? StringUtils.trimAllWhitespace(details) : details; + String pattern = CommitModelPattern.getPattern(wholeGitCommand, component, detailsFlow); + + return String.format( + pattern, + majorNumber != null ? majorNumber.issueNumber() : "", + type, + component, + changeDescription, + detailsFlow ).trim(); } @@ -33,6 +55,6 @@ private String getChangeDescriptionTranslated(String changeDescription) { } private boolean isValidType(String type) { - return CommitType.isValidType(type); + return !CommitType.isValidType(type); } } diff --git a/src/main/java/pl/commit/gen/service/CommitType.java b/src/main/java/pl/commit/gen/service/CommitType.java index abb4e62..913c2a6 100644 --- a/src/main/java/pl/commit/gen/service/CommitType.java +++ b/src/main/java/pl/commit/gen/service/CommitType.java @@ -10,7 +10,8 @@ enum CommitType { STYLE("style"), REFACTOR("refactor"), TEST("test"), - CHORE("chore"); + CHORE("chore"), + AUDIT("audit"); private final String type; diff --git a/src/test/java/pl/commit/gen/flow/CommitFlowControllerTest.java b/src/test/java/pl/commit/gen/flow/CommitFlowControllerTest.java new file mode 100644 index 0000000..b699d80 --- /dev/null +++ b/src/test/java/pl/commit/gen/flow/CommitFlowControllerTest.java @@ -0,0 +1,59 @@ +package pl.commit.gen.flow; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import pl.commit.gen.service.CommitService; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; + +@ExtendWith(MockitoExtension.class) +class CommitFlowControllerTest { + + @Mock + private CommitService commitService; + + @InjectMocks + private CommitFlowController commitFlowController; + + private MockMvc mockMvc; + + @Test + void testGenerateCommitSuccess() throws Exception { + mockMvc = MockMvcBuilders.standaloneSetup(commitFlowController).build(); + MockHttpServletRequest request = new MockHttpServletRequest(); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + + // given + String requestBody = "{" + + "\"major\":\"1\"," + + "\"type\":\"bugfix\"," + + "\"component\":\"componentA\"," + + "\"changeDescription\":\"Fixed issue\"," + + "\"details\":\"Detailed description\"," + + "\"wholeGitCommand\":true" + + "}"; + + // when + when(commitService.generateFlowCommit("1", "bugfix", "componentA", "Fixed issue", "Detailed description", true)) + .thenReturn("git commit -m \"1 bugfix(componentA): Fixed issue\n\nDetailed description\""); + + //then + mockMvc.perform(post("/api/commit-flow/generate") + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) // Oczekiwany status HTTP 200 + .andExpect(content().string("git commit -m \"1 bugfix(componentA): Fixed issue\n\nDetailed description\"")); // Oczekiwana odpowiedź + } +} diff --git a/src/test/java/pl/commit/gen/pattern/CommitModelPatternTest.java b/src/test/java/pl/commit/gen/pattern/CommitModelPatternTest.java new file mode 100644 index 0000000..cd018b3 --- /dev/null +++ b/src/test/java/pl/commit/gen/pattern/CommitModelPatternTest.java @@ -0,0 +1,64 @@ +package pl.commit.gen.pattern; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CommitModelPatternTest { + @Test + void testGetPatternWithGitCommandWithoutComponentAndDetails() { + String result = CommitModelPattern.getPattern(true, "", ""); + String expected = "git commit -m \"%s %s: %s\""; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithGitCommandWithoutComponent() { + String result = CommitModelPattern.getPattern(true, "", "Some details"); + String expected = "git commit -m \"%s %s: %s\n\n%s\""; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithGitCommandWithoutDetails() { + + String result = CommitModelPattern.getPattern(true, "Component", ""); + String expected = "git commit -m \"%s %s(%s): %s\""; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithGitCommand() { + String result = CommitModelPattern.getPattern(true, "Component", "Some details"); + String expected = "git commit -m \"%s %s(%s): %s\n\n%s\""; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithoutGitCommandWithoutComponentAndDetails() { + String result = CommitModelPattern.getPattern(false, "", ""); + String expected = "%s %s: %s"; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithoutGitCommandWithoutComponent() { + String result = CommitModelPattern.getPattern(false, "", "Some details"); + String expected = "%s %s: %s\n\n%s"; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithoutGitCommandWithoutDetails() { + String result = CommitModelPattern.getPattern(false, "Component", ""); + String expected = "%s %s(%s): %s"; + assertEquals(expected, result); + } + + @Test + void testGetPatternWithoutGitCommand() { + String result = CommitModelPattern.getPattern(false, "Component", "Some details"); + String expected = "%s %s(%s): %s\n\n%s"; + assertEquals(expected, result); + } +} diff --git a/src/test/java/pl/commit/gen/service/CommitServiceTest.java b/src/test/java/pl/commit/gen/service/CommitServiceTest.java index 764cefd..2aaffe3 100644 --- a/src/test/java/pl/commit/gen/service/CommitServiceTest.java +++ b/src/test/java/pl/commit/gen/service/CommitServiceTest.java @@ -7,6 +7,7 @@ import org.mockito.MockitoAnnotations; import pl.commit.translate.TranslateCommiting; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; @@ -24,19 +25,20 @@ void setUp() { } @Test - void testGenerateCommitValidType() { + void testGenerateTranslateCommitValidType() { // given String major = "link/1.0.0"; String type = "feat"; String component = "UI"; String changeDescription = "Add new button"; String details = "Added a new button to the main page."; + boolean wholeGitCommand = true; // when when(translateCommiting.translate(changeDescription, "EN")).thenReturn("Add new button"); when(translateCommiting.translate(details, "EN")).thenReturn("Added a new button to the main page."); - String commitMessage = commitService.generateCommit(major, type, component, changeDescription, details); + String commitMessage = commitService.generateTranslateCommit(major, type, component, changeDescription, details, wholeGitCommand); // then assertNotNull(commitMessage); @@ -47,12 +49,12 @@ void testGenerateCommitValidType() { } @Test - void testGenerateCommitInvalidType() { + void testGenerateTranslateCommitInvalidType() { // given String type = "invalidType"; IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { - commitService.generateCommit(null, type, "UI", "Description", "Details"); + commitService.generateTranslateCommit(null, type, "UI", "Description", "Details", false); }); // then @@ -60,18 +62,19 @@ void testGenerateCommitInvalidType() { } @Test - void testGenerateCommitEmptyDetails() { + void testGenerateTranslateCommitEmptyDetails() { // given String major = "link/1.0.0"; String type = "fix"; String component = "Backend"; String changeDescription = "Fix bug in payment module"; String details = ""; + boolean wholeGitCommand = true; // when when(translateCommiting.translate(changeDescription, "EN")).thenReturn("Fix bug in payment module"); - String commitMessage = commitService.generateCommit(major, type, component, changeDescription, details); + String commitMessage = commitService.generateTranslateCommit(major, type, component, changeDescription, details, wholeGitCommand); // then assertNotNull(commitMessage); @@ -79,23 +82,40 @@ void testGenerateCommitEmptyDetails() { } @Test - void testGenerateCommitWithTaskNumber() { + void testGenerateTranslateCommitWithTaskNumberAndWholeGitCommandIsFalse() { // given String major = "link/TEET-1234"; String type = "feat"; String component = "UI"; String changeDescription = "Add new feature"; - String details = "Details of the task"; + boolean wholeGitCommand = false; // when when(translateCommiting.translate(changeDescription, "EN")).thenReturn("Add new feature"); - when(translateCommiting.translate(details, "EN")).thenReturn("Details of the task"); + String commitMessage = commitService.generateTranslateCommit(major, type, component, changeDescription, "", wholeGitCommand); - String commitMessage = commitService.generateCommit(major, type, component, changeDescription, details); + // then + assertNotNull(commitMessage); + assertTrue(commitMessage.contains("TEET-1234")); + assertThat(commitMessage).isEqualTo("TEET-1234 feat(UI): Add new feature"); + } + + @Test + void testGenerateFlowCommitWithTaskNumber() { + // given + String major = "link/TEET-1234"; + String type = "fix"; + String component = "Report"; + String changeDescription = "Add new feature"; + String details = ""; + boolean wholeGitCommand = true; + + String commitMessage = commitService.generateFlowCommit(major, type, component, changeDescription, details, wholeGitCommand); // then assertNotNull(commitMessage); assertTrue(commitMessage.contains("TEET-1234")); + assertThat(commitMessage).isEqualTo("git commit -m \"TEET-1234 fix(Report): Add new feature\""); } } diff --git a/translate/src/main/resources/application.yml b/translate/src/main/resources/application.yml index ec87af6..057f7d0 100644 --- a/translate/src/main/resources/application.yml +++ b/translate/src/main/resources/application.yml @@ -1,4 +1,4 @@ deepl: api: - key: + key: 92f2c230-abe8-4dc6-b90b-bbc3f7db0210:fx url: https://api-free.deepl.com/v2/translate