package roomescape.reservation.business; import static org.assertj.core.api.Assertions.*; import java.time.LocalDateTime; import java.time.LocalTime; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import roomescape.member.infrastructure.persistence.MemberEntity; import roomescape.member.infrastructure.persistence.MemberRepository; import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.infrastructure.persistence.Reservation; import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationTime; import roomescape.reservation.infrastructure.persistence.ReservationRepository; import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository; import roomescape.reservation.web.request.ReservationTimeRequest; import roomescape.common.exception.RoomescapeException; import roomescape.theme.infrastructure.persistence.ThemeEntity; import roomescape.theme.infrastructure.persistence.ThemeRepository; @SpringBootTest @Import(ReservationTimeService.class) @Sql(scripts = "/truncate.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) class ReservationTimeServiceTest { @Autowired private ReservationTimeService reservationTimeService; @Autowired private ReservationTimeRepository reservationTimeRepository; @Autowired private ReservationRepository reservationRepository; @Autowired private ThemeRepository themeRepository; @Autowired private MemberRepository memberRepository; @Test @DisplayName("중복된 예약 시간을 등록하는 경우 예외가 발생한다.") void duplicateTimeFail() { // given reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); // when & then assertThatThrownBy(() -> reservationTimeService.addTime(new ReservationTimeRequest(LocalTime.of(12, 30)))) .isInstanceOf(RoomescapeException.class); } @Test @DisplayName("존재하지 않는 ID로 시간을 조회하면 예외가 발생한다.") void findTimeByIdFail() { // given ReservationTime saved = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); // when Long invalidTimeId = saved.getId() + 1; // when & then assertThatThrownBy(() -> reservationTimeService.findTimeById(invalidTimeId)) .isInstanceOf(RoomescapeException.class); } @Test @DisplayName("삭제하려는 시간에 예약이 존재하면 예외를 발생한다.") void usingTimeDeleteFail() { // given LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0); ReservationTime reservationTime = reservationTimeRepository.save( new ReservationTime(localDateTime.toLocalTime())); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL")); MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); // when reservationRepository.save(new Reservation(localDateTime.toLocalDate(), reservationTime, theme, member, ReservationStatus.CONFIRMED)); // then assertThatThrownBy(() -> reservationTimeService.removeTimeById(reservationTime.getId())) .isInstanceOf(RoomescapeException.class); } }