From c509297f348078069a554882cbd97e2db65c7566 Mon Sep 17 00:00:00 2001 From: Marouane Addou <105064179+marouaneaddou@users.noreply.github.com> Date: Sun, 27 Sep 2026 11:58:15 +0000 Subject: [PATCH 1/3] feat(browse-movies): add tests for trending movies (#66) --- .../serviceImpl/MovieServiceImplTest.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java diff --git a/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java new file mode 100644 index 0000000..a53c284 --- /dev/null +++ b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* MovieServiceImplTest.java :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: marouan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/09/26 12:52:27 by marouan #+# #+# */ +/* Updated: 2026/09/27 12:52:53 by marouan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +package com.filmexa.stream.modules.moviesExternal.serviceImpl; + +import java.util.List; +import java.util.ArrayList; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.Mock; +import org.mockito.InjectMocks; +import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.when; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; + +import com.filmexa.stream.modules.moviesExternal.mapper.MovieMapper; +import com.filmexa.stream.modules.moviesExternal.client.MovieProvider; +import com.filmexa.stream.modules.moviesExternal.serviceImpl.MovieServiceImpl; +import com.filmexa.stream.modules.moviesExternal.dto.tmdb.MovieDetailsProviderResponse; +import com.filmexa.stream.modules.moviesExternal.dto.response.TrendingMoviesResponse; + +@ExtendWith(MockitoExtension.class) +public class MovieServiceImplTest { + + @Mock + private MovieProvider movieProvider; + + @Mock + private MovieMapper movieMapper; + + @InjectMocks + private MovieServiceImpl movieService; + + @Test + void shouldReturnThenTrendingMovies() { + // generate 20 movies returned from provider + List movies = new ArrayList<>(); + List genre_ids = new ArrayList<>(List.of(27,878,12)); + for ( Long i = 0L; i < 20; i++ ) { + movies.add( new MovieDetailsProviderResponse( + i, + "Resident Evil", + "2026-09-16", + "/pICoWjcKSet6sA3yzxOkP8ChwYI.jpg", + "/3icyRAqgakNcQn6aDVz9libFmBA.jpg", + "Bryan, un coursier médical, ...", + 7.318, + genre_ids, + false + )); + }; + when( movieProvider.getTrendingMovies("en")) + .thenReturn( movies ); + + List< TrendingMoviesResponse > trendingMovies = movieService.getTrendingMovies("en"); + assertEquals(10, trendingMovies.size() ); + assertThat( trendingMovies.get(0).getTitle() ).isEqualTo("Resident Evil"); + } +} From 6b345f25126e74616d921513727e339ab9caf8a5 Mon Sep 17 00:00:00 2001 From: Marouane Addou <105064179+marouaneaddou@users.noreply.github.com> Date: Sun, 27 Sep 2026 20:37:39 +0000 Subject: [PATCH 2/3] feat(browse-movies): add tests for get movies by genre (#66) --- .../serviceImpl/MovieServiceImplTest.java | 118 +++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java index a53c284..e172f7c 100644 --- a/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java +++ b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* MovieServiceImplTest.java :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: marouan +#+ +:+ +#+ */ +/* By: maddou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/09/26 12:52:27 by marouan #+# #+# */ -/* Updated: 2026/09/27 12:52:53 by marouan ### ########.fr */ +/* Updated: 2026/09/27 21:35:53 by maddou ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,20 +15,32 @@ import java.util.List; import java.util.ArrayList; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.PageRequest; + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.Mock; import org.mockito.InjectMocks; +import org.mockito.Spy; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.when; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.junit.jupiter.api.Assertions.assertThrows; import com.filmexa.stream.modules.moviesExternal.mapper.MovieMapper; import com.filmexa.stream.modules.moviesExternal.client.MovieProvider; import com.filmexa.stream.modules.moviesExternal.serviceImpl.MovieServiceImpl; import com.filmexa.stream.modules.moviesExternal.dto.tmdb.MovieDetailsProviderResponse; +import com.filmexa.stream.modules.moviesExternal.dto.tmdb.MoviesProviderData; import com.filmexa.stream.modules.moviesExternal.dto.response.TrendingMoviesResponse; +import com.filmexa.stream.modules.moviesExternal.dto.tmdb.TmdbMoviesPageableResponse; +import com.filmexa.stream.modules.moviesExternal.dto.response.MoviePageResponse; +import com.filmexa.stream.common.exception.InvalidPaginationException; +import com.filmexa.stream.common.exception.NotFoundException; @ExtendWith(MockitoExtension.class) public class MovieServiceImplTest { @@ -36,12 +48,15 @@ public class MovieServiceImplTest { @Mock private MovieProvider movieProvider; - @Mock + @Spy private MovieMapper movieMapper; @InjectMocks private MovieServiceImpl movieService; + @Value("${tmdb.base-image-url}") + private String imageBaseUrl; + @Test void shouldReturnThenTrendingMovies() { // generate 20 movies returned from provider @@ -63,8 +78,105 @@ void shouldReturnThenTrendingMovies() { when( movieProvider.getTrendingMovies("en")) .thenReturn( movies ); + // when( movieMapper.toMovieResponse( movies.get(0)) ). List< TrendingMoviesResponse > trendingMovies = movieService.getTrendingMovies("en"); assertEquals(10, trendingMovies.size() ); assertThat( trendingMovies.get(0).getTitle() ).isEqualTo("Resident Evil"); } + + @Test + void shouldReturnMoviesByGenre( ) { + Pageable pageable = PageRequest.of(0, 20); + + List movies = new ArrayList<>(); + for ( Long i = 0L; i < 20; i++ ) { + movies.add( new MoviesProviderData( + i, + "Spider-Man: Brand New Day", + "2026-07-29", + 7.864, + "/bjiS5ipwxb9JFy3XRRN4OAilSeX.jpg", + false + )); + }; + + TmdbMoviesPageableResponse prviderResult = new TmdbMoviesPageableResponse( + 1, + 500, + 10000, + movies + ); + + when( movieProvider.getMoviesByGenre("en", 28, 1) ) + .thenReturn( prviderResult ); + + MoviePageResponse response = movieService.getMoviesByGenre( "en", 28, pageable ); + assertThat(response).isNotNull(); + assertThat( response.getMovies() ) + .hasSize(20); + assertThat( response.getMovies().get(0).getTitle() ) + .isEqualTo("Spider-Man: Brand New Day"); + assertThat( response.getMovies().get(0).getThumbnail() ) + .isEqualTo( imageBaseUrl + "/bjiS5ipwxb9JFy3XRRN4OAilSeX.jpg" ); + + verify( movieProvider ).getMoviesByGenre("en", 28, 1 ); + } + + @Test + void shouldThrownInvalidPaginationException() { + Pageable pageable = PageRequest.of(501, 20); + + InvalidPaginationException exception = assertThrows( + InvalidPaginationException.class, + () -> movieService.getMoviesByGenre( "en", 28, pageable ) + ); + + assertThat( exception.getMessage() ) + .isEqualTo( "Invalid page: Pages start at 1 and max at 500. They are expected to be an integer." ); + } + + @Test + void shouldThrownNotFoundException() { + + Pageable page = PageRequest.of(0,20); + + NotFoundException notFound = assertThrows( + NotFoundException.class, + () -> movieService.getMoviesByGenre( "en", 1000, page ) + ); + + assertThat( notFound.getMessage() ) + .isEqualTo( "Genre does not exist" ); + } + + @Test + void shouldReturnTopRatedMoviesWhenCategoryIs100() { + + Pageable page = PageRequest.of(0, 20); + List< MoviesProviderData > movies = new ArrayList<>(); + movies.add( new MoviesProviderData( + 1560520L, + "Batman: Knightfall Part 1: Knightfall", + "2026-06-23", + 9.158, + "/360qdtu2hLnqMu8SVHMywn420w1.jpg", + false + )); + + TmdbMoviesPageableResponse prviderResult = new TmdbMoviesPageableResponse( + 1, + 500, + 10000, + movies + ); + when( movieProvider.getTopRatedMovies("en", 1)) + .thenReturn(prviderResult); + + MoviePageResponse response = movieService.getMoviesByGenre( "en", 100, page); + + assertThat( response.getMovies().get(0).getTitle() ) + .isEqualTo("Batman: Knightfall Part 1: Knightfall"); + + verify( movieProvider ).getTopRatedMovies( "en", 1 ); + } } From 6402140c67a2dc2b495c7792f33eacf85d635093 Mon Sep 17 00:00:00 2001 From: Marouane Addou <105064179+marouaneaddou@users.noreply.github.com> Date: Sun, 27 Sep 2026 21:13:37 +0000 Subject: [PATCH 3/3] feat(browse-movies): add test for build home page service (#66) --- .../serviceImpl/MovieServiceImplTest.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java index e172f7c..24f39e5 100644 --- a/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java +++ b/src/test/java/com/filmexa/stream/modules/moviesExternal/serviceImpl/MovieServiceImplTest.java @@ -6,13 +6,14 @@ /* By: maddou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/09/26 12:52:27 by marouan #+# #+# */ -/* Updated: 2026/09/27 21:35:53 by maddou ### ########.fr */ +/* Updated: 2026/09/27 22:10:47 by maddou ### ########.fr */ /* */ /* ************************************************************************** */ package com.filmexa.stream.modules.moviesExternal.serviceImpl; import java.util.List; +import java.util.Map; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Value; @@ -28,8 +29,11 @@ import static org.mockito.Mockito.when; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import com.filmexa.stream.modules.moviesExternal.mapper.MovieMapper; import com.filmexa.stream.modules.moviesExternal.client.MovieProvider; @@ -39,6 +43,7 @@ import com.filmexa.stream.modules.moviesExternal.dto.response.TrendingMoviesResponse; import com.filmexa.stream.modules.moviesExternal.dto.tmdb.TmdbMoviesPageableResponse; import com.filmexa.stream.modules.moviesExternal.dto.response.MoviePageResponse; +import com.filmexa.stream.modules.moviesExternal.dto.response.MovieResponse; import com.filmexa.stream.common.exception.InvalidPaginationException; import com.filmexa.stream.common.exception.NotFoundException; @@ -177,6 +182,41 @@ void shouldReturnTopRatedMoviesWhenCategoryIs100() { assertThat( response.getMovies().get(0).getTitle() ) .isEqualTo("Batman: Knightfall Part 1: Knightfall"); - verify( movieProvider ).getTopRatedMovies( "en", 1 ); + verify( movieProvider ) + .getTopRatedMovies( "en", 1 ); + } + + @Test + void shouldBuildHomeMovies() { + List< MoviesProviderData > topRated = new ArrayList<>(); + topRated.add( new MoviesProviderData( + 1560520L, + "Batman: Knightfall Part 1: Knightfall", + "2026-06-23", + 9.158, + "/360qdtu2hLnqMu8SVHMywn420w1.jpg", + false + )); + + List< MoviesProviderData > action = new ArrayList<>(); + action.add( new MoviesProviderData( + 1L, + "Spider-Man: Brand New Day", + "2026-07-29", + 7.864, + "/bjiS5ipwxb9JFy3XRRN4OAilSeX.jpg", + false + )); + + when( movieProvider.getTopRatedMovies("en")) + .thenReturn(topRated); + + when( movieProvider.getMoviesByGenre(eq("en"), anyLong())) + .thenReturn(action); + + Map> homeData = movieService.buildHomeMovies("en"); + assertEquals(6, homeData.size()); + assertThat(homeData.get("Action").get(0).getTitle()) + .isEqualTo("Spider-Man: Brand New Day"); } }