diff --git a/src/test/java/com/sudo/railo/booking/application/ReservationServiceTest.java b/src/test/java/com/sudo/railo/booking/application/ReservationServiceTest.java index bf0accac..055666ee 100644 --- a/src/test/java/com/sudo/railo/booking/application/ReservationServiceTest.java +++ b/src/test/java/com/sudo/railo/booking/application/ReservationServiceTest.java @@ -2,27 +2,35 @@ import static org.assertj.core.api.Assertions.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; 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 com.sudo.railo.booking.application.dto.request.ReservationCreateRequest; +import com.sudo.railo.booking.application.dto.request.ReservationDeleteRequest; +import com.sudo.railo.booking.application.dto.response.ReservationDetail; import com.sudo.railo.booking.domain.Reservation; import com.sudo.railo.booking.domain.status.ReservationStatus; import com.sudo.railo.booking.domain.type.PassengerSummary; import com.sudo.railo.booking.domain.type.PassengerType; import com.sudo.railo.booking.domain.type.TripType; +import com.sudo.railo.booking.exception.BookingError; import com.sudo.railo.booking.infrastructure.reservation.ReservationRepository; +import com.sudo.railo.global.exception.error.BusinessException; import com.sudo.railo.member.domain.Member; import com.sudo.railo.member.infrastructure.MemberRepository; import com.sudo.railo.support.annotation.ServiceTest; import com.sudo.railo.support.fixture.MemberFixture; +import com.sudo.railo.support.helper.ReservationTestHelper; import com.sudo.railo.support.helper.TrainScheduleTestHelper; import com.sudo.railo.support.helper.TrainScheduleTestHelper.TrainScheduleWithStopStations; import com.sudo.railo.support.helper.TrainTestHelper; -import com.sudo.railo.train.domain.ScheduleStop; import com.sudo.railo.train.domain.Train; import com.sudo.railo.train.domain.type.CarType; @@ -44,26 +52,34 @@ class ReservationServiceTest { @Autowired private TrainScheduleTestHelper trainScheduleTestHelper; + @Autowired + private ReservationTestHelper reservationTestHelper; + @Autowired private ReservationRepository reservationRepository; - @Test - @DisplayName("유효한 요청으로 예약이 성공한다") - void createReservation_success() { - //given - Train train = trainTestHelper.createKTX(); - TrainScheduleWithStopStations scheduleWithStops = trainScheduleTestHelper.createSchedule(train); + private Member member; + private Train train; + private TrainScheduleWithStopStations schedule; + private List standardSeatIds; + @BeforeEach + void setup() { Member member = MemberFixture.createStandardMember(); - memberRepository.save(member); + this.member = memberRepository.save(member); + train = trainTestHelper.createKTX(); + schedule = trainScheduleTestHelper.createSchedule(train); + standardSeatIds = trainTestHelper.getSeatIds(train, CarType.STANDARD, 2); + } - List standardSeatIds = trainTestHelper.getSeatIds(train, CarType.STANDARD, 2); - ScheduleStop departureStop = trainScheduleTestHelper.getScheduleStopByStationName(scheduleWithStops, "서울"); - ScheduleStop arrivalStop = trainScheduleTestHelper.getScheduleStopByStationName(scheduleWithStops, "부산"); + @Test + @DisplayName("유효한 요청으로 예약이 성공한다") + void validRequest_createReservation_success() { + // given ReservationCreateRequest request = new ReservationCreateRequest( - scheduleWithStops.trainSchedule().getId(), - departureStop.getStation().getId(), - arrivalStop.getStation().getId(), + schedule.trainSchedule().getId(), + schedule.scheduleStops().get(0).getId(), + schedule.scheduleStops().get(1).getId(), List.of(new PassengerSummary(PassengerType.ADULT, 1), new PassengerSummary(PassengerType.CHILD, 1)), standardSeatIds, TripType.OW @@ -82,4 +98,224 @@ void createReservation_success() { assertThat(savedReservation.getFare()).isEqualTo(80000); assertThat(savedReservation.getReservationCode()).isNotNull(); } + + @Test + @DisplayName("멤버번호와 예약 ID로 특정 예약 조회에 성공한다") + void memberNoAndReservationId_getReservation_success() { + // given + String memberNo = member.getMemberDetail().getMemberNo(); + + Train train = trainTestHelper.createKTX(); + TrainScheduleWithStopStations schedule = trainScheduleTestHelper.createSchedule(train); + Reservation reservation = reservationTestHelper.createReservation(member, schedule); + Reservation entity = reservationRepository.save(reservation); + + // when + ReservationDetail result = reservationService.getReservation(memberNo, entity.getId()); + + // then + assertThat(result.reservationId()).isEqualTo(entity.getId()); + assertThat(result.reservationCode()).isEqualTo(reservation.getReservationCode()); + assertThat(result.departureStationName()).isEqualTo( + schedule.scheduleStops().get(0).getStation().getStationName()); + assertThat(result.arrivalStationName()).isEqualTo( + schedule.scheduleStops().get(1).getStation().getStationName()); + } + + @Test + @DisplayName("올바른 멤버번호와 잘못된 예약 ID로 특정 예약 조회 시 예외를 반환한다") + void memberNoAndInvalidReservationId_getReservation_throwException() { + // given + String memberNo = member.getMemberDetail().getMemberNo(); + + Train train = trainTestHelper.createKTX(); + TrainScheduleWithStopStations schedule = trainScheduleTestHelper.createSchedule(train); + Reservation reservation = reservationTestHelper.createReservation(member, schedule); + Reservation entity = reservationRepository.save(reservation); + + // when & then + assertThatThrownBy(() -> reservationService.getReservation(memberNo, 2L)) + .isInstanceOf(BusinessException.class); + + reservationRepository.save(reservation); + } + + @Test + @DisplayName("올바른 멤버번호와 만료된 예약 ID로 특정 예약 조회 시 예외를 반환한다") + void memberNoAndExpiredReservationId_getReservation_throwException() { + // given + String memberNo = member.getMemberDetail().getMemberNo(); + Reservation reservation = Reservation.builder() + .trainSchedule(schedule.trainSchedule()) + .member(member) + .reservationCode("20250806100001D49J") + .tripType(TripType.OW) + .totalPassengers(1) + .passengerSummary("[{\"passengerType\":\"ADULT\",\"count\":1}]") + .reservationStatus(ReservationStatus.RESERVED) + .expiresAt(LocalDateTime.now().minusMinutes(10)) + .fare(50000) + .departureStop(schedule.scheduleStops().get(0)) + .arrivalStop(schedule.scheduleStops().get(1)) + .build(); + Reservation entity = reservationRepository.save(reservation); + + // when & then + assertThatThrownBy(() -> reservationService.getReservation(memberNo, entity.getId())) + .isInstanceOf(BusinessException.class) + .hasMessage(BookingError.RESERVATION_EXPIRED.getMessage()); + } + + @Test + @DisplayName("멤버번호로 관련한 예약 목록 조회에 성공한다") + void memberNo_getReservations_success() { + // given + String memberNo = member.getMemberDetail().getMemberNo(); + + Train train = trainTestHelper.createKTX(); + TrainScheduleWithStopStations scheduleBusanToDongDaegu = trainScheduleTestHelper.createCustomSchedule() + .scheduleName("커스텀 노선 - 부산에서 동대구") + .operationDate(LocalDate.now()) + .train(train) + .addStop("부산", null, LocalTime.of(5, 0)) + .addStop("동대구", LocalTime.of(8, 0), null) + .build(); + + TrainScheduleWithStopStations scheduleDaejeonToSeoul = trainScheduleTestHelper.createCustomSchedule() + .scheduleName("커스텀 노선 - 대전에서 서울") + .operationDate(LocalDate.now()) + .train(train) + .addStop("대전", null, LocalTime.of(10, 0)) + .addStop("서울", LocalTime.of(12, 0), null) + .build(); + + Reservation reservation1 = reservationTestHelper.createReservation(member, scheduleBusanToDongDaegu); + Reservation reservation2 = reservationTestHelper.createReservation(member, scheduleDaejeonToSeoul); + Reservation entity1 = reservationRepository.save(reservation1); + Reservation entity2 = reservationRepository.save(reservation2); + + // when + List result = reservationService.getReservations(memberNo); + + // then + assertThat(result.size()).isEqualTo(2); + ReservationDetail result1 = result.get(0); + ReservationDetail result2 = result.get(1); + + assertThat(result1.reservationId()).isEqualTo(entity1.getId()); + assertThat(result1.reservationCode()).isEqualTo(reservation1.getReservationCode()); + assertThat(result1.departureStationName()).isEqualTo( + scheduleBusanToDongDaegu.scheduleStops().get(0).getStation().getStationName()); + assertThat(result1.arrivalStationName()).isEqualTo( + scheduleBusanToDongDaegu.scheduleStops().get(1).getStation().getStationName()); + + assertThat(result2.reservationId()).isEqualTo(entity2.getId()); + assertThat(result2.reservationCode()).isEqualTo(reservation2.getReservationCode()); + assertThat(result2.departureStationName()).isEqualTo( + scheduleDaejeonToSeoul.scheduleStops().get(0).getStation().getStationName()); + assertThat(result2.arrivalStationName()).isEqualTo( + scheduleDaejeonToSeoul.scheduleStops().get(1).getStation().getStationName()); + } + + @Test + @DisplayName("멤버번호로 예약 목록 조회 시 만료된 예약을 제외하고 조회에 성공한다") + void memberNoAndExpiredReservation_getReservations_success() { + // given + String memberNo = member.getMemberDetail().getMemberNo(); + + Train train = trainTestHelper.createKTX(); + TrainScheduleWithStopStations scheduleBusanToDongDaegu = trainScheduleTestHelper.createCustomSchedule() + .scheduleName("커스텀 노선 - 부산에서 동대구") + .operationDate(LocalDate.now()) + .train(train) + .addStop("부산", null, LocalTime.of(5, 0)) + .addStop("동대구", LocalTime.of(8, 0), null) + .build(); + + TrainScheduleWithStopStations scheduleDaejeonToSeoul = trainScheduleTestHelper.createCustomSchedule() + .scheduleName("커스텀 노선 - 대전에서 서울") + .operationDate(LocalDate.now()) + .train(train) + .addStop("대전", null, LocalTime.of(10, 0)) + .addStop("서울", LocalTime.of(12, 0), null) + .build(); + + Reservation reservation1 = Reservation.builder() + .trainSchedule(scheduleBusanToDongDaegu.trainSchedule()) + .member(member) + .reservationCode("20250806100001D49J") + .tripType(TripType.OW) + .totalPassengers(1) + .passengerSummary("[{\"passengerType\":\"ADULT\",\"count\":1}]") + .reservationStatus(ReservationStatus.RESERVED) + .expiresAt(LocalDateTime.now().minusMinutes(10)) + .fare(50000) + .departureStop(scheduleBusanToDongDaegu.scheduleStops().get(0)) + .arrivalStop(scheduleBusanToDongDaegu.scheduleStops().get(1)) + .build(); + Reservation reservation2 = reservationTestHelper.createReservation(member, scheduleDaejeonToSeoul); + Reservation entity1 = reservationRepository.save(reservation1); + Reservation entity2 = reservationRepository.save(reservation2); + + // when + List result = reservationService.getReservations(memberNo); + + // then + assertThat(result.size()).isEqualTo(1); + ReservationDetail result1 = result.get(0); + + assertThat(result1.reservationId()).isEqualTo(entity2.getId()); + assertThat(result1.reservationCode()).isEqualTo(reservation2.getReservationCode()); + assertThat(result1.departureStationName()).isEqualTo( + scheduleDaejeonToSeoul.scheduleStops().get(0).getStation().getStationName()); + assertThat(result1.arrivalStationName()).isEqualTo( + scheduleDaejeonToSeoul.scheduleStops().get(1).getStation().getStationName()); + } + + @Test + @DisplayName("올바른 예약 삭제 요청 DTO로 예약 삭제에 성공한다") + void validRequestDto_deleteReservation_success() { + // given + Train train = trainTestHelper.createKTX(); + TrainScheduleWithStopStations schedule = trainScheduleTestHelper.createSchedule(train); + Reservation reservation = reservationTestHelper.createReservation(member, schedule); + Reservation entity = reservationRepository.save(reservation); + ReservationDeleteRequest request = new ReservationDeleteRequest(entity.getId()); + + // when + reservationService.deleteReservation(request); + + // then + List result = reservationRepository.findAll(); + assertThat(result.size()).isEqualTo(0); + } + + @Test + @DisplayName("만료된 예약 일괄삭제에 성공한다") + void expireReservations_success() { + // given + Reservation reservation = Reservation.builder() + .trainSchedule(schedule.trainSchedule()) + .member(member) + .reservationCode("20250806100001D49J") + .tripType(TripType.OW) + .totalPassengers(1) + .passengerSummary("[{\"passengerType\":\"ADULT\",\"count\":1}]") + .reservationStatus(ReservationStatus.RESERVED) + .expiresAt(LocalDateTime.now().minusMinutes(10)) + .fare(50000) + .departureStop(schedule.scheduleStops().get(0)) + .arrivalStop(schedule.scheduleStops().get(1)) + .build(); + for (int i = 0; i < 3; i++) { + reservationRepository.save(reservation); + } + + // when + reservationService.expireReservations(); + + // then + List result = reservationRepository.findAll(); + assertThat(result.size()).isEqualTo(0); + } } diff --git a/src/test/java/com/sudo/railo/booking/application/SeatReservationServiceTest.java b/src/test/java/com/sudo/railo/booking/application/SeatReservationServiceTest.java new file mode 100644 index 00000000..44ed259f --- /dev/null +++ b/src/test/java/com/sudo/railo/booking/application/SeatReservationServiceTest.java @@ -0,0 +1,159 @@ +package com.sudo.railo.booking.application; + +import static org.assertj.core.api.Assertions.*; + +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 com.sudo.railo.booking.domain.Reservation; +import com.sudo.railo.booking.domain.SeatReservation; +import com.sudo.railo.booking.domain.status.ReservationStatus; +import com.sudo.railo.booking.domain.type.PassengerType; +import com.sudo.railo.booking.domain.type.TripType; +import com.sudo.railo.booking.infrastructure.SeatReservationRepository; +import com.sudo.railo.booking.infrastructure.reservation.ReservationRepository; +import com.sudo.railo.member.domain.Member; +import com.sudo.railo.member.infrastructure.MemberRepository; +import com.sudo.railo.support.annotation.ServiceTest; +import com.sudo.railo.support.fixture.MemberFixture; +import com.sudo.railo.support.helper.TrainScheduleTestHelper; +import com.sudo.railo.support.helper.TrainTestHelper; +import com.sudo.railo.train.domain.Seat; +import com.sudo.railo.train.domain.Train; +import com.sudo.railo.train.domain.TrainSchedule; +import com.sudo.railo.train.domain.type.CarType; + +import lombok.extern.slf4j.Slf4j; + +@ServiceTest +@Slf4j +class SeatReservationServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private ReservationRepository reservationRepository; + + @Autowired + private SeatReservationService seatReservationService; + + @Autowired + private SeatReservationRepository seatReservationRepository; + + @Autowired + private TrainTestHelper trainTestHelper; + + @Autowired + private TrainScheduleTestHelper trainScheduleTestHelper; + + private Reservation reservation; + private Seat seat1, seat2; + private PassengerType passengerType1, passengerType2; + + @BeforeEach + void setup() { + Member member = MemberFixture.createStandardMember(); + memberRepository.save(member); + Train train = trainTestHelper.createKTX(); + TrainScheduleTestHelper.TrainScheduleWithStopStations schedule = trainScheduleTestHelper.createSchedule(train); + Reservation reservation = Reservation.builder() + .trainSchedule(schedule.trainSchedule()) + .member(member) + .reservationCode("20250806100001D49J") + .tripType(TripType.OW) + .totalPassengers(1) + .passengerSummary("[{\"passengerType\":\"CHILD\",\"count\":1},{\"passengerType\":\"VETERAN\",\"count\":1}]") + .reservationStatus(ReservationStatus.RESERVED) + .expiresAt(LocalDateTime.now().plusMinutes(10)) + .fare(50000) + .departureStop(schedule.scheduleStops().get(0)) + .arrivalStop(schedule.scheduleStops().get(1)) + .build(); + this.reservation = reservationRepository.save(reservation); + List seats = trainTestHelper.getSeats(train, CarType.STANDARD, 2); + seat1 = seats.get(0); + seat2 = seats.get(1); + passengerType1 = PassengerType.CHILD; + passengerType2 = PassengerType.VETERAN; + } + + @Test + @DisplayName("예약, 좌석, 승객 유형으로 좌석 예약 생성에 성공한다") + void reservationAndSeatAndPassengerType_reserveNewSeat_success() { + // when + SeatReservation entity = seatReservationService.reserveNewSeat(reservation, seat1, passengerType1); + + // then + assertThat(entity.getReservation().getReservationCode()).isEqualTo(reservation.getReservationCode()); + assertThat(entity.getPassengerType()).isEqualTo(passengerType1); + } + + @Test + @DisplayName("좌석 예약 ID로 좌석 예약 삭제에 성공한다") + void seatReservationId_deleteSeatReservation_success() { + // given + Train train = trainTestHelper.createKTX(); + TrainSchedule trainSchedule = trainScheduleTestHelper.createSchedule(train).trainSchedule(); + + SeatReservation seatReservation1 = SeatReservation.builder() + .trainSchedule(trainSchedule) + .seat(seat1) + .reservation(reservation) + .passengerType(passengerType1) + .build(); + SeatReservation entity1 = seatReservationRepository.save(seatReservation1); + + SeatReservation seatReservation2 = SeatReservation.builder() + .trainSchedule(trainSchedule) + .seat(seat2) + .reservation(reservation) + .passengerType(passengerType2) + .build(); + SeatReservation entity2 = seatReservationRepository.save(seatReservation2); + + // when + seatReservationService.deleteSeatReservation(entity1.getId()); + + // then + List result = seatReservationRepository.findAll(); + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(0).getPassengerType()).isEqualTo(passengerType2); + } + + @Test + @DisplayName("예약 ID로 좌석 예약 삭제에 성공한다") + void reservationId_deleteSeatReservation_success() { + // given + Train train = trainTestHelper.createKTX(); + TrainSchedule trainSchedule = trainScheduleTestHelper.createSchedule(train).trainSchedule(); + + SeatReservation seatReservation1 = SeatReservation.builder() + .trainSchedule(trainSchedule) + .seat(seat1) + .reservation(reservation) + .passengerType(passengerType1) + .build(); + SeatReservation entity1 = seatReservationRepository.save(seatReservation1); + + SeatReservation seatReservation2 = SeatReservation.builder() + .trainSchedule(trainSchedule) + .seat(seat2) + .reservation(reservation) + .passengerType(passengerType2) + .build(); + SeatReservation entity2 = seatReservationRepository.save(seatReservation2); + + // when + seatReservationService.deleteSeatReservationByReservationId(reservation.getId()); + + // then + List result = seatReservationRepository.findAll(); + assertThat(result.size()).isEqualTo(0); + } +} diff --git a/src/test/java/com/sudo/railo/booking/application/TicketServiceTest.java b/src/test/java/com/sudo/railo/booking/application/TicketServiceTest.java new file mode 100644 index 00000000..5e5c51b6 --- /dev/null +++ b/src/test/java/com/sudo/railo/booking/application/TicketServiceTest.java @@ -0,0 +1,206 @@ +package com.sudo.railo.booking.application; + +import static org.assertj.core.api.Assertions.*; + +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 com.sudo.railo.booking.application.dto.response.TicketReadResponse; +import com.sudo.railo.booking.domain.Qr; +import com.sudo.railo.booking.domain.Reservation; +import com.sudo.railo.booking.domain.Ticket; +import com.sudo.railo.booking.domain.status.ReservationStatus; +import com.sudo.railo.booking.domain.status.TicketStatus; +import com.sudo.railo.booking.domain.type.PassengerType; +import com.sudo.railo.booking.domain.type.TripType; +import com.sudo.railo.booking.infrastructure.QrRepository; +import com.sudo.railo.booking.infrastructure.reservation.ReservationRepository; +import com.sudo.railo.booking.infrastructure.ticket.TicketRepository; +import com.sudo.railo.member.domain.Member; +import com.sudo.railo.member.infrastructure.MemberRepository; +import com.sudo.railo.support.annotation.ServiceTest; +import com.sudo.railo.support.fixture.MemberFixture; +import com.sudo.railo.support.helper.TrainScheduleTestHelper; +import com.sudo.railo.support.helper.TrainTestHelper; +import com.sudo.railo.train.domain.Seat; +import com.sudo.railo.train.domain.Train; +import com.sudo.railo.train.domain.type.CarType; + +import lombok.extern.slf4j.Slf4j; + +@ServiceTest +@Slf4j +class TicketServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private ReservationRepository reservationRepository; + + @Autowired + private TicketRepository ticketRepository; + + @Autowired + private QrRepository qrRepository; + + @Autowired + private TicketService ticketService; + + @Autowired + private TrainTestHelper trainTestHelper; + + @Autowired + private TrainScheduleTestHelper trainScheduleTestHelper; + + private Reservation reservation; + private Seat seat1, seat2; + private PassengerType passengerType1, passengerType2; + + @BeforeEach + void setup() { + Member member = MemberFixture.createStandardMember(); + memberRepository.save(member); + Train train = trainTestHelper.createKTX(); + TrainScheduleTestHelper.TrainScheduleWithStopStations schedule = trainScheduleTestHelper.createSchedule(train); + Reservation reservation = Reservation.builder() + .trainSchedule(schedule.trainSchedule()) + .member(member) + .reservationCode("20250806100001D49J") + .tripType(TripType.OW) + .totalPassengers(1) + .passengerSummary("[{\"passengerType\":\"CHILD\",\"count\":1},{\"passengerType\":\"VETERAN\",\"count\":1}]") + .reservationStatus(ReservationStatus.RESERVED) + .expiresAt(LocalDateTime.now().plusMinutes(10)) + .fare(50000) + .departureStop(schedule.scheduleStops().get(0)) + .arrivalStop(schedule.scheduleStops().get(1)) + .build(); + this.reservation = reservationRepository.save(reservation); + List seats = trainTestHelper.getSeats(train, CarType.STANDARD, 2); + seat1 = seats.get(0); + seat2 = seats.get(1); + + passengerType1 = PassengerType.CHILD; + passengerType2 = PassengerType.VETERAN; + } + + @Test + @DisplayName("예약, 좌석, 승객 유형으로 티켓 생성에 성공한다") + void reservationAndSeatAndPassengerType_createTicket_success() { + // when + ticketService.createTicket(reservation, seat1, passengerType1); + + // then + List result = ticketRepository.findAll(); + assertThat(result.size()).isEqualTo(1); + Ticket resultItem = result.get(0); + assertThat(resultItem.getTicketStatus()).isEqualTo(TicketStatus.ISSUED); + } + + @Test + @DisplayName("멤버번호로 가지고 있는 티켓 조회에 성공한다") + void memberNo_getMyTickets_success() { + // given + Qr qr1 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + Qr qr2 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + + Ticket ticket1 = Ticket.builder() + .seat(seat1) + .reservation(reservation) + .qr(qr1) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType1) + .build(); + ticketRepository.save(ticket1); + + Ticket ticket2 = Ticket.builder() + .seat(seat2) + .reservation(reservation) + .qr(qr2) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType2) + .build(); + ticketRepository.save(ticket2); + String memberNo = reservation.getMember().getMemberDetail().getMemberNo(); + + // when + List result = ticketService.getMyTickets(memberNo); + + // then + assertThat(result.size()).isEqualTo(2); + } + + @Test + @DisplayName("티켓 ID로 티켓 삭제에 성공한다") + void ticketId_deleteTicket_success() { + // given + Qr qr1 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + Qr qr2 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + + Ticket ticket1 = Ticket.builder() + .seat(seat1) + .reservation(reservation) + .qr(qr1) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType1) + .build(); + Ticket entity1 = ticketRepository.save(ticket1); + + Ticket ticket2 = Ticket.builder() + .seat(seat2) + .reservation(reservation) + .qr(qr2) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType2) + .build(); + Ticket entity2 = ticketRepository.save(ticket2); + + // when + ticketService.deleteTicketById(entity1.getId()); + + // then + List result = ticketRepository.findAll(); + assertThat(result.size()).isEqualTo(1); + Ticket resultItem = result.get(0); + assertThat(resultItem.getPassengerType()).isEqualTo(entity2.getPassengerType()); + } + + @Test + @DisplayName("예약 ID로 티켓 삭제에 성공한다") + void reservationId_deleteTicket_success() { + // given + Qr qr1 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + Qr qr2 = qrRepository.save(Qr.builder().isUsable(true).scanCount(0).build()); + + Ticket ticket1 = Ticket.builder() + .seat(seat1) + .reservation(reservation) + .qr(qr1) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType1) + .build(); + ticketRepository.save(ticket1); + + Ticket ticket2 = Ticket.builder() + .seat(seat2) + .reservation(reservation) + .qr(qr2) + .ticketStatus(TicketStatus.ISSUED) + .passengerType(passengerType2) + .build(); + ticketRepository.save(ticket2); + + // when + ticketService.deleteTicketByReservationId(reservation.getId()); + + // then + List result = ticketRepository.findAll(); + assertThat(result.size()).isEqualTo(0); + } +}