diff --git a/src/main/java/com/dateplan/dateplan/domain/calender/service/CalenderReadService.java b/src/main/java/com/dateplan/dateplan/domain/calender/service/CalenderReadService.java index dd41ce11..90088fb7 100644 --- a/src/main/java/com/dateplan/dateplan/domain/calender/service/CalenderReadService.java +++ b/src/main/java/com/dateplan/dateplan/domain/calender/service/CalenderReadService.java @@ -39,9 +39,9 @@ public CalenderDateServiceResponse readCalenderDates(Member member, Long memberI DatingDatesServiceResponse datingDates = datingReadService.readDatingDates( member, coupleId, year, month); ScheduleDatesServiceResponse myScheduleDates = scheduleReadService.readScheduleDates( - member, memberId, year, month); + memberId, year, month); ScheduleDatesServiceResponse partnerScheduleDates = scheduleReadService.readScheduleDates( - member, partnerId, year, month); + partnerId, year, month); AnniversaryDatesServiceResponse anniversaryDates = anniversaryReadService.readAnniversaryDates( coupleId, year, month); return CalenderDateServiceResponse.of(datingDates, myScheduleDates, partnerScheduleDates, diff --git a/src/main/java/com/dateplan/dateplan/domain/schedule/controller/ScheduleController.java b/src/main/java/com/dateplan/dateplan/domain/schedule/controller/ScheduleController.java index feb2dfe2..d7355a89 100644 --- a/src/main/java/com/dateplan/dateplan/domain/schedule/controller/ScheduleController.java +++ b/src/main/java/com/dateplan/dateplan/domain/schedule/controller/ScheduleController.java @@ -32,12 +32,11 @@ public class ScheduleController { private final ScheduleReadService scheduleReadService; @PostMapping("/{member_id}/schedules") - public ApiResponse createSchedule(@PathVariable("member_id") Long memberId, - @Valid @RequestBody ScheduleRequest request) { + public ApiResponse createSchedule(@Valid @RequestBody ScheduleRequest request) { Member loginMember = MemberThreadLocal.get(); - scheduleService.createSchedule(loginMember, memberId, request.toScheduleServiceRequest()); + scheduleService.createSchedule(loginMember, request.toScheduleServiceRequest()); return ApiResponse.ofSuccess(); } @@ -47,11 +46,8 @@ public ApiResponse readScheduleDates( @RequestParam(value = "year", required = false) Integer year, @RequestParam(value = "month", required = false) Integer month ) { - - Member loginMember = MemberThreadLocal.get(); - ScheduleDatesServiceResponse scheduleDatesServiceResponse = scheduleReadService - .readScheduleDates(loginMember, memberId, year, month); + .readScheduleDates(memberId, year, month); return ApiResponse.ofSuccess(ScheduleDatesResponse.from(scheduleDatesServiceResponse)); } @@ -63,33 +59,29 @@ public ApiResponse readSchedules( @RequestParam(value = "month") Integer month, @RequestParam(value = "day") Integer day ) { - final Member member = MemberThreadLocal.get(); - ScheduleServiceResponse response = scheduleReadService.readSchedules(memberId, member, year, + ScheduleServiceResponse response = scheduleReadService.readSchedules(memberId, year, month, day); return ApiResponse.ofSuccess(ScheduleResponse.from(response)); } @PutMapping("/{member_id}/schedules/{schedule_id}") public ApiResponse updateSchedule( - @PathVariable("member_id") Long memberId, @PathVariable("schedule_id") Long scheduleId, @Valid @RequestBody ScheduleUpdateRequest request, @RequestParam(value = "updateRepeat", defaultValue = "false") Boolean updateRepeat ) { Member member = MemberThreadLocal.get(); scheduleService.updateSchedule( - memberId, scheduleId, request.toScheduleUpdateServiceRequest(), member, updateRepeat); + scheduleId, request.toScheduleUpdateServiceRequest(), member, updateRepeat); return ApiResponse.ofSuccess(); } @DeleteMapping("/{member_id}/schedules/{schedule_id}") public ApiResponse deleteSchedule( @PathVariable("member_id") Long memberId, - @PathVariable("schedule_id") Long scheduleId, @RequestParam(value = "deleteRepeat", defaultValue = "false") Boolean deleteRepeat ) { - Member member = MemberThreadLocal.get(); - scheduleService.deleteSchedule(memberId, scheduleId, member, deleteRepeat); + scheduleService.deleteSchedule(memberId, deleteRepeat); return ApiResponse.ofSuccess(); } } diff --git a/src/main/java/com/dateplan/dateplan/domain/schedule/interceptor/ScheduleAuthInterceptor.java b/src/main/java/com/dateplan/dateplan/domain/schedule/interceptor/ScheduleAuthInterceptor.java new file mode 100644 index 00000000..87671900 --- /dev/null +++ b/src/main/java/com/dateplan/dateplan/domain/schedule/interceptor/ScheduleAuthInterceptor.java @@ -0,0 +1,79 @@ +package com.dateplan.dateplan.domain.schedule.interceptor; + +import com.dateplan.dateplan.domain.couple.service.CoupleReadService; +import com.dateplan.dateplan.domain.member.entity.Member; +import com.dateplan.dateplan.domain.schedule.entity.Schedule; +import com.dateplan.dateplan.domain.schedule.service.ScheduleReadService; +import com.dateplan.dateplan.global.auth.MemberThreadLocal; +import com.dateplan.dateplan.global.constant.Operation; +import com.dateplan.dateplan.global.constant.Resource; +import com.dateplan.dateplan.global.exception.auth.NoPermissionException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.util.Map; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.HandlerMapping; + +@Component +@RequiredArgsConstructor +public class ScheduleAuthInterceptor implements HandlerInterceptor { + + private final ScheduleReadService scheduleReadService; + private final CoupleReadService coupleReadService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object handler) throws Exception { + Map map = (Map) request.getAttribute( + HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + String method = request.getMethod(); + + Member member = MemberThreadLocal.get(); + String memberId = map.get("member_id"); + String scheduleId = map.get("schedule_id"); + + if (memberId != null) { + if (method.equals("GET")) { + Long partnerId = coupleReadService.getPartnerId(member); + if (isNotSameMember(Long.valueOf(memberId), member.getId()) + && isNotSameMember(Long.valueOf(memberId), partnerId)) { + throwNoPermissionException(method); + } + } else { + if (isNotSameMember(Long.valueOf(memberId), member.getId())) { + throwNoPermissionException(method); + } + } + if (scheduleId != null) { + Schedule schedule = scheduleReadService.findScheduleByIdOrElseThrow( + Long.valueOf(scheduleId)); + if (isNotScheduleOwner(Long.valueOf(memberId), schedule)) { + throwNoPermissionException(method); + } + } + } + + return true; + } + + private boolean isNotSameMember(Long requestId, Long memberId) { + return !Objects.equals(requestId, memberId); + } + + private boolean isNotScheduleOwner(Long memberId, Schedule schedule) { + return !Objects.equals(memberId, schedule.getSchedulePattern().getMember().getId()); + } + + private void throwNoPermissionException(String method) { + Operation operation = switch (method) { + case "GET" -> Operation.READ; + case "POST" -> Operation.CREATE; + case "PUT" -> Operation.UPDATE; + default -> Operation.DELETE; + }; + throw new NoPermissionException(Resource.SCHEDULE, operation); + } +} diff --git a/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleReadService.java b/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleReadService.java index 60dcc6ed..1e454e13 100644 --- a/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleReadService.java +++ b/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleReadService.java @@ -1,20 +1,14 @@ package com.dateplan.dateplan.domain.schedule.service; -import com.dateplan.dateplan.domain.couple.service.CoupleReadService; -import com.dateplan.dateplan.domain.member.entity.Member; import com.dateplan.dateplan.domain.schedule.entity.Schedule; import com.dateplan.dateplan.domain.schedule.repository.ScheduleQueryRepository; import com.dateplan.dateplan.domain.schedule.repository.ScheduleRepository; import com.dateplan.dateplan.domain.schedule.service.dto.response.ScheduleDatesServiceResponse; import com.dateplan.dateplan.domain.schedule.service.dto.response.ScheduleServiceResponse; -import com.dateplan.dateplan.global.constant.Operation; -import com.dateplan.dateplan.global.constant.Resource; -import com.dateplan.dateplan.global.exception.auth.NoPermissionException; import com.dateplan.dateplan.global.exception.schedule.ScheduleNotFoundException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; @@ -27,7 +21,6 @@ public class ScheduleReadService { private final ScheduleQueryRepository scheduleQueryRepository; - private final CoupleReadService coupleReadService; private final ScheduleRepository scheduleRepository; public Optional findMinStartDateTimeBySchedulePatternId(Long schedulePatternId) { @@ -49,28 +42,20 @@ public Schedule findScheduleByIdOrElseThrow(Long id) { public ScheduleServiceResponse readSchedules( Long requestId, - Member member, Integer year, Integer month, Integer day ) { - Long partnerId = coupleReadService.getPartnerId(member); - validatePermission(requestId, member.getId(), partnerId); List schedules = scheduleQueryRepository.findByDateBetween(requestId, year, month, day); return ScheduleServiceResponse.from(schedules); } public ScheduleDatesServiceResponse readScheduleDates( - Member loginMember, Long requestId, Integer year, Integer month ) { - - Long partnerId = coupleReadService.getPartnerId(loginMember); - validatePermission(requestId, loginMember.getId(), partnerId); - List schedules = scheduleQueryRepository .findByYearAndMonthOrderByDate(requestId, year, month); @@ -110,15 +95,4 @@ private boolean checkDateRange(Integer year, Integer month, LocalDate date) { } return date.getYear() == year && date.getMonthValue() == month; } - - private void validatePermission(Long requestId, Long memberId, Long partnerId) { - if (isNotSameMember(requestId, memberId) && isNotSameMember(requestId, partnerId)) { - throw new NoPermissionException(Resource.MEMBER, Operation.READ); - } - } - - private boolean isNotSameMember(Long requestId, Long memberId) { - - return !(Objects.equals(requestId, memberId)); - } } diff --git a/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleService.java b/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleService.java index 7c86fd2a..c3b39639 100644 --- a/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleService.java +++ b/src/main/java/com/dateplan/dateplan/domain/schedule/service/ScheduleService.java @@ -10,16 +10,12 @@ import com.dateplan.dateplan.domain.schedule.repository.ScheduleRepository; import com.dateplan.dateplan.domain.schedule.service.dto.request.ScheduleServiceRequest; import com.dateplan.dateplan.domain.schedule.service.dto.request.ScheduleUpdateServiceRequest; -import com.dateplan.dateplan.global.constant.Operation; import com.dateplan.dateplan.global.constant.RepeatRule; -import com.dateplan.dateplan.global.constant.Resource; -import com.dateplan.dateplan.global.exception.auth.NoPermissionException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -35,12 +31,7 @@ public class ScheduleService { private final ScheduleReadService scheduleReadService; private final ScheduleRepository scheduleRepository; - public void createSchedule(Member loginMember, Long memberId, ScheduleServiceRequest request) { - - if (!isSameMember(memberId, loginMember.getId())) { - throw new NoPermissionException(Resource.MEMBER, Operation.CREATE); - } - + public void createSchedule(Member loginMember, ScheduleServiceRequest request) { SchedulePattern schedulePattern = request.toSchedulePatternEntity(loginMember); schedulePatternRepository.save(schedulePattern); @@ -50,22 +41,13 @@ public void createSchedule(Member loginMember, Long memberId, ScheduleServiceReq } public void updateSchedule( - Long memberId, Long scheduleId, ScheduleUpdateServiceRequest request, Member loginMember, Boolean updateRepeat ) { - if (!isSameMember(memberId, loginMember.getId())) { - throw new NoPermissionException(Resource.MEMBER, Operation.UPDATE); - } Schedule schedule = scheduleReadService.findScheduleByIdOrElseThrow(scheduleId); - if (isNotScheduleOwner(loginMember.getId(), - schedule.getSchedulePattern().getMember().getId())) { - throw new NoPermissionException(Resource.SCHEDULE, Operation.UPDATE); - } - if (updateRepeat) { updateRepeatSchedules(request, schedule); return; @@ -116,18 +98,9 @@ private void updateSingleSchedule( originalSchedulePattern.updateDateTime(minStart.get(), maxStart.get()); } - public void deleteSchedule(Long memberId, Long scheduleId, Member loginMember, - Boolean deleteRepeat) { - if (!isSameMember(memberId, loginMember.getId())) { - throw new NoPermissionException(Resource.MEMBER, Operation.DELETE); - } + public void deleteSchedule(Long scheduleId, Boolean deleteRepeat) { Schedule schedule = scheduleReadService.findScheduleByIdOrElseThrow(scheduleId); - if (isNotScheduleOwner(loginMember.getId(), - schedule.getSchedulePattern().getMember().getId())) { - throw new NoPermissionException(Resource.SCHEDULE, Operation.DELETE); - } - if (deleteRepeat) { deleteRepeatSchedule(schedule); return; @@ -188,15 +161,6 @@ private boolean isBeforeOfRepeatEndDate(LocalDate repeatEndTime, LocalDateTime n return !now.toLocalDate().isAfter(repeatEndTime); } - private boolean isSameMember(Long memberId, Long loginMemberId) { - - return Objects.equals(memberId, loginMemberId); - } - - private boolean isNotScheduleOwner(Long memberId, Long scheduleOwnerId) { - return !Objects.equals(memberId, scheduleOwnerId); - } - private boolean checkSingleScheduleAndUpdate( ScheduleUpdateServiceRequest request, Schedule schedule diff --git a/src/main/java/com/dateplan/dateplan/global/config/web/WebConfig.java b/src/main/java/com/dateplan/dateplan/global/config/web/WebConfig.java index 8b7a7c94..65b05bdd 100644 --- a/src/main/java/com/dateplan/dateplan/global/config/web/WebConfig.java +++ b/src/main/java/com/dateplan/dateplan/global/config/web/WebConfig.java @@ -1,6 +1,7 @@ package com.dateplan.dateplan.global.config.web; import com.dateplan.dateplan.domain.anniversary.interceptor.AnniversaryAuthInterceptor; +import com.dateplan.dateplan.domain.schedule.interceptor.ScheduleAuthInterceptor; import com.dateplan.dateplan.global.interceptor.AuthInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; @@ -13,6 +14,7 @@ public class WebConfig implements WebMvcConfigurer { private final AuthInterceptor authInterceptor; private final AnniversaryAuthInterceptor anniversaryAuthInterceptor; + private final ScheduleAuthInterceptor scheduleAuthInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { @@ -24,5 +26,9 @@ public void addInterceptors(InterceptorRegistry registry) { registry .addInterceptor(anniversaryAuthInterceptor) .addPathPatterns("/api/couples/**/anniversary/**"); + + registry + .addInterceptor(scheduleAuthInterceptor) + .addPathPatterns("/api/members/**/schedules/**"); } } diff --git a/src/test/java/com/dateplan/dateplan/controller/ControllerTestSupport.java b/src/test/java/com/dateplan/dateplan/controller/ControllerTestSupport.java index 457b0289..583afe82 100644 --- a/src/test/java/com/dateplan/dateplan/controller/ControllerTestSupport.java +++ b/src/test/java/com/dateplan/dateplan/controller/ControllerTestSupport.java @@ -18,6 +18,7 @@ import com.dateplan.dateplan.domain.member.service.MemberReadService; import com.dateplan.dateplan.domain.member.service.MemberService; import com.dateplan.dateplan.domain.schedule.controller.ScheduleController; +import com.dateplan.dateplan.domain.schedule.interceptor.ScheduleAuthInterceptor; import com.dateplan.dateplan.domain.schedule.service.ScheduleReadService; import com.dateplan.dateplan.domain.schedule.service.ScheduleService; import com.dateplan.dateplan.domain.sms.service.SmsSendClient; @@ -89,4 +90,7 @@ public abstract class ControllerTestSupport { @MockBean protected CalenderReadService calenderReadService; + + @MockBean + protected ScheduleAuthInterceptor scheduleAuthInterceptor; } diff --git a/src/test/java/com/dateplan/dateplan/controller/schedule/ScheduleControllerTest.java b/src/test/java/com/dateplan/dateplan/controller/schedule/ScheduleControllerTest.java index 69aa2280..5f89325f 100644 --- a/src/test/java/com/dateplan/dateplan/controller/schedule/ScheduleControllerTest.java +++ b/src/test/java/com/dateplan/dateplan/controller/schedule/ScheduleControllerTest.java @@ -35,12 +35,9 @@ import com.dateplan.dateplan.domain.schedule.service.dto.response.ScheduleServiceResponse; import com.dateplan.dateplan.global.auth.MemberThreadLocal; import com.dateplan.dateplan.global.constant.Gender; -import com.dateplan.dateplan.global.constant.Operation; import com.dateplan.dateplan.global.constant.RepeatRule; -import com.dateplan.dateplan.global.constant.Resource; import com.dateplan.dateplan.global.exception.ErrorCode; import com.dateplan.dateplan.global.exception.ErrorCode.DetailMessage; -import com.dateplan.dateplan.global.exception.auth.NoPermissionException; import com.dateplan.dateplan.global.exception.couple.MemberNotConnectedException; import com.dateplan.dateplan.global.exception.schedule.InvalidDateTimeRangeException; import com.dateplan.dateplan.global.exception.schedule.ScheduleNotFoundException; @@ -66,10 +63,17 @@ public class ScheduleControllerTest extends ControllerTestSupport { @BeforeEach - void setUp() { - given( - authInterceptor.preHandle(any(HttpServletRequest.class), any(HttpServletResponse.class), - any(Object.class))) + void setUp() throws Exception { + given(authInterceptor.preHandle( + any(HttpServletRequest.class), + any(HttpServletResponse.class), + any(Object.class))) + .willReturn(true); + + given(scheduleAuthInterceptor.preHandle( + any(HttpServletRequest.class), + any(HttpServletResponse.class), + any(Object.class))) .willReturn(true); } @@ -100,7 +104,7 @@ void successWithValidRequest() throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); mockMvc.perform(post(REQUEST_URL, 1L) .content(om.writeValueAsString(request)) @@ -110,31 +114,6 @@ void successWithValidRequest() throws Exception { .andExpect(jsonPath("$.success").value("true")); } - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWithNoPermissionRequest() throws Exception { - - // Given - ScheduleRequest request = createScheduleRequest(); - - // Stub - NoPermissionException expectedException = new NoPermissionException(Resource.MEMBER, - Operation.READ); - willThrow(expectedException) - .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); - - // When & Then - mockMvc.perform(post(REQUEST_URL, 1L) - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON) - .characterEncoding(StandardCharsets.UTF_8)) - .andExpect(status().isForbidden()) - .andExpect(jsonPath("$.success").value("false")) - .andExpect(jsonPath("$.code").value(expectedException.getErrorCode().getCode())) - .andExpect(jsonPath("$.message").value(expectedException.getMessage())); - } - @DisplayName("반복 종료일자가 유효하지 않으면 실패한다.") @ParameterizedTest @CsvSource({"2050-01-01", "2010-01-01"}) @@ -154,7 +133,7 @@ void failWithInvalidRepeatEndTime(LocalDate repeatEndDate) throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -185,7 +164,7 @@ void failWithInvalidDateTimeRange() throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -215,7 +194,7 @@ void failWithInvalidTitle() throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -245,7 +224,7 @@ void failWithInvalidLocation() throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -275,7 +254,7 @@ void failWithInvalidContent() throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -303,7 +282,7 @@ void failWithInvalidRepeatRule(String rule) throws Exception { // Stub willDoNothing() .given(scheduleService) - .createSchedule(any(Member.class), anyLong(), any(ScheduleServiceRequest.class)); + .createSchedule(any(Member.class), any(ScheduleServiceRequest.class)); // When & Then mockMvc.perform(post(REQUEST_URL, 1L) @@ -344,8 +323,7 @@ void successWithValidRequest() throws Exception { .map(LocalDate::toString).toList(); // Stubbing - given(scheduleReadService.readScheduleDates(any(Member.class), anyLong(), anyInt(), - anyInt())) + given(scheduleReadService.readScheduleDates(anyLong(), anyInt(), anyInt())) .willReturn(response); // When & Then @@ -359,35 +337,12 @@ void successWithValidRequest() throws Exception { ); } - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWithNoPermissionRequest() throws Exception { - - // Stubbing - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.CREATE); - given(scheduleReadService.readScheduleDates(any(Member.class), anyLong(), anyInt(), - anyInt())) - .willThrow(exception); - - // When & Then - mockMvc.perform(get(REQUEST_URL, 1L) - .param("year", String.valueOf(LocalDate.now().getYear())) - .param("month", String.valueOf(LocalDate.now().getMonthValue()))) - .andExpect(status().isForbidden()) - .andExpectAll( - jsonPath("$.code").value(ErrorCode.NO_PERMISSION.getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } - @DisplayName("현재 로그인한 회원이 연결되어 있지 않다면 실패한다.") @Test void failWithNotConnectedRequest() throws Exception { // Stubbing - given(scheduleReadService.readScheduleDates(any(Member.class), anyLong(), anyInt(), - anyInt())) + given(scheduleReadService.readScheduleDates(anyLong(), anyInt(), anyInt())) .willThrow(new MemberNotConnectedException()); // When & Then @@ -410,8 +365,7 @@ void failWithInvalidQueryParameter(String year, String month) throws Exception { ScheduleDatesServiceResponse response = createScheduleDatesServiceResponse(); // Stubbing - given(scheduleReadService.readScheduleDates(any(Member.class), anyLong(), anyInt(), - anyInt())) + given(scheduleReadService.readScheduleDates(anyLong(), anyInt(), anyInt())) .willReturn(response); // When & Then @@ -451,8 +405,7 @@ void successWithValidRequest() throws Exception { LocalDate now = LocalDate.now(); // Stubbing - given(scheduleReadService.readSchedules( - anyLong(), any(Member.class), anyInt(), anyInt(), anyInt())) + given(scheduleReadService.readSchedules(anyLong(), anyInt(), anyInt(), anyInt())) .willReturn(response); // When & Then @@ -484,8 +437,8 @@ void failWithInvalidQueryParameter(String year, String month, String day) throws ScheduleServiceResponse response = createScheduleServiceResponse(); // Stubbing - given(scheduleReadService.readSchedules(anyLong(), any(Member.class), - anyInt(), anyInt(), anyInt())).willReturn(response); + given(scheduleReadService.readSchedules(anyLong(), anyInt(), anyInt(), anyInt())) + .willReturn(response); // When & Then mockMvc.perform(get(REQUEST_URL, 1) @@ -500,35 +453,13 @@ void failWithInvalidQueryParameter(String year, String month, String day) throws ); } - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWithNoPermissionRequest() throws Exception { - - // Stubbing - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.READ); - given(scheduleReadService.readSchedules(anyLong(), any(Member.class), - anyInt(), anyInt(), anyInt())).willThrow(exception); - - mockMvc.perform(get(REQUEST_URL, 1L) - .param("year", String.valueOf(LocalDate.now().getYear())) - .param("month", String.valueOf(LocalDate.now().getMonthValue())) - .param("day", String.valueOf(LocalDate.now().getDayOfMonth()))) - .andExpect(status().is(exception.getErrorCode().getHttpStatusCode().value())) - .andExpectAll( - jsonPath("$.code").value(exception.getErrorCode().getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } - @DisplayName("현재 로그인한 회원이 연결되어 있지 않다면 실패한다.") @Test void failWithNotConnected() throws Exception { // Stubbing MemberNotConnectedException exception = new MemberNotConnectedException(); - given(scheduleReadService.readSchedules( - anyLong(), any(Member.class), anyInt(), anyInt(), anyInt())) + given(scheduleReadService.readSchedules(anyLong(), anyInt(), anyInt(), anyInt())) .willThrow(exception); // When & Then @@ -570,7 +501,7 @@ void successWithValidRequest() throws Exception { // Stubbing willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any(ScheduleUpdateServiceRequest.class), + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); // When & Then @@ -586,65 +517,6 @@ void successWithValidRequest() throws Exception { ); } - @DisplayName("올바르지 않은 pathvariable을 입력하면 실패한다.") - @CsvSource({"1,a", "a,1"}) - @ParameterizedTest - void failWithInvalidPathVariable(String memberId, String scheduleId) throws Exception { - - // Given - ScheduleUpdateRequest request = createScheduleUpdateRequest(); - - // Stubbing - willDoNothing() - .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any(ScheduleUpdateServiceRequest.class), - any(Member.class), anyBoolean()); - - // When & Then - mockMvc.perform( - put(REQUEST_URL, memberId, scheduleId) - .param("updateRepeat", "true") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON) - .characterEncoding(StandardCharsets.UTF_8)) - .andExpectAll( - status().isBadRequest(), - jsonPath("$.success").value(false), - jsonPath("$.code").value(METHOD_ARGUMENT_TYPE_MISMATCH.getCode()), - jsonPath("$.message").value(containsString("Long")) - ); - } - - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWIthNoPermission() throws Exception { - - // Given - ScheduleUpdateRequest request = createScheduleUpdateRequest(); - NoPermissionException exception = - new NoPermissionException(Resource.MEMBER, Operation.UPDATE); - - // Stubbing - willThrow(exception) - .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); - - // When & Then - mockMvc.perform( - put(REQUEST_URL, 1, 1) - .param("updateRepeat", "true") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON) - .characterEncoding(StandardCharsets.UTF_8)) - .andExpectAll( - status().isForbidden(), - jsonPath("$.success").value(false), - jsonPath("$.code").value(exception.getErrorCode().getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } - @DisplayName("요청에 해당하는 schedule이 존재하지 않으면 실패한다") @Test void failWithScheduleNotFoundException() throws Exception { @@ -656,8 +528,8 @@ void failWithScheduleNotFoundException() throws Exception { // Stubbing willThrow(exception) .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -685,8 +557,8 @@ void failWithInvalidStartDateTime() throws Exception { // Stubbing willThrow(exception) .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -719,8 +591,8 @@ void failWithInvalidEndDateTime() throws Exception { // Stubbing willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -753,8 +625,8 @@ void failWithInvalidTitle() throws Exception { // Stub willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -785,8 +657,8 @@ void failWithInvalidLocation() throws Exception { // Stub willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -817,8 +689,8 @@ void failWithInvalidContent() throws Exception { // Stub willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any( - ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), + any(Member.class), anyBoolean()); // When & Then mockMvc.perform( @@ -843,7 +715,7 @@ void failWithInvalidRequestParam() throws Exception { // Stubbing willDoNothing() .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any(ScheduleUpdateServiceRequest.class), + .updateSchedule(anyLong(), any(ScheduleUpdateServiceRequest.class), any(Member.class), anyBoolean()); // When & Then @@ -860,31 +732,6 @@ void failWithInvalidRequestParam() throws Exception { jsonPath("$.message").value(containsString("updateRepeat")) ); } - - @Test - void 실패_요청한memberId와_조회한개인일정의memberId가다르면_예외를반환한다() throws Exception { - - ScheduleUpdateRequest request = createScheduleUpdateRequest(); - - NoPermissionException exception = new NoPermissionException(Resource.SCHEDULE, - Operation.UPDATE); - willThrow(exception) - .given(scheduleService) - .updateSchedule(anyLong(), anyLong(), any(ScheduleUpdateServiceRequest.class), - any(Member.class), anyBoolean()); - - mockMvc.perform( - put(REQUEST_URL, 1, 1) - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON) - .characterEncoding(StandardCharsets.UTF_8)) - .andExpectAll( - status().isForbidden(), - jsonPath("$.success").value("false"), - jsonPath("$.code").value(exception.getErrorCode().getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } } @Nested @@ -910,7 +757,7 @@ void successWithValidRequest() throws Exception { // Stubbing willDoNothing() .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); + .deleteSchedule(anyLong(), anyBoolean()); // When & Then mockMvc.perform( @@ -922,28 +769,6 @@ void successWithValidRequest() throws Exception { ); } - @DisplayName("올바르지 않은 pathvariable을 입력하면 실패한다.") - @CsvSource({"1,a", "a,1"}) - @ParameterizedTest - void failWithInvalidPathVariable(String memberId, String scheduleId) throws Exception { - - // Stubbing - willDoNothing() - .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); - - // When & Then - mockMvc.perform( - delete(REQUEST_URL, memberId, scheduleId) - .param("deleteRepeat", "true")) - .andExpectAll( - status().isBadRequest(), - jsonPath("$.success").value(false), - jsonPath("$.code").value(METHOD_ARGUMENT_TYPE_MISMATCH.getCode()), - jsonPath("$.message").value(containsString("Long")) - ); - } - @DisplayName("request param의 타입이 올바르지 않으면 실패한다.") @Test void failWithInvalidRequestParam() throws Exception { @@ -951,7 +776,7 @@ void failWithInvalidRequestParam() throws Exception { // Stubbing willDoNothing() .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); + .deleteSchedule(anyLong(), anyBoolean()); // When & Then mockMvc.perform( @@ -965,29 +790,6 @@ void failWithInvalidRequestParam() throws Exception { ); } - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWithNoPermission() throws Exception { - - // Stubbing - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.DELETE); - willThrow(exception) - .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); - - // When & Then - mockMvc.perform( - delete(REQUEST_URL, 1, 1) - .param("deleteRepeat", "true")) - .andExpectAll( - status().isForbidden(), - jsonPath("$.success").value("false"), - jsonPath("$.code").value(exception.getErrorCode().getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } - @DisplayName("요청에 해당하는 일정이 존재하지 않으면 실패한다") @Test void failWithScheduleNotFound() throws Exception { @@ -996,7 +798,7 @@ void failWithScheduleNotFound() throws Exception { ScheduleNotFoundException exception = new ScheduleNotFoundException(); willThrow(exception) .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); + .deleteSchedule(anyLong(), anyBoolean()); // When & Then mockMvc.perform( @@ -1009,25 +811,6 @@ void failWithScheduleNotFound() throws Exception { jsonPath("$.message").value(exception.getMessage()) ); } - - @Test - void 실패_요청한memberId와_조회한개인일정의memberId가다르면_예외를반환한다() throws Exception { - - NoPermissionException exception = new NoPermissionException(Resource.SCHEDULE, - Operation.DELETE); - willThrow(exception) - .given(scheduleService) - .deleteSchedule(anyLong(), anyLong(), any(Member.class), anyBoolean()); - - mockMvc.perform( - delete(REQUEST_URL, 1, 1)) - .andExpectAll( - status().isForbidden(), - jsonPath("$.success").value("false"), - jsonPath("$.code").value(exception.getErrorCode().getCode()), - jsonPath("$.message").value(exception.getMessage()) - ); - } } private ScheduleRequest createScheduleRequest() { diff --git a/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleReadServiceTest.java b/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleReadServiceTest.java index 81ff86f9..79cd9a41 100644 --- a/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleReadServiceTest.java +++ b/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleReadServiceTest.java @@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; import com.dateplan.dateplan.domain.couple.entity.Couple; import com.dateplan.dateplan.domain.couple.repository.CoupleRepository; @@ -15,19 +14,13 @@ import com.dateplan.dateplan.domain.schedule.entity.Schedule; import com.dateplan.dateplan.domain.schedule.entity.SchedulePattern; import com.dateplan.dateplan.domain.schedule.repository.SchedulePatternRepository; -import com.dateplan.dateplan.domain.schedule.repository.ScheduleQueryRepository; import com.dateplan.dateplan.domain.schedule.repository.ScheduleRepository; import com.dateplan.dateplan.domain.schedule.service.ScheduleReadService; import com.dateplan.dateplan.domain.schedule.service.dto.response.ScheduleDatesServiceResponse; import com.dateplan.dateplan.domain.schedule.service.dto.response.ScheduleServiceResponse; import com.dateplan.dateplan.global.auth.MemberThreadLocal; import com.dateplan.dateplan.global.constant.Gender; -import com.dateplan.dateplan.global.constant.Operation; import com.dateplan.dateplan.global.constant.RepeatRule; -import com.dateplan.dateplan.global.constant.Resource; -import com.dateplan.dateplan.global.exception.ErrorCode.DetailMessage; -import com.dateplan.dateplan.global.exception.auth.NoPermissionException; -import com.dateplan.dateplan.global.exception.couple.MemberNotConnectedException; import com.dateplan.dateplan.global.exception.schedule.ScheduleNotFoundException; import com.dateplan.dateplan.service.ServiceTestSupport; import java.time.LocalDate; @@ -43,7 +36,6 @@ import org.junit.jupiter.api.TestInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; public class ScheduleReadServiceTest extends ServiceTestSupport { @@ -53,9 +45,6 @@ public class ScheduleReadServiceTest extends ServiceTestSupport { @MockBean private CoupleReadService coupleReadService; - @SpyBean - private ScheduleQueryRepository queryRepository; - @Autowired private MemberRepository memberRepository; @@ -113,7 +102,7 @@ void successWithValidRequest() { given(coupleReadService.getPartnerId(any(Member.class))) .willReturn(partner.getId()); - ScheduleDatesServiceResponse response = scheduleReadService.readScheduleDates(member, + ScheduleDatesServiceResponse response = scheduleReadService.readScheduleDates( member.getId(), null, null); List actualDates = response.getScheduleDates(); @@ -121,37 +110,6 @@ void successWithValidRequest() { .containsExactlyElementsOf(savedScheduleDates) .isSortedAccordingTo(LocalDate::compareTo); } - - @DisplayName("로그인한 회원과 요청한 memberId가 다르면 실패한다.") - @Test - void failWithNoPermission() { - - assertThatThrownBy( - () -> scheduleReadService.readScheduleDates(member, member.getId() + 100, null, - null)) - .isInstanceOf(NoPermissionException.class) - .hasMessage(String.format(DetailMessage.NO_PERMISSION, Resource.MEMBER.getName(), - Operation.READ.getName())); - - then(queryRepository) - .shouldHaveNoInteractions(); - } - - @DisplayName("회원이 연결되어 있지 않으면 실패한다.") - @Test - void failWithNotConnected() { - - given(coupleReadService.getPartnerId(any(Member.class))) - .willThrow(new MemberNotConnectedException()); - - assertThatThrownBy( - () -> scheduleReadService.readScheduleDates(member, member.getId(), null, null)) - .isInstanceOf(MemberNotConnectedException.class) - .hasMessage(DetailMessage.Member_NOT_CONNECTED); - - then(queryRepository) - .shouldHaveNoInteractions(); - } } @DisplayName("일정 상세 조회 시") @@ -161,7 +119,6 @@ class ReadSchedules { private static final String NEED_SCHEDULES = "needSchedules"; private Member member; private Member partner; - private Couple couple; private final List schedules = new ArrayList<>(); private final List partnerSchedules = new ArrayList<>(); @@ -169,7 +126,7 @@ class ReadSchedules { void setUp(TestInfo testInfo) { member = createMember("01012345678", "aaa"); partner = createMember("01012345679", "bbb"); - couple = createCouple(member, partner); + Couple couple = createCouple(member, partner); memberRepository.saveAll(List.of(member, partner)); coupleRepository.save(couple); @@ -213,7 +170,7 @@ void successWithValidRequest() { // Given ScheduleServiceResponse scheduleServiceResponse = scheduleReadService.readSchedules( - member.getId(), member, + member.getId(), LocalDate.now().getYear(), LocalDate.now().getMonthValue(), LocalDate.now().getDayOfMonth()); @@ -245,7 +202,7 @@ void successWithPartnerId() { // Given ScheduleServiceResponse scheduleServiceResponse = scheduleReadService.readSchedules( - partner.getId(), member, + partner.getId(), LocalDate.now().getYear(), LocalDate.now().getMonthValue(), LocalDate.now().getDayOfMonth()); @@ -270,23 +227,6 @@ void successWithPartnerId() { .extracting(ScheduleEntry::getStartDateTime) .isSortedAccordingTo(Comparator.naturalOrder()); } - - @DisplayName("요청한 member_id가 회원 또는 연결된 회원의 id가 아니면 실패한다") - @Test - void failWithNoPermission() { - - // Given - LocalDate now = LocalDate.now(); - NoPermissionException exception = - new NoPermissionException(Resource.MEMBER, Operation.READ); - - // When & Then - assertThatThrownBy( - () -> scheduleReadService.readSchedules(partner.getId() + 100, - member, now.getYear(), now.getMonthValue(), now.getDayOfMonth())) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - } } @DisplayName("일정 조회 시") diff --git a/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleServiceTest.java b/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleServiceTest.java index 82109ebe..1c2a2fcf 100644 --- a/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleServiceTest.java +++ b/src/test/java/com/dateplan/dateplan/service/schedule/ScheduleServiceTest.java @@ -14,10 +14,7 @@ import com.dateplan.dateplan.domain.schedule.service.dto.request.ScheduleUpdateServiceRequest; import com.dateplan.dateplan.global.constant.DateConstants; import com.dateplan.dateplan.global.constant.Gender; -import com.dateplan.dateplan.global.constant.Operation; import com.dateplan.dateplan.global.constant.RepeatRule; -import com.dateplan.dateplan.global.constant.Resource; -import com.dateplan.dateplan.global.exception.auth.NoPermissionException; import com.dateplan.dateplan.global.exception.schedule.ScheduleNotFoundException; import com.dateplan.dateplan.global.util.ScheduleDateUtil; import com.dateplan.dateplan.service.ServiceTestSupport; @@ -81,7 +78,7 @@ void successWithValidRequest(RepeatRule repeatRule) { ScheduleServiceRequest request = createScheduleServiceRequest(repeatRule); // When - scheduleService.createSchedule(member, memberId, request); + scheduleService.createSchedule(member, request); // Then SchedulePattern schedulePattern = schedulePatternRepository.findAll().get(0); @@ -124,34 +121,12 @@ void successWithValidRequest(RepeatRule repeatRule) { } } } - - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @ParameterizedTest - @EnumSource(value = RepeatRule.class, names = {"N", "D", "W", "M", "Y"}) - void FailWithNoPermissionRequest(RepeatRule repeatRule) { - - // Given - Long memberId = member.getId(); - Long otherMemberId = memberId + 1; - - // When - ScheduleServiceRequest request = createScheduleServiceRequest(repeatRule); - - // Then - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.CREATE); - assertThatThrownBy(() -> scheduleService.createSchedule(member, otherMemberId, request)) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - } } @DisplayName("일정 수정 시") @Nested class UpdateSchedule { - private static final String NEED_SCHEDULE = "needSchedule"; - Member member; List schedules; @@ -192,8 +167,7 @@ void successWithSingleUpdateRequest() { Schedule schedule = schedules.get(0); // When - scheduleService.updateSchedule(member.getId(), schedule.getId(), request, member, - false); + scheduleService.updateSchedule(schedule.getId(), request, member, false); // Then Schedule updatedSchedule = scheduleRepository.findById(schedule.getId()).get(); @@ -213,8 +187,7 @@ void should_createNewSchedulePattern_When_singleUpdate() { Schedule schedule = schedules.get(0); // When - scheduleService.updateSchedule(member.getId(), schedule.getId(), request, member, - false); + scheduleService.updateSchedule(schedule.getId(), request, member, false); // Then Long newSchedulePatternId = schedule.getSchedulePattern().getId() + 1; @@ -260,8 +233,7 @@ void should_modifyOriginSchedulePattern_When_ScheduleAffectOriginSchedulePattern ) ); - scheduleService.updateSchedule(member.getId(), schedules.get(0).getId(), request, - member, false); + scheduleService.updateSchedule(schedules.get(0).getId(), request, member, false); SchedulePattern newSchedulePattern = schedulePatternRepository.findById( schedulePattern.getId()).get(); @@ -293,8 +265,7 @@ void should_doesNotCreateSchedulePattern_When_onlyOneRepeatScheduleExist() { .build() ); - scheduleService.updateSchedule(member.getId(), schedule.getId(), request, member, - false); + scheduleService.updateSchedule(schedule.getId(), request, member, false); assertThat(schedule.getSchedulePattern().getId()).isEqualTo(schedulePattern.getId()); } @@ -307,8 +278,7 @@ void successWithRepeatUpdateRequest() { Schedule schedule = schedules.get(0); // When - scheduleService.updateSchedule(member.getId(), schedule.getId(), request, member, - true); + scheduleService.updateSchedule(schedule.getId(), request, member, true); // Then List updatedSchedules = scheduleRepository.findBySchedulePatternId( @@ -330,23 +300,6 @@ void successWithRepeatUpdateRequest() { } } - @DisplayName("현재 로그인한 회원의 id와 요청의 member_id가 다르면 실패한다.") - @Test - void failWithNoPermission() { - - // Given - ScheduleUpdateServiceRequest request = createScheduleUpdateServiceRequest(); - - // When & Then - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.UPDATE); - assertThatThrownBy(() -> - scheduleService.updateSchedule(member.getId() + 100, 1L, request, member, true)) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - - } - @DisplayName("요청에 해당하는 일정을 찾을 수 없으면 실패한다") @Test void failWIthScheduleNotFound() { @@ -356,49 +309,11 @@ void failWIthScheduleNotFound() { // When & Then ScheduleNotFoundException exception = new ScheduleNotFoundException(); assertThatThrownBy(() -> - scheduleService.updateSchedule( - member.getId(), 100000L, request, member, true)) + scheduleService.updateSchedule(100000L, request, member, true)) .isInstanceOf(exception.getClass()) .hasMessage(exception.getMessage()); } - - @Test - void 실패_요청한memberId와_조회한개인일정의memberId가다르면_예외를반환한다() { - Member otherMember = memberRepository.save(Member.builder() - .phone("01011112222") - .name("name") - .nickname("ccc") - .gender(Gender.MALE) - .birthDay(LocalDate.now()) - .password("password") - .build()); - - SchedulePattern schedulePattern = schedulePatternRepository.save( - SchedulePattern.builder() - .member(otherMember) - .repeatStartDate(LocalDate.now()) - .repeatEndDate(LocalDate.now()) - .repeatRule(RepeatRule.N) - .build()); - Schedule otherSchedule = scheduleRepository.save(Schedule.builder() - .title("otherDating") - .startDateTime(LocalDateTime.now()) - .endDateTime(LocalDateTime.now()) - .schedulePattern(schedulePattern) - .build()); - - ScheduleUpdateServiceRequest request = createScheduleUpdateServiceRequest(); - - NoPermissionException exception = new NoPermissionException(Resource.SCHEDULE, - Operation.UPDATE); - - assertThatThrownBy(() -> - scheduleService.updateSchedule(member.getId(), otherSchedule.getId(), request, - member, false)) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - } } @Nested @@ -451,7 +366,7 @@ void successWithDeleteSingleSchedule() { Schedule schedule = schedules.get(0); // When - scheduleService.deleteSchedule(member.getId(), schedule.getId(), member, false); + scheduleService.deleteSchedule(schedule.getId(), false); // Then assertThat(scheduleRepository.findById(schedule.getId())).isEqualTo(Optional.empty()); @@ -468,7 +383,7 @@ void successWithDeleteRepeatSchedule() { Schedule schedule = schedules.get(0); // When - scheduleService.deleteSchedule(member.getId(), schedule.getId(), member, true); + scheduleService.deleteSchedule(schedule.getId(), true); // Then assertThat(scheduleRepository.findById(schedule.getId())).isEqualTo(Optional.empty()); @@ -476,19 +391,6 @@ void successWithDeleteRepeatSchedule() { schedule.getSchedulePattern().getId())).isEmpty(); } - @DisplayName("요청한 회원의 id와 로그인한 회원의 id가 다르면 실패한다.") - @Test - void failWithNoPermission() { - - // When & Then - NoPermissionException exception = new NoPermissionException(Resource.MEMBER, - Operation.DELETE); - assertThatThrownBy( - () -> scheduleService.deleteSchedule(member.getId() + 10, 1L, member, false)) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - } - @DisplayName("요청한 일정이 존재하지 않으면 실패한다") @Test void failWithScheduleNotFound() { @@ -496,7 +398,7 @@ void failWithScheduleNotFound() { // When & Then ScheduleNotFoundException exception = new ScheduleNotFoundException(); assertThatThrownBy( - () -> scheduleService.deleteSchedule(member.getId(), 1000000L, member, false)) + () -> scheduleService.deleteSchedule(1000000L, false)) .isInstanceOf(exception.getClass()) .hasMessage(exception.getMessage()); } @@ -508,8 +410,7 @@ void removeCascadePattern() { // When schedules.forEach( - iterSchedule -> scheduleService.deleteSchedule(member.getId(), iterSchedule.getId(), - member, false) + iterSchedule -> scheduleService.deleteSchedule(iterSchedule.getId(), false) ); // Then @@ -521,44 +422,6 @@ void removeCascadePattern() { } ); } - - @Tag(NEED_SCHEDULE) - @Test - void 실패_요청한memberId와_조회한개인일정의memberId가다르면_예외를반환한다() { - Member otherMember = memberRepository.save(Member.builder() - .phone("01011112222") - .name("name") - .nickname("ccc") - .gender(Gender.MALE) - .birthDay(LocalDate.now()) - .password("password") - .build()); - - SchedulePattern schedulePattern = schedulePatternRepository.save( - SchedulePattern.builder() - .member(otherMember) - .repeatStartDate(LocalDate.now()) - .repeatEndDate(LocalDate.now()) - .repeatRule(RepeatRule.N) - .build()); - Schedule otherSchedule = scheduleRepository.save(Schedule.builder() - .title("otherDating") - .startDateTime(LocalDateTime.now()) - .endDateTime(LocalDateTime.now()) - .schedulePattern(schedulePattern) - .build()); - - ScheduleUpdateServiceRequest request = createScheduleUpdateServiceRequest(); - - NoPermissionException exception = new NoPermissionException(Resource.SCHEDULE, - Operation.DELETE); - - assertThatThrownBy(() -> - scheduleService.deleteSchedule(member.getId(), otherSchedule.getId(), member, - false)) - .isInstanceOf(exception.getClass()) - .hasMessage(exception.getMessage()); - } } private Schedule createSchedule(SchedulePattern schedulePattern) {