1+ package com .memory .controller .calendar ;
2+
3+ import com .fasterxml .jackson .databind .ObjectMapper ;
4+ import com .fasterxml .jackson .datatype .jsr310 .JavaTimeModule ;
5+ import com .memory .config .jwt .JwtTokenProvider ;
6+ import com .memory .domain .calendar .CalendarEventType ;
7+ import com .memory .domain .calendar .PersonalEvent ;
8+ import com .memory .domain .calendar .repository .PersonalEventRepository ;
9+ import com .memory .domain .member .Member ;
10+ import com .memory .domain .member .MemberType ;
11+ import com .memory .domain .member .repository .MemberRepository ;
12+ import com .memory .dto .calendar .CalendarEventRequest ;
13+ import org .junit .jupiter .api .*;
14+ import org .springframework .beans .factory .annotation .Autowired ;
15+ import org .springframework .boot .test .autoconfigure .web .servlet .AutoConfigureMockMvc ;
16+ import org .springframework .boot .test .context .SpringBootTest ;
17+ import org .springframework .http .MediaType ;
18+ import org .springframework .test .context .ActiveProfiles ;
19+ import org .springframework .test .web .servlet .MockMvc ;
20+ import org .springframework .transaction .annotation .Transactional ;
21+
22+ import java .time .LocalDateTime ;
23+
24+ import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .*;
25+ import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .*;
26+ import static org .springframework .test .web .servlet .result .MockMvcResultHandlers .*;
27+
28+ @ SpringBootTest (webEnvironment = SpringBootTest .WebEnvironment .MOCK )
29+ @ AutoConfigureMockMvc
30+ @ ActiveProfiles ("test" )
31+ @ Transactional
32+ class CalendarEventControllerIntegrationTest {
33+
34+ @ Autowired
35+ private MockMvc mockMvc ;
36+
37+ private ObjectMapper objectMapper ;
38+
39+ @ Autowired
40+ private JwtTokenProvider jwtTokenProvider ;
41+
42+ @ Autowired
43+ private MemberRepository memberRepository ;
44+
45+ @ Autowired
46+ private PersonalEventRepository personalEventRepository ;
47+
48+ private Member testMember ;
49+ private PersonalEvent testPersonalEvent ;
50+ private String validToken ;
51+
52+ @ BeforeEach
53+ void setUp () {
54+ // ObjectMapper JavaTimeModule 등록
55+ objectMapper = new ObjectMapper ();
56+ objectMapper .registerModule (new JavaTimeModule ());
57+
58+ // Member 생성 및 저장
59+ String uniqueEmail = "test" + System .currentTimeMillis () + "@example.com" ;
60+ testMember = new Member ("Test User" , "testuser" , uniqueEmail , "encodedPassword" , MemberType .MEMBER );
61+ testMember = memberRepository .save (testMember );
62+
63+ // JWT 토큰 생성
64+ validToken = "Bearer " + jwtTokenProvider .createAccessToken (testMember .getEmail ());
65+
66+ // PersonalEvent 생성 및 저장
67+ testPersonalEvent = PersonalEvent .create (
68+ "Test Personal Event" ,
69+ "Test Description" ,
70+ LocalDateTime .now ().plusDays (1 ),
71+ LocalDateTime .now ().plusDays (1 ).plusHours (2 ),
72+ "Test Location" ,
73+ testMember
74+ );
75+ testPersonalEvent = personalEventRepository .save (testPersonalEvent );
76+ }
77+
78+ @ Test
79+ @ DisplayName ("개인 일정 생성 통합 테스트 - 성공" )
80+ void createPersonalEventIntegrationSuccess () throws Exception {
81+ // Given
82+ CalendarEventRequest .Create request = new CalendarEventRequest .Create (
83+ "New Personal Event" ,
84+ "New Description" ,
85+ LocalDateTime .now ().plusDays (2 ),
86+ LocalDateTime .now ().plusDays (2 ).plusHours (3 ),
87+ "New Location" ,
88+ CalendarEventType .PERSONAL ,
89+ false
90+ );
91+
92+ // When & Then
93+ mockMvc .perform (post ("/api/v1/calendar/events" )
94+ .header ("Authorization" , validToken )
95+ .contentType (MediaType .APPLICATION_JSON )
96+ .content (objectMapper .writeValueAsString (request )))
97+ .andDo (print ())
98+ .andExpect (status ().isOk ())
99+ .andExpect (jsonPath ("$.statusCode" ).value (200 ))
100+ .andExpect (jsonPath ("$.message" ).value ("OK" ))
101+ .andExpect (jsonPath ("$.data" ).exists ())
102+ .andExpect (jsonPath ("$.data.title" ).value ("New Personal Event" ))
103+ .andExpect (jsonPath ("$.data.description" ).value ("New Description" ));
104+ }
105+
106+ @ Test
107+ @ DisplayName ("일정 생성 실패 - 인증 토큰 없음" )
108+ void createCalendarEventFailNoAuth () throws Exception {
109+ // Given
110+ CalendarEventRequest .Create request = new CalendarEventRequest .Create (
111+ "New Event" , "Description" , LocalDateTime .now ().plusDays (1 ),
112+ LocalDateTime .now ().plusDays (1 ).plusHours (2 ), "Location" ,
113+ CalendarEventType .PERSONAL , false
114+ );
115+
116+ // When & Then
117+ mockMvc .perform (post ("/api/v1/calendar/events" )
118+ .contentType (MediaType .APPLICATION_JSON )
119+ .content (objectMapper .writeValueAsString (request )))
120+ .andExpect (status ().isUnauthorized ());
121+ }
122+
123+ @ Test
124+ @ DisplayName ("일정 생성 실패 - 잘못된 요청 데이터" )
125+ void createCalendarEventFailInvalidRequest () throws Exception {
126+ // When & Then
127+ mockMvc .perform (post ("/api/v1/calendar/events" )
128+ .header ("Authorization" , validToken )
129+ .contentType (MediaType .APPLICATION_JSON )
130+ .content ("{}" ))
131+ .andExpect (status ().isBadRequest ());
132+ }
133+
134+ @ Test
135+ @ DisplayName ("일정 수정 통합 테스트" )
136+ void updateCalendarEventIntegrationTest () throws Exception {
137+ // Given
138+ CalendarEventRequest .Update request = new CalendarEventRequest .Update (
139+ "Updated Personal Event" ,
140+ "Updated Description" ,
141+ LocalDateTime .now ().plusDays (3 ),
142+ LocalDateTime .now ().plusDays (3 ).plusHours (2 ),
143+ "Updated Location" ,
144+ CalendarEventType .PERSONAL ,
145+ false
146+ );
147+
148+ // When & Then
149+ mockMvc .perform (put ("/api/v1/calendar/events/{eventId}" , testPersonalEvent .getId ())
150+ .header ("Authorization" , validToken )
151+ .contentType (MediaType .APPLICATION_JSON )
152+ .content (objectMapper .writeValueAsString (request )))
153+ .andDo (print ())
154+ .andExpect (status ().isOk ())
155+ .andExpect (jsonPath ("$.statusCode" ).value (200 ))
156+ .andExpect (jsonPath ("$.data.title" ).value ("Updated Personal Event" ));
157+ }
158+
159+ @ Test
160+ @ DisplayName ("특정 기간 내 일정 조회 통합 테스트" )
161+ void getCalendarEventsByDateRangeIntegrationTest () throws Exception {
162+ // When & Then
163+ mockMvc .perform (get ("/api/v1/calendar/events" )
164+ .header ("Authorization" , validToken )
165+ .param ("startDate" , "2025-08-01" )
166+ .param ("endDate" , "2025-12-31" ))
167+ .andDo (print ())
168+ .andExpect (status ().isOk ())
169+ .andExpect (jsonPath ("$.statusCode" ).value (200 ))
170+ .andExpect (jsonPath ("$.data" ).isArray ());
171+ }
172+
173+ @ Test
174+ @ DisplayName ("D-day 조회 통합 테스트" )
175+ void getCalendarEventsWithDdayIntegrationTest () throws Exception {
176+ // When & Then
177+ mockMvc .perform (get ("/api/v1/calendar/events/dday" )
178+ .header ("Authorization" , validToken ))
179+ .andDo (print ())
180+ .andExpect (status ().isOk ())
181+ .andExpect (jsonPath ("$.statusCode" ).value (200 ))
182+ .andExpect (jsonPath ("$.data" ).isArray ());
183+ }
184+ }
0 commit comments