89 lines
3.5 KiB
Java

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);
}
}