From 3ea3b88b1f63cea348d5e45f3458b52621c5c099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=B0=BD=ED=98=84?= Date: Mon, 4 Jul 2022 18:35:01 +0900 Subject: [PATCH] Feature/get movie time list (#46) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: MovieTimeRepository - findValidMovieTimes 네이티브 쿼리 -> JPQL 변경 * refactor: MovieTimeServiceImpl JPQL 적용 - movie.getId() -> movie * feat: MovieTimeServiceImplTest - get movie times 케이스 작성 * refactor: MovieServiceImplTest - static factory method 적용 * feat: MovieTimeServiceImplTest - get movie time list 케이스 작성 --- .../server/movie/domain/MovieTime.java | 4 ++ .../repository/MovieTimeRepository.java | 14 ++--- .../movie/service/MovieTimeServiceImpl.java | 2 +- .../movie/service/dto/MovieTimeDto.java | 2 +- .../movie/service/MovieServiceImplTest.java | 8 ++- .../service/MovieTimeServiceImplTest.java | 61 +++++++++++++++++-- 6 files changed, 75 insertions(+), 16 deletions(-) diff --git a/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java b/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java index feb93a8..55ee161 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java @@ -7,10 +7,14 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter +@NoArgsConstructor +@AllArgsConstructor public class MovieTime extends AbstractEntity { @NotNull diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java index 8f65553..d7d668b 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java @@ -1,5 +1,6 @@ package com.ticketing.server.movie.domain.repository; +import com.ticketing.server.movie.domain.Movie; import com.ticketing.server.movie.domain.MovieTime; import java.time.LocalDateTime; import java.util.List; @@ -10,12 +11,11 @@ import org.springframework.stereotype.Repository; @Repository public interface MovieTimeRepository extends JpaRepository { - @Query(value = "SELECT * " - + "FROM movie_time " - + "WHERE movie_id = :movieId " - + "AND start_at " - + "BETWEEN date_format(start_at, :startOfDay) " - + "AND date_format(start_at, :endOfDay)", nativeQuery = true) - List findValidMovieTimes(long movieId, LocalDateTime startOfDay, LocalDateTime endOfDay); + @Query(value = "SELECT mt " + + "FROM MovieTime mt " + + "JOIN FETCH mt.movie " + + "WHERE mt.movie = :movie " + + "AND mt.startAt BETWEEN :startOfDay AND :endOfDay ") + List findValidMovieTimes(Movie movie, LocalDateTime startOfDay, LocalDateTime endOfDay); } diff --git a/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java b/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java index ef5767c..18631c0 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java +++ b/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java @@ -34,7 +34,7 @@ public class MovieTimeServiceImpl implements MovieTimeService { LocalDateTime startOfDay = runningDate.atStartOfDay().plusHours(6); LocalDateTime endOfDay = startOfDay.plusDays(1); - List movieTimes = movieTimeRepository.findValidMovieTimes(movie.getId(), startOfDay, endOfDay); + List movieTimes = movieTimeRepository.findValidMovieTimes(movie, startOfDay, endOfDay); return movieTimes.stream() .map(MovieTimeDto::from) diff --git a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java index a0543cb..e8832c4 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java +++ b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java @@ -10,7 +10,7 @@ import lombok.Getter; @AllArgsConstructor(access = AccessLevel.PRIVATE) public class MovieTimeDto { - private long movieTimeId; + private Long movieTimeId; private Integer theaterNumber; diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java index 1c98e32..4f500f6 100644 --- a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java +++ b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java @@ -35,7 +35,8 @@ public class MovieServiceImplTest { @DisplayName("Movie Service Test - get movies when there is no movie") void shouldGetEmptyList() { // given - when(movieRepository.findValidMovies()).thenReturn(Collections.emptyList()); + when(movieRepository.findValidMovies()) + .thenReturn(Collections.emptyList()); // when List movieDtoList = movieService.getMovies(); @@ -49,11 +50,12 @@ public class MovieServiceImplTest { void shouldAbleToGetMovies() { // given movie = new Movie("범죄도시2", 106); - movieDto = movie.toDto(); + movieDto = movieDto.from(movie); movies.add(movie); movieDtos.add(movieDto); - when(movieRepository.findValidMovies()).thenReturn(movies); + when(movieRepository.findValidMovies()) + .thenReturn(movies); // when List movieDtoList = movieService.getMovies(); diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java index b2dd6cc..b5ee570 100644 --- a/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java +++ b/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java @@ -1,21 +1,36 @@ package com.ticketing.server.movie.service; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.any; + +import com.ticketing.server.movie.domain.Movie; +import com.ticketing.server.movie.domain.MovieTime; +import com.ticketing.server.movie.domain.Theater; +import com.ticketing.server.movie.domain.repository.MovieRepository; import com.ticketing.server.movie.domain.repository.MovieTimeRepository; +import com.ticketing.server.movie.service.dto.MovieTimeDto; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.annotation.Rollback; @ExtendWith(MockitoExtension.class) public class MovieTimeServiceImplTest { - LocalDateTime startOfDay = LocalDate.now().atStartOfDay().plusHours(6); - LocalDateTime endOfDay = startOfDay.plusDays(1); + String title = "범죄도시2"; + List movieTimes = new ArrayList<>(); + + @Mock + MovieRepository movieRepository; @Mock MovieTimeRepository movieTimeRepository; @@ -24,10 +39,48 @@ public class MovieTimeServiceImplTest { MovieTimeServiceImpl movieTimeService; @Test - @Rollback @DisplayName("MovieTime Service Test - get empty list when there is no valid movie times") void shouldGetEmptyList() { + // given + Movie movie = new Movie(title, 106); + when(movieRepository.findByTitle(title)) + .thenReturn(Optional.of(movie)); + + when(movieTimeRepository.findValidMovieTimes(any(), any(), any())) + .thenReturn(Collections.emptyList()); + + // when + List movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.now()); + + // then + assertTrue(movieTimeDtoList.isEmpty()); + } + + @Test + @DisplayName("MovieTime Service Test - get list when there is valid movie times") + void shouldGetMovieTimeList() { + // given + Movie movie = new Movie(title, 106); + Theater theater = new Theater(1, 100); + MovieTime movieTime = new MovieTime(movie, theater, 1, + LocalDateTime.of(2022, 7, 1, 17, 0, 0), + LocalDateTime.of(2022, 7, 1, 18, 56, 0) + ); + + movieTimes.add(movieTime); + + when(movieRepository.findByTitle(title)) + .thenReturn(Optional.of(movie)); + + when(movieTimeRepository.findValidMovieTimes(any(), any(), any())) + .thenReturn(movieTimes); + + // when + List movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.of(2022, 07, 01)); + + // then + assertTrue(!movieTimeDtoList.isEmpty()); } }