Skip to content

Commit af8f272

Browse files
authored
Merge pull request #466 from TaskFlow-CLAP/CLAP-366
Clap-366 내 작업 조회 / 팀 작업 현황 페이지 단위 테스트 코드
2 parents c1bb292 + 59dcc89 commit af8f272

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package clap.server.application.service.task;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.Mockito.when;
5+
6+
import clap.server.adapter.inbound.web.dto.task.request.FilterTeamStatusRequest;
7+
import clap.server.adapter.inbound.web.dto.task.request.SortBy;
8+
import clap.server.adapter.inbound.web.dto.task.response.TeamStatusResponse;
9+
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskItemResponse;
10+
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse;
11+
import clap.server.adapter.inbound.web.task.TeamStatusController;
12+
import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor;
13+
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
14+
import clap.server.application.port.inbound.task.FilterTeamStatusUsecase;
15+
import org.junit.jupiter.api.BeforeEach;
16+
import org.junit.jupiter.api.DisplayName;
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.jupiter.api.extension.ExtendWith;
19+
import org.mockito.InjectMocks;
20+
import org.mockito.Mock;
21+
import org.mockito.junit.jupiter.MockitoExtension;
22+
import org.springframework.http.HttpStatus;
23+
import org.springframework.http.ResponseEntity;
24+
25+
import java.time.LocalDateTime;
26+
import java.util.List;
27+
28+
@ExtendWith(MockitoExtension.class)
29+
class FilterTeamStatusTest {
30+
31+
@Mock
32+
private FilterTeamStatusUsecase filterTeamStatusUsecase;
33+
34+
@InjectMocks
35+
private TeamStatusController teamStatusController;
36+
37+
private FilterTeamStatusRequest defaultFilterRequest;
38+
private TeamTaskItemResponse defaultItem;
39+
private TeamTaskResponse defaultMember;
40+
private TeamStatusResponse defaultResponse;
41+
42+
@BeforeEach
43+
void setUp() {
44+
defaultFilterRequest = new FilterTeamStatusRequest(
45+
SortBy.DEFAULT, List.of(10L, 20L), List.of(1L, 2L), "테스트 타이틀"
46+
);
47+
48+
defaultItem = new TeamTaskItemResponse(
49+
1L, "TC001", "테스트 타이틀", "1차 카테고리", "2차 카테고리",
50+
new TeamTaskItemResponse.LabelInfo("라벨명", LabelColor.BLUE),
51+
"요청자", "요청자 이미지", "요청자 부서",
52+
1L, TaskStatus.IN_PROGRESS, LocalDateTime.of(2025, 2, 9, 10, 0)
53+
);
54+
55+
defaultMember = new TeamTaskResponse(
56+
100L, "담당자1", "담당자 이미지", "담당자 부서",
57+
1, 0, 1, List.of(defaultItem)
58+
);
59+
60+
defaultResponse = new TeamStatusResponse(List.of(defaultMember), 1, 0, 1);
61+
}
62+
63+
@Test
64+
@DisplayName("팀 현황 조회 - 정상 응답")
65+
void filterTeamStatus_Success() {
66+
when(filterTeamStatusUsecase.filterTeamStatus(defaultFilterRequest)).thenReturn(defaultResponse);
67+
68+
ResponseEntity<TeamStatusResponse> response = teamStatusController.filterTeamStatus(defaultFilterRequest);
69+
70+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
71+
assertThat(response.getBody()).isEqualTo(defaultResponse);
72+
}
73+
74+
@Test
75+
@DisplayName("팀 현황 조회 - 빈 결과")
76+
void filterTeamStatus_EmptyResult() {
77+
FilterTeamStatusRequest emptyFilterRequest = new FilterTeamStatusRequest(SortBy.DEFAULT, List.of(), List.of(), "");
78+
TeamStatusResponse emptyResponse = new TeamStatusResponse(List.of(), 0, 0, 0);
79+
80+
when(filterTeamStatusUsecase.filterTeamStatus(emptyFilterRequest)).thenReturn(emptyResponse);
81+
82+
ResponseEntity<TeamStatusResponse> response = teamStatusController.filterTeamStatus(emptyFilterRequest);
83+
84+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
85+
assertThat(response.getBody()).isEqualTo(emptyResponse);
86+
}
87+
88+
@Test
89+
@DisplayName("팀 현황 조회 - 기여도순 정렬")
90+
void filterTeamStatus_SortByContribute() {
91+
FilterTeamStatusRequest contributeRequest = new FilterTeamStatusRequest(SortBy.CONTRIBUTE, List.of(10L), List.of(1L), "테스트 타이틀");
92+
93+
LocalDateTime now = LocalDateTime.now();
94+
TeamTaskItemResponse item1 = new TeamTaskItemResponse(1L, "TC001", "타이틀1", "1차 카테고리", "2차 카테고리",
95+
new TeamTaskItemResponse.LabelInfo("라벨1", LabelColor.BLUE), "요청자1", "이미지1", "부서1", 1L, TaskStatus.IN_PROGRESS, now);
96+
TeamTaskItemResponse item2 = new TeamTaskItemResponse(2L, "TC002", "타이틀2", "1차 카테고리", "2차 카테고리",
97+
new TeamTaskItemResponse.LabelInfo("라벨2", LabelColor.RED), "요청자2", "이미지2", "부서2", 2L, TaskStatus.IN_PROGRESS, now);
98+
99+
TeamTaskResponse member1 = new TeamTaskResponse(100L, "담당자1", "이미지1", "부서1", 2, 1, 3, List.of(item1, item2));
100+
TeamTaskResponse member2 = new TeamTaskResponse(200L, "담당자2", "이미지2", "부서2", 1, 0, 1, List.of(item1));
101+
102+
TeamStatusResponse contributeResponse = new TeamStatusResponse(List.of(member1, member2),
103+
member1.inProgressTaskCount() + member2.inProgressTaskCount(),
104+
member1.inReviewingTaskCount() + member2.inReviewingTaskCount(),
105+
member1.totalTaskCount() + member2.totalTaskCount());
106+
107+
when(filterTeamStatusUsecase.filterTeamStatus(contributeRequest)).thenReturn(contributeResponse);
108+
109+
ResponseEntity<TeamStatusResponse> response = teamStatusController.filterTeamStatus(contributeRequest);
110+
111+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
112+
assertThat(response.getBody()).isEqualTo(contributeResponse);
113+
}
114+
115+
@Test
116+
@DisplayName("팀 현황 조회 - 카테고리 필터링")
117+
void filterTeamStatus_CategoryFiltering() {
118+
FilterTeamStatusRequest categoryFilterRequest = new FilterTeamStatusRequest(SortBy.DEFAULT, List.of(10L), List.of(), "타이틀");
119+
120+
LocalDateTime now = LocalDateTime.now();
121+
TeamTaskItemResponse matchingItem = new TeamTaskItemResponse(1L, "TC001", "타이틀 매칭", "1차 카테고리", "2차 카테고리",
122+
new TeamTaskItemResponse.LabelInfo("라벨1", LabelColor.BLUE), "요청자1", "이미지1", "부서1", 1L, TaskStatus.IN_PROGRESS, now);
123+
124+
TeamTaskResponse categoryMember = new TeamTaskResponse(300L, "카테고리담당자", "이미지3", "부서3", 1, 0, 1, List.of(matchingItem));
125+
126+
TeamStatusResponse categoryResponse = new TeamStatusResponse(List.of(categoryMember), 1, 0, 1);
127+
when(filterTeamStatusUsecase.filterTeamStatus(categoryFilterRequest)).thenReturn(categoryResponse);
128+
129+
ResponseEntity<TeamStatusResponse> response = teamStatusController.filterTeamStatus(categoryFilterRequest);
130+
131+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
132+
assertThat(response.getBody()).isEqualTo(categoryResponse);
133+
}
134+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package clap.server.application.service.task;
2+
3+
import clap.server.adapter.inbound.web.dto.common.PageResponse;
4+
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
5+
import clap.server.adapter.inbound.web.dto.task.response.FilterAssignedTaskListResponse;
6+
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
7+
import clap.server.TestDataFactory;
8+
import clap.server.application.port.inbound.domain.MemberService;
9+
import clap.server.application.port.outbound.task.LoadTaskPort;
10+
import clap.server.domain.model.member.Member;
11+
import clap.server.domain.model.task.Category;
12+
import clap.server.domain.model.task.Task;
13+
import org.junit.jupiter.api.BeforeEach;
14+
import org.junit.jupiter.api.DisplayName;
15+
import org.junit.jupiter.api.Test;
16+
import org.junit.jupiter.api.extension.ExtendWith;
17+
import org.mockito.InjectMocks;
18+
import org.mockito.Mock;
19+
import org.mockito.junit.jupiter.MockitoExtension;
20+
import org.springframework.data.domain.Page;
21+
import org.springframework.data.domain.PageImpl;
22+
import org.springframework.data.domain.PageRequest;
23+
24+
import java.time.LocalDateTime;
25+
import java.util.List;
26+
27+
import static org.assertj.core.api.Assertions.assertThat;
28+
import static org.mockito.Mockito.when;
29+
30+
@ExtendWith(MockitoExtension.class)
31+
class FindTasksAssignedByManagerTest {
32+
33+
@Mock
34+
private MemberService memberService;
35+
@Mock
36+
private LoadTaskPort loadTaskPort;
37+
@InjectMocks
38+
private FindTaskListService findTaskListService;
39+
private Member manager;
40+
private Page<Task> taskPage;
41+
private Task task1, task2;
42+
private Category category, mainCategory;
43+
private Member requester;
44+
45+
@BeforeEach
46+
void setUp() {
47+
manager = TestDataFactory.createManager();
48+
requester = TestDataFactory.createUser();
49+
mainCategory = TestDataFactory.createMainCategory();
50+
category = TestDataFactory.createCategory(mainCategory);
51+
task1 = TestDataFactory.createTask(1L, "TC001", "제목1", TaskStatus.IN_PROGRESS, category, null, requester);
52+
task2 = TestDataFactory.createTask(2L, "TC002", "제목2", TaskStatus.IN_REVIEWING, category, LocalDateTime.of(2025, 2, 4, 11, 30, 11), requester);
53+
taskPage = new PageImpl<>(List.of(task1, task2));
54+
}
55+
56+
@Test
57+
@DisplayName("할당된 작업 목록 조회")
58+
void findTasksAssignedByManager() {
59+
// given
60+
Long managerId = 3L;
61+
PageRequest pageable = PageRequest.of(0, 20);
62+
FilterTaskListRequest filterTaskListRequest = new FilterTaskListRequest(null, List.of(), List.of(), "", "", List.of(), "", "");
63+
when(memberService.findActiveMember(managerId)).thenReturn(manager);
64+
when(loadTaskPort.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest))
65+
.thenReturn(taskPage);
66+
67+
// when
68+
PageResponse<FilterAssignedTaskListResponse> result = findTaskListService.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest);
69+
70+
// then
71+
assertThat(result.content()).hasSize(2)
72+
.extracting(FilterAssignedTaskListResponse::taskId)
73+
.containsExactly(1L, 2L);
74+
75+
FilterAssignedTaskListResponse task1Response = result.content().get(0);
76+
assertThat(task1Response.taskId()).isEqualTo(1L);
77+
assertThat(task1Response.taskCode()).isEqualTo("TC001");
78+
assertThat(task1Response.mainCategoryName()).isEqualTo("1차 카테고리");
79+
assertThat(task1Response.categoryName()).isEqualTo("2차 카테고리");
80+
assertThat(task1Response.title()).isEqualTo("제목1");
81+
assertThat(task1Response.requesterName()).isEqualTo(requester.getNickname());
82+
assertThat(task1Response.taskStatus()).isEqualTo(TaskStatus.IN_PROGRESS);
83+
assertThat(task1Response.finishedAt()).isNull();
84+
}
85+
86+
@Test
87+
@DisplayName("할당된 작업 목록 조회 - 카테고리 필터 적용")
88+
void findTasksAssignedByManager_FilteredWithCategory() {
89+
// given
90+
Long managerId = 10L;
91+
PageRequest pageable = PageRequest.of(0, 20);
92+
FilterTaskListRequest filterTaskListRequest = new FilterTaskListRequest(null, List.of(2L), List.of(), "", "", List.of(), "", "");
93+
taskPage = new PageImpl<>(List.of(task2));
94+
95+
when(memberService.findActiveMember(managerId)).thenReturn(manager);
96+
when(loadTaskPort.findTasksAssignedByManager(manager.getMemberId(), pageable, filterTaskListRequest))
97+
.thenReturn(taskPage);
98+
99+
// when
100+
PageResponse<FilterAssignedTaskListResponse> result = findTaskListService.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest);
101+
102+
// then
103+
assertThat(result.content()).hasSize(1);
104+
assertThat(result.content()).extracting(FilterAssignedTaskListResponse::categoryName)
105+
.containsExactly("2차 카테고리");
106+
}
107+
}

0 commit comments

Comments
 (0)