diff --git a/src/main/java/com/issueDive/dto/IssueFilterRequest.java b/src/main/java/com/issueDive/dto/IssueFilterRequest.java index 9745d60..19f5455 100644 --- a/src/main/java/com/issueDive/dto/IssueFilterRequest.java +++ b/src/main/java/com/issueDive/dto/IssueFilterRequest.java @@ -6,7 +6,7 @@ import java.util.List; public record IssueFilterRequest( - @Pattern(regexp = "open|closed|OPEN|CLOSED") String status, + @Pattern(regexp = "open|closed|in_progress|OPEN|CLOSED|IN_PROGRESS", message = "상태 값은 open, closed, in_progress 중 하나여야 합니다.") String status, Long authorId, Long assigneeId, List labelIds, diff --git a/src/main/java/com/issueDive/entity/IssueStatus.java b/src/main/java/com/issueDive/entity/IssueStatus.java index 043995a..63103d7 100644 --- a/src/main/java/com/issueDive/entity/IssueStatus.java +++ b/src/main/java/com/issueDive/entity/IssueStatus.java @@ -1,5 +1,5 @@ package com.issueDive.entity; public enum IssueStatus { - OPEN, CLOSED + OPEN, IN_PROGRESS, CLOSED } diff --git a/src/main/java/com/issueDive/service/IssueService.java b/src/main/java/com/issueDive/service/IssueService.java index 412d4ad..fc7624e 100644 --- a/src/main/java/com/issueDive/service/IssueService.java +++ b/src/main/java/com/issueDive/service/IssueService.java @@ -154,7 +154,7 @@ public IssueResponse updateIssue(Long id, UpdateIssueRequest request) { /** * 이슈 상태 변경 * @param id 상태 변경할 Issue ID - * @param status 변경할 상태 (OPEN, CLOSED) + * @param status 변경할 상태 (OPEN, IN_PROGRESS, CLOSED) * @return 상태가 변경된 IssueResponse */ public IssueResponse changeIssueStatus(Long id, String status) { @@ -165,7 +165,7 @@ public IssueResponse changeIssueStatus(Long id, String status) { try { newStatus = IssueStatus.valueOf(status.toUpperCase()); } catch (IllegalArgumentException e) { - throw new ValidationException(ErrorCode.InvalidStatus, "status must be either OPEN or CLOSED"); + throw new ValidationException(ErrorCode.InvalidStatus, "status must be one of OPEN, IN_PROGRESS, or CLOSED"); } issue.setStatus(newStatus); diff --git a/src/test/java/com/issueDive/service/IssueServiceTest.java b/src/test/java/com/issueDive/service/IssueServiceTest.java index 76f9c80..b7b735f 100644 --- a/src/test/java/com/issueDive/service/IssueServiceTest.java +++ b/src/test/java/com/issueDive/service/IssueServiceTest.java @@ -12,8 +12,11 @@ import com.issueDive.repository.LabelRepository; import com.issueDive.repository.UserRepository; import com.issueDive.service.IssueService; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -212,9 +215,11 @@ void deleteIssue_success() { * 이슈 상태 변경 테스트 * 정상 케이스: OPEN 또는 CLOSED 상태로 변경 시 정상 응답 확인 */ - @Test - void changeIssueStatus_validStatus_success() { - // given + @ParameterizedTest + @ValueSource(strings = {"OPEN", "IN_PROGRESS", "CLOSED"}) + @DisplayName("유효한 상태값(OPEN, IN_PROGRESS, CLOSED)으로 이슈 상태 변경 성공") + void changeIssueStatus_validStatus_success(String validStatus) { +// given Issue issue = Issue.builder() .id(1L) .status(IssueStatus.OPEN) @@ -225,10 +230,10 @@ void changeIssueStatus_validStatus_success() { when(issueRepository.save(any(Issue.class))).thenAnswer(invocation -> invocation.getArgument(0)); //when - IssueResponse response = issueService.changeIssueStatus(1L, "CLOSED"); + IssueResponse response = issueService.changeIssueStatus(1L, validStatus); // then - assertEquals("CLOSED", response.status()); + assertEquals(validStatus, response.status()); verify(issueRepository).save(issue); } @@ -237,6 +242,7 @@ void changeIssueStatus_validStatus_success() { * 예외 케이스1: 존재하지 않는 이슈 ID 요청 시 NotFoundException 발생 확인 */ @Test + @DisplayName("존재하지 않는 이슈의 상태 변경 시도 시 NotFoundException 발생") void changeIssueStatus_issueNotFound() { // given when(issueRepository.findById(99L)).thenReturn(Optional.empty()); @@ -253,6 +259,7 @@ void changeIssueStatus_issueNotFound() { * 예외 케이스2: 유효하지 않은 상태 값 요청 시 ValidationException 발생 확인 */ @Test + @DisplayName("유효하지 않은 상태값으로 이슈 상태 변경 시도 시 ValidationException 발생") void changeIssueStatus_invalidStatus_throwsValidationException() { // given Issue issue = Issue.builder() @@ -267,7 +274,7 @@ void changeIssueStatus_invalidStatus_throwsValidationException() { ValidationException ex = assertThrows(ValidationException.class, () -> issueService.changeIssueStatus(1L, "INVALID_STATUS")); - assertTrue(ex.getMessage().contains("status must be either OPEN or CLOSED")); + assertTrue(ex.getMessage().contains("status must be one of OPEN, IN_PROGRESS, or CLOSED")); } /**