public async void Should_Return_Movies_List_With_Limit_Ten()
        {
            var handlerMock = new Mock <HttpMessageHandler>();
            var response    = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(MoviesMock.MovieLimitTenMock().ToString(), Encoding.UTF8, "application/json")
            };
            Criteria criteria = new Criteria(new List <Filter>(), "", 1, 10);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(response);

            var httpClient          = new HttpClient(handlerMock.Object);
            var moviesApiRepository = new MoviesApiRepository(httpClient);

            var result = await moviesApiRepository.SearchByCriteria(criteria);

            Assert.NotNull(result);
            Assert.Equal(result.MovieCount, 31051);
            Assert.Equal(result.Movies.Count, 10);
            Assert.True(result.Movies.Exists(m => m.Id == 31663));
            Assert.Equal(result.Movies.Find(m => m.Id == 31663).Description, "Lorem Ipsum");
            Assert.Equal(result.Movies.Find(m => m.Id == 31660).BackgroundImage, "https://yts.mx/assets/images/movies/the_kings_case_note_2017/background.jpg");
            Assert.Equal(result.Movies.Find(m => m.Id == 31661).YoutubeTrailerCode, "https://youtu.be/");
        }
        public async void Should_Return_Movies_List_Mapped()
        {
            var handlerMock = new Mock <HttpMessageHandler>();
            var response    = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(MoviesMock.MovieOneResponseMock().ToString(), Encoding.UTF8, "application/json")
            };

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(response);

            var httpClient          = new HttpClient(handlerMock.Object);
            var moviesApiRepository = new MoviesApiRepository(httpClient);

            var result = await moviesApiRepository.SearchAll();

            Assert.NotNull(result);
            Assert.Equal(result.MovieCount, 30905);
            Assert.Equal(result.Movies.Count, 1);
            Assert.True(result.Movies.Exists(m => m.Id == 31506));
            Movie movie = result.Movies.Find(m => m.Id == 31506);

            Assert.Equal(movie.Description, "Hyunjuli, who accidentally falls into a fantasy world of the Moonlit Palace, fights against the evil Blossom Lady to protect her new friends.");
            Assert.Equal(movie.BackgroundImage, "https://yts.mx/assets/images/movies/lost_in_the_moonlight_2016/background.jpg");
            Assert.Equal(movie.YoutubeTrailerCode, "https://youtu.be/5uJikUpZB8U");
        }
        public async void Should_Return_Movies_List_With_Filter_By_Movie_Title_On_2020()
        {
            var handlerMock = new Mock <HttpMessageHandler>();
            var response    = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(MoviesMock.MovieLimitTenMock().ToString(), Encoding.UTF8, "application/json")
            };
            List <Filter> filters = new List <Filter>();

            filters.Add(new Filter()
            {
                FilterField = "Title", FilterOperator = "like", FilterValue = "The "
            });
            filters.Add(new Filter()
            {
                FilterField = "Year", FilterOperator = ">=", FilterValue = "2020"
            });
            Criteria criteria = new Criteria(filters, "", 1, 10);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(response);

            var httpClient          = new HttpClient(handlerMock.Object);
            var moviesApiRepository = new MoviesApiRepository(httpClient);

            var result = await moviesApiRepository.SearchByCriteria(criteria);

            Assert.NotNull(result);
            Assert.Equal(result.MovieCount, 31051);
            Assert.Equal(result.Movies.Count, 0);
        }
        public async Task <IActionResult> Get()
        {
            HttpClient          httpClient      = new HttpClient();
            MoviesApiRepository movieRepository = new MoviesApiRepository(httpClient);
            var result = await movieRepository.SearchAll();

            return(Ok(result));
        }
        public async Task <IActionResult> GetByCriterial([FromBody] CriterialRequest criterialRequest)
        {
            HttpClient          httpClient      = new HttpClient();
            MoviesApiRepository movieRepository = new MoviesApiRepository(httpClient);
            List <Filter>       filters         = FiltersMap(criterialRequest.Filters);
            Criteria            criterial       = new Criteria(filters, criterialRequest.Order, criterialRequest.Offset, criterialRequest.Limit);
            var result = await movieRepository.SearchByCriteria(criterial);

            return(Ok(result));
        }
        public async void Should_Return_Movies_List_With_Filter_By_Movie_Title()
        {
            var handlerMock = new Mock <HttpMessageHandler>();
            var response    = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(MoviesMock.MovieLimitTenMock().ToString(), Encoding.UTF8, "application/json")
            };
            List <Filter> filters = new List <Filter>();

            filters.Add(new Filter()
            {
                FilterField = "Title", FilterOperator = "like", FilterValue = "When Today "
            });
            Criteria criteria = new Criteria(filters, "", 1, 10);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(response);

            var httpClient          = new HttpClient(handlerMock.Object);
            var moviesApiRepository = new MoviesApiRepository(httpClient);

            var result = await moviesApiRepository.SearchByCriteria(criteria);

            Assert.NotNull(result);
            Assert.Equal(result.MovieCount, 31051);
            Assert.Equal(result.Movies.Count, 1);
            Assert.True(result.Movies.Exists(m => m.Id == 31659));
            Assert.Equal(result.Movies.Find(m => m.Id == 31659).Title, "When Today Ends");
            Assert.Equal(result.Movies.Find(m => m.Id == 31659).Description, "Lorem Ipsum");
            Assert.Equal(result.Movies.Find(m => m.Id == 31659).BackgroundImage, "https://yts.mx/assets/images/movies/when_today_ends_2021/background.jpg");
            Assert.Equal(result.Movies.Find(m => m.Id == 31659).YoutubeTrailerCode, "https://youtu.be/");
        }