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+ }
0 commit comments