diff --git a/src/main/java/com/prgrms/catchtable/reservation/controller/OwnerReservationController.java b/src/main/java/com/prgrms/catchtable/reservation/controller/OwnerReservationController.java index ff24e8bd..4105bfa0 100644 --- a/src/main/java/com/prgrms/catchtable/reservation/controller/OwnerReservationController.java +++ b/src/main/java/com/prgrms/catchtable/reservation/controller/OwnerReservationController.java @@ -1,5 +1,7 @@ package com.prgrms.catchtable.reservation.controller; +import com.prgrms.catchtable.common.login.LogIn; +import com.prgrms.catchtable.owner.domain.Owner; import com.prgrms.catchtable.reservation.dto.request.ModifyReservationStatusRequest; import com.prgrms.catchtable.reservation.dto.response.OwnerGetAllReservationResponse; import com.prgrms.catchtable.reservation.service.OwnerReservationService; @@ -7,8 +9,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +22,7 @@ public class OwnerReservationController { private final OwnerReservationService ownerReservationService; - @PostMapping("/{reservationId}") + @PatchMapping("/{reservationId}") public void modifyReservationStatus( @PathVariable("reservationId") Long reservationId, @RequestBody ModifyReservationStatusRequest request @@ -30,7 +32,7 @@ public void modifyReservationStatus( @GetMapping public ResponseEntity> getAllReservation( - @RequestBody Long ownerId) { - return ResponseEntity.ok(ownerReservationService.getAllReservation(ownerId)); + @LogIn Owner owner) { + return ResponseEntity.ok(ownerReservationService.getAllReservation(owner)); } } diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/OwnerReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/OwnerReservationService.java index 68398914..0ea1ade6 100644 --- a/src/main/java/com/prgrms/catchtable/reservation/service/OwnerReservationService.java +++ b/src/main/java/com/prgrms/catchtable/reservation/service/OwnerReservationService.java @@ -59,8 +59,8 @@ public void modifyReservationStatus( * @return */ @Transactional(readOnly = true) - public List getAllReservation(Long ownerId) { - Owner owner = ownerRepository.findById(ownerId).orElseThrow(); + public List getAllReservation(Owner owner) { + List reservations = reservationRepository.findAllWithReservationTimeAndShopByShopId( owner.getShop().getId()); diff --git a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java index 8dfb5bef..e6411a7d 100644 --- a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java +++ b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java @@ -2,6 +2,7 @@ import static com.prgrms.catchtable.common.Role.*; import static com.prgrms.catchtable.common.Role.MEMBER; +import static com.prgrms.catchtable.common.Role.OWNER; import com.fasterxml.jackson.databind.ObjectMapper; import com.prgrms.catchtable.common.Role; diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerDocsTest.java new file mode 100644 index 00000000..d30ec08b --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerDocsTest.java @@ -0,0 +1,253 @@ +package com.prgrms.catchtable.reservation.controller; + +import static com.prgrms.catchtable.reservation.domain.ReservationStatus.CANCELLED; +import static com.prgrms.catchtable.reservation.domain.ReservationStatus.COMPLETED; +import static org.mockito.Mockito.when; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.prgrms.catchtable.common.restdocs.RestDocsSupport; +import com.prgrms.catchtable.member.MemberFixture; +import com.prgrms.catchtable.member.domain.Member; +import com.prgrms.catchtable.member.repository.MemberRepository; +import com.prgrms.catchtable.reservation.dto.request.CreateReservationRequest; +import com.prgrms.catchtable.reservation.dto.request.ModifyReservationRequest; +import com.prgrms.catchtable.reservation.dto.response.CancelReservationResponse; +import com.prgrms.catchtable.reservation.dto.response.CreateReservationResponse; +import com.prgrms.catchtable.reservation.dto.response.GetAllReservationResponse; +import com.prgrms.catchtable.reservation.dto.response.ModifyReservationResponse; +import com.prgrms.catchtable.reservation.fixture.ReservationFixture; +import com.prgrms.catchtable.reservation.service.MemberReservationService; +import java.time.LocalDateTime; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +public class MemberReservationControllerDocsTest extends RestDocsSupport { + + @MockBean + private MemberReservationService memberReservationService; + + @Autowired + private MemberRepository memberRepository; + + @BeforeEach + void setUp() { + Member member = MemberFixture.member("dlswns6asd61035@gmail.com"); + Member savedMember = memberRepository.save(member); + } + + + @Test + @DisplayName("예약 선점 api") + void preOccupy() throws Exception { + Member member = memberRepository.findAll().get(0); + + CreateReservationRequest request = ReservationFixture.getCreateReservationRequest(); + CreateReservationResponse response = CreateReservationResponse.builder() + .shopName("shopA") + .memberName(member.getName()) + .date(LocalDateTime.of(2024, 1, 1, 19, 30)) + .peopleCount(request.peopleCount()) + .build(); + + when(memberReservationService.preOccupyReservation(member, request)).thenReturn(response); + + mockMvc.perform(post("/reservations") + .headers(getHttpHeaders(member)) + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("reservationTimeId").type(NUMBER) + .description("예약시간 id"), + fieldWithPath("peopleCount").type(NUMBER) + .description("예약 인원") + ), + responseFields( + fieldWithPath("shopName").type(STRING) + .description("매장명"), + fieldWithPath("memberName").type(STRING) + .description("예약자 이름"), + fieldWithPath("date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("peopleCount").type(NUMBER) + .description("예약 인원") + ) + ) + ); + } + + @Test + @DisplayName("예약 등록 api") + void register() throws Exception { + Member member = memberRepository.findAll().get(0); + + CreateReservationRequest request = ReservationFixture.getCreateReservationRequest(); + CreateReservationResponse response = CreateReservationResponse.builder() + .shopName("shopA") + .memberName(member.getName()) + .date(LocalDateTime.of(2024, 1, 1, 19, 30)) + .peopleCount(request.peopleCount()) + .build(); + + when(memberReservationService.registerReservation(member, request)).thenReturn(response); + + mockMvc.perform(post("/reservations/success") + .headers(getHttpHeaders(member)) + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("reservationTimeId").type(NUMBER) + .description("예약시간 id"), + fieldWithPath("peopleCount").type(NUMBER) + .description("예약 인원") + ), + responseFields( + fieldWithPath("shopName").type(STRING) + .description("매장명"), + fieldWithPath("memberName").type(STRING) + .description("예약자 이름"), + fieldWithPath("date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("peopleCount").type(NUMBER) + .description("예약 인원") + ) + ) + ); + } + + @Test + @DisplayName("예약 전체 조회 api") + void getAll() throws Exception { + Member member = memberRepository.findAll().get(0); + GetAllReservationResponse reservation1 = GetAllReservationResponse.builder() + .reservationId(1L) + .date(LocalDateTime.of(2024, 1, 1, 19, 30)) + .shopName("shopA") + .peopleCount(5) + .status(COMPLETED) + .build(); + GetAllReservationResponse reservation2 = GetAllReservationResponse.builder() + .reservationId(2L) + .date(LocalDateTime.of(2024, 1, 5, 20, 30)) + .shopName("shopB") + .peopleCount(3) + .status(CANCELLED) + .build(); + + List response = List.of(reservation1, reservation2); + + when(memberReservationService.getAllReservation(member)).thenReturn(response); + + mockMvc.perform(get("/reservations") + .headers(getHttpHeaders(member))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + responseFields( + fieldWithPath("[0].reservationId").type(NUMBER) + .description("예약 id"), + fieldWithPath("[0].date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("[0].shopName").type(STRING) + .description("매장명"), + fieldWithPath("[0].peopleCount").type(NUMBER) + .description("예약 인원 수"), + fieldWithPath("[0].status").type(STRING) + .description("예약 상태"), + fieldWithPath("[1].reservationId").type(NUMBER) + .description("예약 id"), + fieldWithPath("[1].date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("[1].shopName").type(STRING) + .description("매장명"), + fieldWithPath("[1].peopleCount").type(NUMBER) + .description("예약 인원 수"), + fieldWithPath("[1].status").type(STRING) + .description("예약 상태") + ) + )); + } + + @Test + @DisplayName("예약 수정 api") + void modify() throws Exception { + Member member = memberRepository.findAll().get(0); + + ModifyReservationRequest request = ReservationFixture.getModifyReservationRequest(1L); + + ModifyReservationResponse response = ModifyReservationResponse.builder() + .shopName("shopA") + .memberName(member.getName()) + .date(LocalDateTime.of(2024, 1, 1, 19, 30)) + .peopleCount(5) + .build(); + + when(memberReservationService.modifyReservation(1L, request)).thenReturn(response); + + mockMvc.perform(patch("/reservations/{reservationId}", 1) + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member)) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("reservationTimeId").type(NUMBER) + .description("수정하려는 예약시간 id"), + fieldWithPath("peopleCount").type(NUMBER) + .description("수정하려는 인원 수") + ), + responseFields( + fieldWithPath("shopName").type(STRING) + .description("매장명"), + fieldWithPath("memberName").type(STRING) + .description("예약자명"), + fieldWithPath("date").type(STRING) + .description("수정된 예약 날짜 및 시간"), + fieldWithPath("peopleCount").type(NUMBER) + .description("수정된 예약 인원 수") + ) + )); + } + + @Test + @DisplayName("예약 취소 api") + void cancel() throws Exception { + Member member = memberRepository.findAll().get(0); + + CancelReservationResponse response = CancelReservationResponse.builder() + .status(CANCELLED) + .build(); + + when(memberReservationService.cancelReservation(member, 1L)).thenReturn(response); + + mockMvc.perform(delete("/reservations/{reservationId}", 1L) + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + responseFields( + fieldWithPath("status").type(STRING) + .description("예약 상태") + ) + )); + } + +} diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerDocsTest.java new file mode 100644 index 00000000..40e6e434 --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerDocsTest.java @@ -0,0 +1,114 @@ +package com.prgrms.catchtable.reservation.controller; + +import static com.prgrms.catchtable.reservation.domain.ReservationStatus.CANCELLED; +import static com.prgrms.catchtable.reservation.domain.ReservationStatus.COMPLETED; +import static org.mockito.Mockito.doNothing; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.prgrms.catchtable.common.restdocs.RestDocsSupport; +import com.prgrms.catchtable.owner.domain.Owner; +import com.prgrms.catchtable.owner.fixture.OwnerFixture; +import com.prgrms.catchtable.owner.repository.OwnerRepository; +import com.prgrms.catchtable.reservation.dto.request.ModifyReservationStatusRequest; +import com.prgrms.catchtable.reservation.dto.response.OwnerGetAllReservationResponse; +import com.prgrms.catchtable.reservation.fixture.ReservationFixture; +import com.prgrms.catchtable.reservation.service.OwnerReservationService; +import java.time.LocalDateTime; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +public class OwnerReservationControllerDocsTest extends RestDocsSupport { + + @MockBean + private OwnerReservationService ownerReservationService; + @Autowired + private OwnerRepository ownerRepository; + + @BeforeEach + void setUp() { + Owner owner = OwnerFixture.getOwner("dlswns", "dlswns24802840"); + ownerRepository.save(owner); + } + + @Test + @DisplayName("예약 노쇼, 취소 처리 api") + void noshowAndCancel() throws Exception { + Owner owner = ownerRepository.findAll().get(0); + + ModifyReservationStatusRequest request = ReservationFixture.getModifyReservationStatusRequest( + CANCELLED); + doNothing().when(ownerReservationService).modifyReservationStatus(1L, request); + + mockMvc.perform(patch("/owners/shop/{reservationId}", 1) + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + .headers(getHttpHeaders(owner))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("status").type(STRING) + .description("수정하려는 예약 상태") + ) + )); + } + + @Test + @DisplayName("가게의 예약 전체 조회 api") + void getAllReservation() throws Exception { + Owner owner = ownerRepository.findAll().get(0); + OwnerGetAllReservationResponse reservation1 = OwnerGetAllReservationResponse.builder() + .reservationId(1L) + .date(LocalDateTime.of(2024, 3, 4, 12, 30)) + .peopleCount(4) + .status(COMPLETED) + .build(); + OwnerGetAllReservationResponse reservation2 = OwnerGetAllReservationResponse.builder() + .reservationId(2L) + .date(LocalDateTime.of(2024, 3, 25, 17, 30)) + .peopleCount(2) + .status(CANCELLED) + .build(); + List response = List.of(reservation1, reservation2); + + Mockito.when(ownerReservationService.getAllReservation(owner)).thenReturn(response); + + mockMvc.perform(get("/owners/shop") + .headers(getHttpHeaders(owner))) + .andExpect(status().isOk()) + .andDo(restDocs.document( + responseFields( + fieldWithPath("[0].reservationId").type(NUMBER) + .description("예약 id"), + fieldWithPath("[0].date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("[0].peopleCount").type(NUMBER) + .description("예약 인원 수"), + fieldWithPath("[0].status").type(STRING) + .description("예약 상태"), + fieldWithPath("[1].reservationId").type(NUMBER) + .description("예약 id"), + fieldWithPath("[1].date").type(STRING) + .description("예약 날짜 및 시간"), + fieldWithPath("[1].peopleCount").type(NUMBER) + .description("예약 인원 수"), + fieldWithPath("[1].status").type(STRING) + .description("예약 상태") + ) + )); + } +} diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerTest.java index cf6e7268..fbeb90f0 100644 --- a/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/reservation/controller/OwnerReservationControllerTest.java @@ -1,15 +1,17 @@ package com.prgrms.catchtable.reservation.controller; +import static com.prgrms.catchtable.common.Role.OWNER; import static com.prgrms.catchtable.reservation.domain.ReservationStatus.CANCELLED; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.prgrms.catchtable.common.base.BaseIntegrationTest; import com.prgrms.catchtable.common.data.shop.ShopData; +import com.prgrms.catchtable.jwt.token.Token; import com.prgrms.catchtable.owner.domain.Owner; import com.prgrms.catchtable.owner.fixture.OwnerFixture; import com.prgrms.catchtable.owner.repository.OwnerRepository; @@ -65,6 +67,10 @@ void setUp() { Owner owner = OwnerFixture.getOwner("email", "password"); owner.insertShop(shop); ownerRepository.save(owner); + + Token token = jwtTokenProvider.createToken(owner.getEmail(), OWNER); + httpHeaders.add("AccessToken", token.getAccessToken()); + httpHeaders.add("RefreshToken", token.getRefreshToken()); } @Test @@ -79,7 +85,7 @@ void modifyReservationStatus() throws Exception { //then assertThat(reservation.getReservationTime().isOccupied()).isTrue(); // 취소처리 전엔 예약시간 차있음 - mockMvc.perform(post("/owners/shop/{reservationId}", reservation.getId()) + mockMvc.perform(patch("/owners/shop/{reservationId}", reservation.getId()) .contentType(APPLICATION_JSON) .content(asJsonString(request))) .andExpect(status().isOk()); @@ -100,6 +106,7 @@ void getAllReservation() throws Exception { mockMvc.perform(get("/owners/shop") .contentType(APPLICATION_JSON) + .headers(httpHeaders) .content(asJsonString(owner.getId()))) .andExpect(status().isOk()) .andExpect( diff --git a/src/test/java/com/prgrms/catchtable/reservation/service/OwnerReservationServiceTest.java b/src/test/java/com/prgrms/catchtable/reservation/service/OwnerReservationServiceTest.java index 96c21097..3bd7784e 100644 --- a/src/test/java/com/prgrms/catchtable/reservation/service/OwnerReservationServiceTest.java +++ b/src/test/java/com/prgrms/catchtable/reservation/service/OwnerReservationServiceTest.java @@ -112,9 +112,8 @@ void getAllReservation() { Owner owner = OwnerFixture.getOwner("email", "password"); when(reservationRepository.findAllWithReservationTimeAndShopByShopId( any(Long.class))).thenReturn(reservations); - when(ownerRepository.findById(any(Long.class))).thenReturn(Optional.of(owner)); List allReservation = ownerReservationService.getAllReservation( - 1L); + owner); assertAll( () -> assertThat(allReservation.get(0).date()).isEqualTo( @@ -131,10 +130,9 @@ void getAllReservationEmpty() { when(reservationRepository.findAllWithReservationTimeAndShopByShopId( any(Long.class))).thenReturn(List.of()); - when(ownerRepository.findById(any(Long.class))).thenReturn(Optional.of(owner)); List allReservation = ownerReservationService.getAllReservation( - 1L); + owner); assertThat(allReservation).isEmpty(); }