Skip to content

Commit

Permalink
Merge pull request #27 from dev-hooon/feat/#19
Browse files Browse the repository at this point in the history
feat : 예약 선점 api 구현 및 통합테스트
  • Loading branch information
dlswns2480 authored Jan 1, 2024
2 parents de5ca57 + 3dad33b commit cd377ef
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 8 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ ext {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-security'
// implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
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 @@ -18,7 +19,7 @@ public class ReservationController {

@PostMapping
public ResponseEntity<CreateReservationResponse> createReservationResponse(
CreateReservationRequest request) {
@RequestBody CreateReservationRequest request) {
return ResponseEntity.ok(reservationFacade.preOccupyReservation(request));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.prgrms.catchtable.reservation.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import java.time.LocalDateTime;
import lombok.Builder;

@Builder
public record CreateReservationResponse(String shopName,
String memberName,
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm")
LocalDateTime date,
int peopleCount) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public void setPreOcuppied(ReservationTime reservationTime) {
reservationTime.reversePreOccupied();

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(reservationTime::reversePreOccupied, 10, TimeUnit.SECONDS);
scheduler.schedule(reservationTime::reversePreOccupied, 2, TimeUnit.SECONDS);

scheduler.shutdown();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.prgrms.catchtable.common.base;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;

@SpringBootTest
@Transactional
@AutoConfigureMockMvc
public abstract class BaseIntegrationTest {

@Autowired
public MockMvc mockMvc;
public static ObjectMapper objectMapper = new ObjectMapper();

public static String asJsonString(final Object object) throws Exception {
return objectMapper.writeValueAsString(object);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ public static ReservationTime getReservationTimePreOccupied() {
return reservationTime;
}

public static CreateReservationRequest getCreateReservationRequest() {
public static CreateReservationRequest getCreateReservationRequest(Long reservationTimeId) {
return CreateReservationRequest.builder()
.reservationTimeId(1L)
.reservationTimeId(reservationTimeId)
.peopleCount(4)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ class ReservationFacadeTest {
@DisplayName("예약을 검증하고 선점권을 true로 바꾸는 것에 성공한다.")
void preOccupyReservation() {
ReservationTime reservationTime = ReservationData.getReservationTimeNotPreOccupied();
CreateReservationRequest request = ReservationData.getCreateReservationRequest();
CreateReservationRequest request = ReservationData.getCreateReservationRequest(
reservationTime.getId());

when(reservationService.validateReservationAndSave(
any(CreateReservationRequest.class))).thenReturn(reservationTime);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.prgrms.catchtable.reservation.controller;

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.post;
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.reservation.ReservationData;
import com.prgrms.catchtable.reservation.domain.ReservationTime;
import com.prgrms.catchtable.reservation.dto.request.CreateReservationRequest;
import com.prgrms.catchtable.reservation.repository.ReservationTimeRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;


class ReservationControllerTest extends BaseIntegrationTest {

@Autowired
private ReservationTimeRepository reservationTimeRepository;

@Test
@DisplayName("예약 선점 api 호출에 성공한다.")
void preOccupyReservation() throws Exception {
ReservationTime reservationTime = ReservationData.getReservationTimeNotPreOccupied();
ReservationTime savedReservationTime = reservationTimeRepository.save(reservationTime);
CreateReservationRequest request = ReservationData.getCreateReservationRequest(
savedReservationTime.getId());

mockMvc.perform(post("/reservations")
.contentType(APPLICATION_JSON)
.content(asJsonString(request)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.shopName").value(reservationTime.getShop().getName()))
.andExpect(jsonPath("$.date").value(reservationTime.getTime().toString()))
.andExpect(jsonPath("$.peopleCount").value(request.peopleCount()));
}

@Test
@DisplayName("선점 api 호출 시 선점권이 획득 되었다가 지정 시간 이후에 획득이 풀린다.")
void schedulerTest() throws Exception {
ReservationTime reservationTime = ReservationData.getReservationTimeNotPreOccupied();
ReservationTime savedReservationTime = reservationTimeRepository.save(reservationTime);
CreateReservationRequest request = ReservationData.getCreateReservationRequest(
savedReservationTime.getId());

mockMvc.perform(post("/reservations")
.contentType(APPLICATION_JSON)
.content(asJsonString(request)));

assertThat(reservationTime.isPreOccupied()).isTrue();
Thread.sleep(3_000); //현재 스케줄러는 2초로 설정되어있어 3초간 대기 후 검증
assertThat(reservationTime.isPreOccupied()).isFalse();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ class ReservationServiceTest {
@DisplayName("예약시간의 선점 여부를 검증하고 선점권이 빈 것을 확인한다.")
void validateReservation() {
//given
CreateReservationRequest request = ReservationData.getCreateReservationRequest();
ReservationTime reservationTime = ReservationData.getReservationTimeNotPreOccupied();
ReflectionTestUtils.setField(reservationTime, "id", 1L);
CreateReservationRequest request = ReservationData.getCreateReservationRequest(
reservationTime.getId());

when(reservationTimeRepository.findById(1L)).thenReturn(Optional.of(reservationTime));

Expand All @@ -55,8 +56,9 @@ void validateReservation() {
void alreadyPreOccupied() {
//given
ReservationTime reservationTime = ReservationData.getReservationTimePreOccupied();
CreateReservationRequest request = ReservationData.getCreateReservationRequest();
ReflectionTestUtils.setField(reservationTime, "id", 1L);
CreateReservationRequest request = ReservationData.getCreateReservationRequest(
reservationTime.getId());

when(reservationTimeRepository.findById(1L)).thenReturn(Optional.of(reservationTime));

Expand Down

0 comments on commit cd377ef

Please sign in to comment.