Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<TeamStatusResponse> 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<TeamStatusResponse> 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<TeamStatusResponse> 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<TeamStatusResponse> response = teamStatusController.filterTeamStatus(categoryFilterRequest);

assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isEqualTo(categoryResponse);
}
}
Original file line number Diff line number Diff line change
@@ -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<Task> 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<FilterAssignedTaskListResponse> 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<FilterAssignedTaskListResponse> result = findTaskListService.findTasksAssignedByManager(managerId, pageable, filterTaskListRequest);

// then
assertThat(result.content()).hasSize(1);
assertThat(result.content()).extracting(FilterAssignedTaskListResponse::categoryName)
.containsExactly("2차 카테고리");
}
}