From 59dcc89261a00a079f4ee66fe904b00fa6457a5d Mon Sep 17 00:00:00 2001 From: nano-mm Date: Mon, 10 Feb 2025 16:12:45 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=EB=82=B4=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C,=20=ED=8C=80=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=ED=98=84=ED=99=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/task/FilterTeamStatusTest.java | 134 ++++++++++++++++++ .../task/FindTasksAssignedByManagerTest.java | 107 ++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 src/test/java/clap/server/application/service/task/FilterTeamStatusTest.java create mode 100644 src/test/java/clap/server/application/service/task/FindTasksAssignedByManagerTest.java diff --git a/src/test/java/clap/server/application/service/task/FilterTeamStatusTest.java b/src/test/java/clap/server/application/service/task/FilterTeamStatusTest.java new file mode 100644 index 00000000..db63193c --- /dev/null +++ b/src/test/java/clap/server/application/service/task/FilterTeamStatusTest.java @@ -0,0 +1,134 @@ +package clap.server.application.service.task; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import clap.server.adapter.inbound.web.dto.task.request.FilterTeamStatusRequest; +import clap.server.adapter.inbound.web.dto.task.request.SortBy; +import clap.server.adapter.inbound.web.dto.task.response.TeamStatusResponse; +import clap.server.adapter.inbound.web.dto.task.response.TeamTaskItemResponse; +import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse; +import clap.server.adapter.inbound.web.task.TeamStatusController; +import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; +import clap.server.application.port.inbound.task.FilterTeamStatusUsecase; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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.HttpStatus; +import org.springframework.http.ResponseEntity; + +import java.time.LocalDateTime; +import java.util.List; + +@ExtendWith(MockitoExtension.class) +class FilterTeamStatusTest { + + @Mock + private FilterTeamStatusUsecase filterTeamStatusUsecase; + + @InjectMocks + private TeamStatusController teamStatusController; + + private FilterTeamStatusRequest defaultFilterRequest; + private TeamTaskItemResponse defaultItem; + private TeamTaskResponse defaultMember; + private TeamStatusResponse defaultResponse; + + @BeforeEach + void setUp() { + defaultFilterRequest = new FilterTeamStatusRequest( + SortBy.DEFAULT, List.of(10L, 20L), List.of(1L, 2L), "테스트 타이틀" + ); + + defaultItem = new TeamTaskItemResponse( + 1L, "TC001", "테스트 타이틀", "1차 카테고리", "2차 카테고리", + new TeamTaskItemResponse.LabelInfo("라벨명", LabelColor.BLUE), + "요청자", "요청자 이미지", "요청자 부서", + 1L, TaskStatus.IN_PROGRESS, LocalDateTime.of(2025, 2, 9, 10, 0) + ); + + defaultMember = new TeamTaskResponse( + 100L, "담당자1", "담당자 이미지", "담당자 부서", + 1, 0, 1, List.of(defaultItem) + ); + + defaultResponse = new TeamStatusResponse(List.of(defaultMember), 1, 0, 1); + } + + @Test + @DisplayName("팀 현황 조회 - 정상 응답") + void filterTeamStatus_Success() { + when(filterTeamStatusUsecase.filterTeamStatus(defaultFilterRequest)).thenReturn(defaultResponse); + + ResponseEntity response = teamStatusController.filterTeamStatus(defaultFilterRequest); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(defaultResponse); + } + + @Test + @DisplayName("팀 현황 조회 - 빈 결과") + void filterTeamStatus_EmptyResult() { + FilterTeamStatusRequest emptyFilterRequest = new FilterTeamStatusRequest(SortBy.DEFAULT, List.of(), List.of(), ""); + TeamStatusResponse emptyResponse = new TeamStatusResponse(List.of(), 0, 0, 0); + + when(filterTeamStatusUsecase.filterTeamStatus(emptyFilterRequest)).thenReturn(emptyResponse); + + ResponseEntity response = teamStatusController.filterTeamStatus(emptyFilterRequest); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(emptyResponse); + } + + @Test + @DisplayName("팀 현황 조회 - 기여도순 정렬") + void filterTeamStatus_SortByContribute() { + FilterTeamStatusRequest contributeRequest = new FilterTeamStatusRequest(SortBy.CONTRIBUTE, List.of(10L), List.of(1L), "테스트 타이틀"); + + LocalDateTime now = LocalDateTime.now(); + TeamTaskItemResponse item1 = new TeamTaskItemResponse(1L, "TC001", "타이틀1", "1차 카테고리", "2차 카테고리", + new TeamTaskItemResponse.LabelInfo("라벨1", LabelColor.BLUE), "요청자1", "이미지1", "부서1", 1L, TaskStatus.IN_PROGRESS, now); + TeamTaskItemResponse item2 = new TeamTaskItemResponse(2L, "TC002", "타이틀2", "1차 카테고리", "2차 카테고리", + new TeamTaskItemResponse.LabelInfo("라벨2", LabelColor.RED), "요청자2", "이미지2", "부서2", 2L, TaskStatus.IN_PROGRESS, now); + + TeamTaskResponse member1 = new TeamTaskResponse(100L, "담당자1", "이미지1", "부서1", 2, 1, 3, List.of(item1, item2)); + TeamTaskResponse member2 = new TeamTaskResponse(200L, "담당자2", "이미지2", "부서2", 1, 0, 1, List.of(item1)); + + TeamStatusResponse contributeResponse = new TeamStatusResponse(List.of(member1, member2), + member1.inProgressTaskCount() + member2.inProgressTaskCount(), + member1.inReviewingTaskCount() + member2.inReviewingTaskCount(), + member1.totalTaskCount() + member2.totalTaskCount()); + + when(filterTeamStatusUsecase.filterTeamStatus(contributeRequest)).thenReturn(contributeResponse); + + ResponseEntity response = teamStatusController.filterTeamStatus(contributeRequest); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(contributeResponse); + } + + @Test + @DisplayName("팀 현황 조회 - 카테고리 필터링") + void filterTeamStatus_CategoryFiltering() { + FilterTeamStatusRequest categoryFilterRequest = new FilterTeamStatusRequest(SortBy.DEFAULT, List.of(10L), List.of(), "타이틀"); + + LocalDateTime now = LocalDateTime.now(); + TeamTaskItemResponse matchingItem = new TeamTaskItemResponse(1L, "TC001", "타이틀 매칭", "1차 카테고리", "2차 카테고리", + new TeamTaskItemResponse.LabelInfo("라벨1", LabelColor.BLUE), "요청자1", "이미지1", "부서1", 1L, TaskStatus.IN_PROGRESS, now); + + TeamTaskResponse categoryMember = new TeamTaskResponse(300L, "카테고리담당자", "이미지3", "부서3", 1, 0, 1, List.of(matchingItem)); + + TeamStatusResponse categoryResponse = new TeamStatusResponse(List.of(categoryMember), 1, 0, 1); + when(filterTeamStatusUsecase.filterTeamStatus(categoryFilterRequest)).thenReturn(categoryResponse); + + ResponseEntity response = teamStatusController.filterTeamStatus(categoryFilterRequest); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(categoryResponse); + } +} \ No newline at end of file diff --git a/src/test/java/clap/server/application/service/task/FindTasksAssignedByManagerTest.java b/src/test/java/clap/server/application/service/task/FindTasksAssignedByManagerTest.java new file mode 100644 index 00000000..84c65c2d --- /dev/null +++ b/src/test/java/clap/server/application/service/task/FindTasksAssignedByManagerTest.java @@ -0,0 +1,107 @@ +package clap.server.application.service.task; + +import clap.server.adapter.inbound.web.dto.common.PageResponse; +import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest; +import clap.server.adapter.inbound.web.dto.task.response.FilterAssignedTaskListResponse; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; +import clap.server.TestDataFactory; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.outbound.task.LoadTaskPort; +import clap.server.domain.model.member.Member; +import clap.server.domain.model.task.Category; +import clap.server.domain.model.task.Task; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class FindTasksAssignedByManagerTest { + + @Mock + private MemberService memberService; + @Mock + private LoadTaskPort loadTaskPort; + @InjectMocks + private FindTaskListService findTaskListService; + private Member manager; + private Page taskPage; + private Task task1, task2; + private Category category, mainCategory; + private Member requester; + + @BeforeEach + void setUp() { + manager = TestDataFactory.createManager(); + requester = TestDataFactory.createUser(); + mainCategory = TestDataFactory.createMainCategory(); + category = TestDataFactory.createCategory(mainCategory); + task1 = TestDataFactory.createTask(1L, "TC001", "제목1", TaskStatus.IN_PROGRESS, category, null, requester); + task2 = TestDataFactory.createTask(2L, "TC002", "제목2", TaskStatus.IN_REVIEWING, category, LocalDateTime.of(2025, 2, 4, 11, 30, 11), requester); + taskPage = new PageImpl<>(List.of(task1, task2)); + } + + @Test + @DisplayName("할당된 작업 목록 조회") + void findTasksAssignedByManager() { + // given + Long managerId = 3L; + PageRequest pageable = PageRequest.of(0, 20); + FilterTaskListRequest filterTaskListRequest = new FilterTaskListRequest(null, List.of(), List.of(), "", "", List.of(), "", ""); + when(memberService.findActiveMember(managerId)).thenReturn(manager); + when(loadTaskPort.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest)) + .thenReturn(taskPage); + + // when + PageResponse result = findTaskListService.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest); + + // then + assertThat(result.content()).hasSize(2) + .extracting(FilterAssignedTaskListResponse::taskId) + .containsExactly(1L, 2L); + + FilterAssignedTaskListResponse task1Response = result.content().get(0); + assertThat(task1Response.taskId()).isEqualTo(1L); + assertThat(task1Response.taskCode()).isEqualTo("TC001"); + assertThat(task1Response.mainCategoryName()).isEqualTo("1차 카테고리"); + assertThat(task1Response.categoryName()).isEqualTo("2차 카테고리"); + assertThat(task1Response.title()).isEqualTo("제목1"); + assertThat(task1Response.requesterName()).isEqualTo(requester.getNickname()); + assertThat(task1Response.taskStatus()).isEqualTo(TaskStatus.IN_PROGRESS); + assertThat(task1Response.finishedAt()).isNull(); + } + + @Test + @DisplayName("할당된 작업 목록 조회 - 카테고리 필터 적용") + void findTasksAssignedByManager_FilteredWithCategory() { + // given + Long managerId = 10L; + PageRequest pageable = PageRequest.of(0, 20); + FilterTaskListRequest filterTaskListRequest = new FilterTaskListRequest(null, List.of(2L), List.of(), "", "", List.of(), "", ""); + taskPage = new PageImpl<>(List.of(task2)); + + when(memberService.findActiveMember(managerId)).thenReturn(manager); + when(loadTaskPort.findTasksAssignedByManager(manager.getMemberId(), pageable, filterTaskListRequest)) + .thenReturn(taskPage); + + // when + PageResponse result = findTaskListService.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest); + + // then + assertThat(result.content()).hasSize(1); + assertThat(result.content()).extracting(FilterAssignedTaskListResponse::categoryName) + .containsExactly("2차 카테고리"); + } +}