diff --git a/src/test/java/com/dizio1/watchvault/movie/application/usecase/SearchMovieUseCaseImplTest.java b/src/test/java/com/dizio1/watchvault/movie/application/usecase/SearchMovieUseCaseImplTest.java index 26d5095..891e0ae 100644 --- a/src/test/java/com/dizio1/watchvault/movie/application/usecase/SearchMovieUseCaseImplTest.java +++ b/src/test/java/com/dizio1/watchvault/movie/application/usecase/SearchMovieUseCaseImplTest.java @@ -2,6 +2,7 @@ import com.dizio1.watchvault.genre.domain.model.Genre; import com.dizio1.watchvault.movie.application.ports.out.MovieCatalogPort; +import com.dizio1.watchvault.movie.domain.exception.MovieNotFoundException; import com.dizio1.watchvault.movie.domain.model.CrewMember; import com.dizio1.watchvault.movie.domain.model.Movie; import org.junit.jupiter.api.Test; @@ -13,7 +14,8 @@ import java.time.LocalDate; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -32,7 +34,7 @@ public void searchMovie_givenExistingMovie_returnsMovieWithDirector() { movie.setGenres(List.of(new Genre(1L, "Drama"), new Genre(2L, "Comedy"))); movie.setRuntime(121); movie.setReleaseDate(LocalDate.of(2009, 11, 20)); - movie.setOverview("Uma Thurman feet"); + movie.setOverview("Uma Thurman dance"); movie.setTitle("Pulp Fiction"); CrewMember tarantino = new CrewMember(1L, @@ -62,4 +64,47 @@ public void searchMovie_givenExistingMovie_returnsMovieWithDirector() { verify(movieCatalog).searchCrewMembers(movie.getTitle()); verify(movieCatalog).searchByTitle(movie.getTitle()); } + + @Test + public void searchMovie_givenNonExistingMovie_throwsMovieNotFoundException() { + String title = "Unexisting movie"; + + when(movieCatalog.searchByTitle(title)).thenThrow(MovieNotFoundException.class); + + assertThrows(MovieNotFoundException.class, () -> searchMovieUseCaseImpl.searchMovie(title)); + + verify(movieCatalog).searchByTitle(title); + verify(movieCatalog).searchCrewMembers(any()); + } + + @Test + public void searchMovie_givenNoDirector_setsDirectorToNull() { + Movie movie = new Movie(); + movie.setId(1L); + movie.setDirectedBy("Quentin Tarantino"); + movie.setGenres(List.of(new Genre(1L, "Drama"), new Genre(2L, "Comedy"))); + movie.setRuntime(121); + movie.setReleaseDate(LocalDate.of(2009, 11, 20)); + movie.setOverview("Uma Thurman dance"); + movie.setTitle("Pulp Fiction"); + + CrewMember crewMember = new CrewMember(2L, + "John Doe", + 1, + "Make up", + "Make Up Artist"); + + when(movieCatalog.searchByTitle(movie.getTitle())).thenReturn(movie); + when(movieCatalog.searchCrewMembers(movie.getTitle())).thenReturn(List.of(crewMember)); + + Movie result = searchMovieUseCaseImpl.searchMovie(movie.getTitle()); + + assertNull(result.getDirectedBy()); + assertEquals(movie.getTitle(), result.getTitle()); + assertEquals(movie.getGenres(), result.getGenres()); + assertEquals(movie.getId(), result.getId()); + assertEquals(movie.getReleaseDate(), result.getReleaseDate()); + assertEquals(movie.getOverview(), result.getOverview()); + assertEquals(movie.getRuntime(), result.getRuntime()); + } } diff --git a/src/test/java/com/dizio1/watchvault/review/application/usecase/CreateReviewUseCaseImplTest.java b/src/test/java/com/dizio1/watchvault/review/application/usecase/CreateReviewUseCaseImplTest.java new file mode 100644 index 0000000..a22027b --- /dev/null +++ b/src/test/java/com/dizio1/watchvault/review/application/usecase/CreateReviewUseCaseImplTest.java @@ -0,0 +1,248 @@ +package com.dizio1.watchvault.review.application.usecase; + +import com.dizio1.watchvault.genre.domain.model.Genre; +import com.dizio1.watchvault.movie.application.ports.out.MovieCatalogPort; +import com.dizio1.watchvault.movie.application.ports.out.MovieRepositoryPort; +import com.dizio1.watchvault.movie.domain.model.Movie; +import com.dizio1.watchvault.review.application.ports.out.ReviewRepositoryPort; +import com.dizio1.watchvault.review.domain.model.Review; +import com.dizio1.watchvault.review.domain.model.ShowType; +import com.dizio1.watchvault.series.application.ports.out.SeriesCatalogPort; +import com.dizio1.watchvault.series.application.ports.out.SeriesRepositoryPort; +import com.dizio1.watchvault.series.domain.model.Series; +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 java.time.LocalDate; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class CreateReviewUseCaseImplTest { + + @Mock + private ReviewRepositoryPort reviewRepository; + @Mock + private SeriesRepositoryPort seriesRepository; + @Mock + private MovieRepositoryPort movieRepository; + @Mock + private MovieCatalogPort movieCatalog; + @Mock + private SeriesCatalogPort seriesCatalog; + + @InjectMocks + private CreateReviewUseCaseImpl createReviewUseCase; + + @Test + public void createReview_givenExistingSeries_returnsReview() { + Review review = new Review(); + review.setShowType(ShowType.SERIES); + review.setTitle("Breaking Bad"); + review.setId(null); + review.setShowId(1L); + review.setDescription("The one who knocks"); + review.setRating(10); + review.setReviewedAt(LocalDate.now()); + + Review registered = new Review(); + registered.setShowType(ShowType.SERIES); + registered.setTitle("Breaking Bad"); + registered.setId(1L); + registered.setShowId(1L); + registered.setDescription("The one who knocks"); + registered.setRating(10); + registered.setReviewedAt(LocalDate.now()); + + Series series = new Series(); + series.setId(1L); + series.setTitle("Breaking Bad"); + series.setGenres(List.of(new Genre(1L, "Drama"), new Genre(2L, "Crimen"))); + series.setEpisodes(62); + series.setSeasons(5); + series.setFirstAirDate(LocalDate.of(2008, 1, 20)); + series.setLastAirDate(LocalDate.of(2013, 9, 29)); + series.setCreatedBy("Vince Gilligan"); + series.setOverview("Private Domicile Bitch"); + series.setStatus("Ended"); + + when(seriesCatalog.searchByTitle(series.getTitle())).thenReturn(series); + when(seriesRepository.existsById(series.getId())).thenReturn(true); + when(reviewRepository.registerReview(review)).thenReturn(registered); + + Review result = createReviewUseCase.createReview(review); + + assertEquals(registered.getId(), result.getId()); + assertEquals(registered.getTitle(), result.getTitle()); + assertEquals(registered.getReviewedAt(), result.getReviewedAt()); + assertEquals(registered.getRating(), result.getRating()); + assertEquals(registered.getShowType(), result.getShowType()); + assertEquals(registered.getDescription(), result.getDescription()); + assertEquals(registered.getShowId(), result.getShowId()); + + verify(seriesCatalog).searchByTitle(series.getTitle()); + verify(seriesRepository).existsById(1L); + verify(seriesRepository, never()).registerSeries(series); + verify(reviewRepository).registerReview(review); + verify(movieCatalog, never()).searchByTitle(any()); + } + + @Test + public void createReview_givenNonExistingSeries_returnsReview() { + Review review = new Review(); + review.setShowType(ShowType.SERIES); + review.setTitle("Breaking Bad"); + review.setId(null); + review.setShowId(1L); + review.setDescription("The one who knocks"); + review.setRating(10); + review.setReviewedAt(LocalDate.now()); + + Review registered = new Review(); + registered.setShowType(ShowType.SERIES); + registered.setTitle("Breaking Bad"); + registered.setId(1L); + registered.setShowId(1L); + registered.setDescription("The one who knocks"); + registered.setRating(10); + registered.setReviewedAt(LocalDate.now()); + + Series series = new Series(); + series.setId(1L); + series.setTitle("Breaking Bad"); + series.setGenres(List.of(new Genre(1L, "Drama"), new Genre(2L, "Crimen"))); + series.setEpisodes(62); + series.setSeasons(5); + series.setFirstAirDate(LocalDate.of(2008, 1, 20)); + series.setLastAirDate(LocalDate.of(2013, 9, 29)); + series.setCreatedBy("Vince Gilligan"); + series.setOverview("Private Domicile Bitch"); + series.setStatus("Ended"); + + when(seriesCatalog.searchByTitle(series.getTitle())).thenReturn(series); + when(seriesRepository.existsById(series.getId())).thenReturn(false); + when(seriesRepository.registerSeries(series)).thenReturn(series); + when(reviewRepository.registerReview(review)).thenReturn(registered); + + Review result = createReviewUseCase.createReview(review); + + assertEquals(registered.getId(), result.getId()); + assertEquals(registered.getTitle(), result.getTitle()); + assertEquals(registered.getReviewedAt(), result.getReviewedAt()); + assertEquals(registered.getRating(), result.getRating()); + assertEquals(registered.getShowType(), result.getShowType()); + assertEquals(registered.getDescription(), result.getDescription()); + assertEquals(registered.getShowId(), result.getShowId()); + + verify(seriesCatalog).searchByTitle(series.getTitle()); + verify(seriesRepository).existsById(series.getId()); + verify(reviewRepository).registerReview(review); + verify(seriesRepository).registerSeries(series); + verify(movieCatalog, never()).searchByTitle(any()); + } + + @Test + public void createReview_givenExistingMovie_returnsReview() { + Movie movie = new Movie(); + movie.setId(1L); + movie.setTitle("The Godfather"); + movie.setRuntime(175); + movie.setGenres(List.of(new Genre(1L, "Crime"), new Genre(2L, "Drama"))); + movie.setOverview("Vito Corleone"); + movie.setReleaseDate(LocalDate.of(1972, 3, 15)); + movie.setDirectedBy("Francis Ford Coppola"); + + Review review = new Review(); + review.setShowType(ShowType.MOVIE); + review.setTitle("The Godfather"); + review.setId(null); + review.setShowId(1L); + review.setDescription("MASTERPIECE"); + review.setRating(10); + review.setReviewedAt(LocalDate.now()); + + Review registered = new Review(); + registered.setShowType(ShowType.MOVIE); + registered.setTitle("The Godfather"); + registered.setId(1L); + registered.setShowId(1L); + registered.setDescription("MASTERPIECE"); + registered.setRating(10); + registered.setReviewedAt(LocalDate.now()); + + when(movieCatalog.searchByTitle(movie.getTitle())).thenReturn(movie); + when(movieRepository.existsById(movie.getId())).thenReturn(true); + when(reviewRepository.registerReview(review)).thenReturn(registered); + + Review result = createReviewUseCase.createReview(review); + + assertEquals(registered.getShowId(), result.getShowId()); + assertEquals(registered.getId(), result.getId()); + assertEquals(registered.getRating(), result.getRating()); + assertEquals(registered.getReviewedAt(), result.getReviewedAt()); + assertEquals(registered.getDescription(), result.getDescription()); + assertEquals(registered.getTitle(), result.getTitle()); + assertEquals(registered.getShowType(), result.getShowType()); + + verify(movieCatalog).searchByTitle(movie.getTitle()); + verify(movieRepository).existsById(movie.getId()); + verify(movieRepository, never()).registerMovie(any(Movie.class)); + verify(reviewRepository).registerReview(review); + } + + @Test + public void createReview_givenNonExistingMovie_returnsReview() { + Movie movie = new Movie(); + movie.setId(1L); + movie.setTitle("The Godfather"); + movie.setRuntime(175); + movie.setGenres(List.of(new Genre(1L, "Crime"), new Genre(2L, "Drama"))); + movie.setOverview("Vito Corleone"); + movie.setReleaseDate(LocalDate.of(1972, 3, 15)); + movie.setDirectedBy("Francis Ford Coppola"); + + Review review = new Review(); + review.setShowType(ShowType.MOVIE); + review.setTitle("The Godfather"); + review.setId(null); + review.setShowId(1L); + review.setDescription("MASTERPIECE"); + review.setRating(10); + review.setReviewedAt(LocalDate.now()); + + Review registered = new Review(); + registered.setShowType(ShowType.MOVIE); + registered.setTitle("The Godfather"); + registered.setId(1L); + registered.setShowId(1L); + registered.setDescription("MASTERPIECE"); + registered.setRating(10); + registered.setReviewedAt(LocalDate.now()); + + when(movieCatalog.searchByTitle(movie.getTitle())).thenReturn(movie); + when(movieRepository.existsById(movie.getId())).thenReturn(false); + when(movieRepository.registerMovie(movie)).thenReturn(movie); + when(reviewRepository.registerReview(review)).thenReturn(registered); + + Review result = createReviewUseCase.createReview(review); + + assertEquals(registered.getShowId(), result.getShowId()); + assertEquals(registered.getId(), result.getId()); + assertEquals(registered.getRating(), result.getRating()); + assertEquals(registered.getReviewedAt(), result.getReviewedAt()); + assertEquals(registered.getDescription(), result.getDescription()); + assertEquals(registered.getTitle(), result.getTitle()); + assertEquals(registered.getShowType(), result.getShowType()); + + verify(movieCatalog).searchByTitle(movie.getTitle()); + verify(movieRepository).existsById(movie.getId()); + verify(movieRepository).registerMovie(movie); + verify(reviewRepository).registerReview(review); + } +} diff --git a/src/test/java/com/dizio1/watchvault/series/application/usecase/SearchSeriesUseCaseImplTest.java b/src/test/java/com/dizio1/watchvault/series/application/usecase/SearchSeriesUseCaseImplTest.java new file mode 100644 index 0000000..1c09f84 --- /dev/null +++ b/src/test/java/com/dizio1/watchvault/series/application/usecase/SearchSeriesUseCaseImplTest.java @@ -0,0 +1,71 @@ +package com.dizio1.watchvault.series.application.usecase; + +import com.dizio1.watchvault.genre.domain.model.Genre; +import com.dizio1.watchvault.series.application.ports.out.SeriesCatalogPort; +import com.dizio1.watchvault.series.domain.exception.SeriesNotFoundException; +import com.dizio1.watchvault.series.domain.model.Series; +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 java.time.LocalDate; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class SearchSeriesUseCaseImplTest { + + @Mock + private SeriesCatalogPort seriesCatalog; + @InjectMocks + private SearchSeriesUseCaseImpl searchSeriesUseCase; + + @Test + public void searchByTitle_givenNonExistingSeries_returnsSeries() { + Series series = new Series(); + series.setId(1L); + series.setTitle("Breaking Bad"); + series.setGenres(List.of(new Genre(1L, "Drama"), new Genre(2L, "Crimen"))); + series.setEpisodes(62); + series.setSeasons(5); + series.setFirstAirDate(LocalDate.of(2008, 1, 20)); + series.setLastAirDate(LocalDate.of(2013, 9, 29)); + series.setCreatedBy("Vince Gilligan"); + series.setOverview("Private Domicile Bitch"); + series.setStatus("Ended"); + + when(seriesCatalog.searchByTitle(series.getTitle())).thenReturn(series); + + Series result = searchSeriesUseCase.searchByTitle(series.getTitle()); + + assertEquals(series.getId(), result.getId()); + assertEquals(series.getTitle(), result.getTitle()); + assertEquals(series.getEpisodes(), result.getEpisodes()); + assertEquals(series.getGenres(), result.getGenres()); + assertEquals(series.getCreatedBy(), result.getCreatedBy()); + assertEquals(series.getFirstAirDate(), result.getFirstAirDate()); + assertEquals(series.getLastAirDate(), result.getLastAirDate()); + assertEquals(series.getOverview(), result.getOverview()); + assertEquals(series.getSeasons(), result.getSeasons()); + assertEquals(series.getStatus(), result.getStatus()); + + verify(seriesCatalog).searchByTitle(series.getTitle()); + } + + @Test + public void searchByTitle_givenNonExistingSeries_throwsSeriesNotFoundException() { + String title = "The Godfather"; + + when(searchSeriesUseCase.searchByTitle(title)).thenThrow(SeriesNotFoundException.class); + + assertThrows(SeriesNotFoundException.class, () -> searchSeriesUseCase.searchByTitle(title)); + + verify(seriesCatalog).searchByTitle(title); + } +}