33import com .back .domain .member .entity .Member ;
44import com .back .domain .member .entity .MemberGender ;
55import com .back .domain .member .repository .MemberRepository ;
6+ import com .back .domain .mission .entity .Mission ;
7+ import com .back .domain .mission .enums .MissionCategory ;
8+ import com .back .domain .mission .enums .MissionType ;
9+ import com .back .domain .mission .repository .MissionRepository ;
610import com .back .domain .party .party .dto .InvitationDto ;
711import com .back .domain .party .party .dto .PartyRequestDto ;
812import com .back .domain .party .party .dto .PartyUpdateRequestDto ;
2529import org .springframework .test .context .ActiveProfiles ;
2630import org .springframework .test .web .servlet .MockMvc ;
2731
32+ import java .lang .reflect .Field ;
2833import java .time .LocalDate ;
2934import java .time .LocalDateTime ;
3035import java .util .UUID ;
@@ -51,6 +56,9 @@ class ApiV1PartyControllerTest {
5156 @ Autowired
5257 private PartyMemberRepository partyMemberRepository ;
5358
59+ @ Autowired
60+ private MissionRepository missionRepository ;
61+
5462 @ Autowired
5563 private ObjectMapper objectMapper ;
5664
@@ -63,6 +71,7 @@ class ApiV1PartyControllerTest {
6371 @ BeforeEach
6472 void setUp () {
6573 partyMemberRepository .deleteAllInBatch ();
74+ missionRepository .deleteAllInBatch ();
6675 partyRepository .deleteAllInBatch ();
6776 memberRepository .deleteAllInBatch ();
6877
@@ -100,6 +109,7 @@ void setUp() {
100109 @ AfterEach
101110 void tearDown () {
102111 partyMemberRepository .deleteAllInBatch ();
112+ missionRepository .deleteAllInBatch ();
103113 partyRepository .deleteAllInBatch ();
104114 memberRepository .deleteAllInBatch ();
105115 }
@@ -154,6 +164,13 @@ void leaveParty_success_integration() throws Exception {
154164 party .setPublic (true );
155165 partyRepository .save (party );
156166
167+ PartyMember leaderMember = new PartyMember ();
168+ leaderMember .setParty (party );
169+ leaderMember .setMember (leader );
170+ leaderMember .setStatus (PartyMemberStatus .ACCEPTED );
171+ leaderMember .setJoinedAt (LocalDateTime .now ().minusHours (1 ));
172+ partyMemberRepository .save (leaderMember );
173+
157174 PartyMember partyMember = new PartyMember ();
158175 partyMember .setParty (party );
159176 partyMember .setMember (member1 );
@@ -210,27 +227,99 @@ void deleteParty_success_integration() throws Exception {
210227 }
211228
212229 @ Test
213- @ DisplayName ("파티 목록 조회 통합 테스트 성공" )
230+ @ DisplayName ("파티 목록 조회 통합 테스트 성공 (공개 파티 목록 조회) " )
214231 void getPartyList_success_integration () throws Exception {
232+ Mission mission = Mission .builder ()
233+ .title ("테스트 미션" )
234+ .category (MissionCategory .EXERCISE )
235+ .type (MissionType .CUSTOM )
236+ .startDate (LocalDate .of (2025 , 10 , 1 ))
237+ .endDate (LocalDate .of (2025 , 10 , 31 ))
238+ .member (leader )
239+ .build ();
240+ missionRepository .save (mission );
241+
215242 Party party1 = new Party ();
216- party1 .setName ("파티1" );
243+ party1 .setName ("공개 파티1" );
217244 party1 .setLeader (leader );
218245 party1 .setMaxMembers (5 );
219246 party1 .setPublic (true );
247+ LocalDateTime date1 = LocalDateTime .now ().minusDays (1 );
248+ setBaseEntityCreateDate (party1 , date1 );
220249 partyRepository .save (party1 );
221250
251+ PartyMember leaderMember1 = new PartyMember ();
252+ leaderMember1 .setParty (party1 );
253+ leaderMember1 .setMember (leader );
254+ leaderMember1 .setStatus (PartyMemberStatus .ACCEPTED );
255+ leaderMember1 .setJoinedAt (date1 );
256+ partyMemberRepository .save (leaderMember1 );
257+
258+
259+ mission .setParty (party1 );
260+ missionRepository .save (mission );
261+
222262 Party party2 = new Party ();
223- party2 .setName ("파티2" );
224- party2 .setLeader (leader );
225- party2 .setMaxMembers (5 );
263+ party2 .setName ("공개 파티2" );
264+ party2 .setLeader (member1 );
265+ party2 .setMaxMembers (3 );
226266 party2 .setPublic (true );
267+ LocalDateTime date2 = LocalDateTime .now ().minusDays (2 );
268+ setBaseEntityCreateDate (party2 , date2 );
227269 partyRepository .save (party2 );
228270
271+ PartyMember leaderMember2 = new PartyMember ();
272+ leaderMember2 .setParty (party2 );
273+ leaderMember2 .setMember (member1 );
274+ leaderMember2 .setStatus (PartyMemberStatus .ACCEPTED );
275+ leaderMember2 .setJoinedAt (date2 );
276+ partyMemberRepository .save (leaderMember2 );
277+
278+ Party privateParty = new Party ();
279+ privateParty .setName ("비공개 파티" );
280+ privateParty .setLeader (leader );
281+ privateParty .setMaxMembers (2 );
282+ privateParty .setPublic (false );
283+ LocalDateTime date3 = LocalDateTime .now ().minusDays (3 );
284+ setBaseEntityCreateDate (privateParty , date3 );
285+ partyRepository .save (privateParty );
286+
287+ PartyMember leaderPrivate = new PartyMember ();
288+ leaderPrivate .setParty (privateParty );
289+ leaderPrivate .setMember (leader );
290+ leaderPrivate .setStatus (PartyMemberStatus .ACCEPTED );
291+ leaderPrivate .setJoinedAt (date3 );
292+ partyMemberRepository .save (leaderPrivate );
293+
294+
229295 mockMvc .perform (get ("/api/v1/parties" ))
230296 .andExpect (status ().isOk ())
231- .andExpect (jsonPath ("$.content.size()" ).value (2 ))
232297 .andExpect (jsonPath ("$.code" ).value ("200" ))
233- .andExpect (jsonPath ("$.message" ).value ("파티 목록 조회 성공" ));
298+ .andExpect (jsonPath ("$.message" ).value ("파티 목록 조회 성공" ))
299+
300+ .andExpect (jsonPath ("$.content.content[0].name" ).value ("공개 파티1" ))
301+ .andExpect (jsonPath ("$.content.content[0].leaderId" ).value (leader .getId ()))
302+ .andExpect (jsonPath ("$.content.content[0].isPublic" ).value (true ))
303+ .andExpect (jsonPath ("$.content.content[0].currentMembers" ).value (1 ))
304+ .andExpect (jsonPath ("$.content.content[0].category" ).value (MissionCategory .EXERCISE .name ()))
305+ .andExpect (jsonPath ("$.content.content[0].startDate" ).value ("2025-10-01" ))
306+ .andExpect (jsonPath ("$.content.content[0].endDate" ).value ("2025-10-31" ))
307+ .andExpect (jsonPath ("$.content.content[0].missionId" ).value (mission .getId ()))
308+ .andExpect (jsonPath ("$.content.content[0].createDate" ).value (
309+ LocalDate .now ().toString ()
310+ ))
311+
312+ .andExpect (jsonPath ("$.content.content[1].name" ).value ("공개 파티2" ))
313+ .andExpect (jsonPath ("$.content.content[1].leaderId" ).value (member1 .getId ()))
314+ .andExpect (jsonPath ("$.content.content[1].isPublic" ).value (true ))
315+ .andExpect (jsonPath ("$.content.content[1].currentMembers" ).value (1 ))
316+ .andExpect (jsonPath ("$.content.content[1].category" ).isEmpty ())
317+ .andExpect (jsonPath ("$.content.content[1].startDate" ).isEmpty ())
318+ .andExpect (jsonPath ("$.content.content[1].endDate" ).isEmpty ())
319+ .andExpect (jsonPath ("$.content.content[1].missionId" ).isEmpty ())
320+ .andExpect (jsonPath ("$.content.content[1].createDate" ).value (
321+ LocalDate .now ().toString ()
322+ ));
234323 }
235324
236325 @ Test
@@ -330,6 +419,14 @@ void kickMember_success_integration() throws Exception {
330419 party .setPublic (true );
331420 partyRepository .save (party );
332421
422+ PartyMember leaderMember = new PartyMember ();
423+ leaderMember .setParty (party );
424+ leaderMember .setMember (leader );
425+ leaderMember .setStatus (PartyMemberStatus .ACCEPTED );
426+ leaderMember .setJoinedAt (LocalDateTime .now ().minusHours (1 ));
427+ partyMemberRepository .save (leaderMember );
428+
429+ // 추방될 멤버 추가
333430 PartyMember partyMember = new PartyMember ();
334431 partyMember .setParty (party );
335432 partyMember .setMember (member1 );
@@ -354,6 +451,13 @@ void getPendingJoinRequests_success_integration() throws Exception {
354451 party .setPublic (true );
355452 partyRepository .save (party );
356453
454+ PartyMember leaderMember = new PartyMember ();
455+ leaderMember .setParty (party );
456+ leaderMember .setMember (leader );
457+ leaderMember .setStatus (PartyMemberStatus .ACCEPTED );
458+ leaderMember .setJoinedAt (LocalDateTime .now ().minusHours (1 ));
459+ partyMemberRepository .save (leaderMember );
460+
357461 PartyMember partyMember = new PartyMember ();
358462 partyMember .setParty (party );
359463 partyMember .setMember (member1 );
@@ -369,4 +473,20 @@ void getPendingJoinRequests_success_integration() throws Exception {
369473 .andExpect (jsonPath ("$.code" ).value ("200" ))
370474 .andExpect (jsonPath ("$.message" ).value ("가입 신청/초대 목록 조회 성공" ));
371475 }
476+
477+ /**
478+ * private/protected 필드를 Reflection을 사용하여 설정하는 헬퍼 메서드 (테스트용)
479+ * BaseEntity의 createDate 필드에 접근하여 강제로 값을 설정합니다.
480+ */
481+ private void setBaseEntityCreateDate (Object entity , LocalDateTime dateTime ) {
482+ try {
483+ // Party가 BaseEntity를 상속받으므로 getSuperclass() 사용
484+ Field field = entity .getClass ().getSuperclass ().getDeclaredField ("createDate" );
485+ field .setAccessible (true );
486+ field .set (entity , dateTime );
487+ } catch (NoSuchFieldException | IllegalAccessException e ) {
488+ // 테스트 실패로 처리
489+ throw new RuntimeException ("Reflection 오류: createDate 필드 접근 실패" , e );
490+ }
491+ }
372492}
0 commit comments