Skip to content

Commit

Permalink
Merge pull request #97 from dev-hooon/feat/#92/reservation-restdocs
Browse files Browse the repository at this point in the history
feat : 예약 api REST Docs 명세
  • Loading branch information
dlswns2480 authored Jan 12, 2024
2 parents 04df0be + ad78b60 commit 4c5dc00
Show file tree
Hide file tree
Showing 7 changed files with 387 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
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;
import java.util.List;
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;
Expand All @@ -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
Expand All @@ -30,7 +32,7 @@ public void modifyReservationStatus(

@GetMapping
public ResponseEntity<List<OwnerGetAllReservationResponse>> getAllReservation(
@RequestBody Long ownerId) {
return ResponseEntity.ok(ownerReservationService.getAllReservation(ownerId));
@LogIn Owner owner) {
return ResponseEntity.ok(ownerReservationService.getAllReservation(owner));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ public void modifyReservationStatus(
* @return
*/
@Transactional(readOnly = true)
public List<OwnerGetAllReservationResponse> getAllReservation(Long ownerId) {
Owner owner = ownerRepository.findById(ownerId).orElseThrow();
public List<OwnerGetAllReservationResponse> getAllReservation(Owner owner) {

List<Reservation> reservations = reservationRepository.findAllWithReservationTimeAndShopByShopId(
owner.getShop().getId());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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("[email protected]");
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<GetAllReservationResponse> 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("예약 상태")
)
));
}

}
Loading

0 comments on commit 4c5dc00

Please sign in to comment.