public void it_should_apply_the_query_paging_and_ordering_when_the_pagingAndSortingInfo_parameter_is_not_null()
            {
                var sut = new QueryHandler_SpecificQuery_Mock();
                var title = "wa";
                var queryObject = new FindMoviesByTitleQuery(title);
                var property = sut.GetType().GetProperty("InitialItems", BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance);
                var items = (IQueryable<Movie>)property.GetValue(sut);
                var pagingInfo = new PagingAndSortingInfo(page: 2, pageSize: 1);
                var pageIndex = pagingInfo.Page - 1;
                var expectedItems = items.Where(x => x.Title.ToLower().Contains(title.ToLower()));
                var expectedPagedItems = expectedItems.OrderByDescending(x => x.ID).Skip(pageIndex * pagingInfo.PageSize).Take(pagingInfo.PageSize);

                var res = sut.HandleQuery(queryObject, pagingInfo);

                res.Should().NotBeNull();
                res.VirtualRowsCount.Should().Be(expectedItems.Count());
                res.Results.Should().NotBeNull()
                    .And.HaveCount(expectedPagedItems.Count());
                expectedPagedItems.ToList().ForEach(z =>
                    {
                        var item = res.Results.FirstOrDefault(x => x.ID.Equals(z.ID));

                        item.Should().NotBeNull("The expected item should belong to the res list");
                    });
            }
            public void it_should_order_in_descending_mode_when_the_order_fiels_is_not_null_and_the_order_direction_is_Descending()
            {
                var sut = new QueryPageAndSortingBaseMock();
                var items = Builder<Movie>.CreateListOfSize(10).Build().AsQueryable();
                var expectedItems = items.OrderByDescending(x => x.ID);
                var methodInfo = sut.GetType().GetMethod("ApplyPagingAndSorting", BindingFlags.Instance | BindingFlags.NonPublic);
                var pagingInfo = new PagingAndSortingInfo(orderByField: "ID", orderDirection: OrderDirection.Descending);

                var res = (IQueryable<Movie>)methodInfo.Invoke(sut, new object[] { items, pagingInfo });

                res.Should().NotBeNull()
                    .And.HaveCount(items.Count())
                    .And.ContainInOrder(expectedItems);
            }
            public void it_should_apply_the_default_order_when_the_order_field_is_null_or_empty()
            {
                var sut = new QueryPageAndSortingBaseMock();
                var items = Builder<Movie>.CreateListOfSize(10).Build().AsQueryable();
                var expectedItems = items.OrderByDescending(x => x.Title);
                var methodInfo = sut.GetType().GetMethod("ApplyPagingAndSorting", BindingFlags.Instance | BindingFlags.NonPublic);
                var pagingInfo = new PagingAndSortingInfo(orderByField: string.Empty);

                var res = (IQueryable<Movie>)methodInfo.Invoke(sut, new object[] { items, pagingInfo });

                res.Should().NotBeNull()
                    .And.HaveCount(items.Count())
                    .And.ContainInOrder(expectedItems);
            }
            public void it_should_apply_paging_and_sorting_when_the_pagingAndSortingInfo_parameter_is_not_null()
            {
                var sut = new QueryHandlerBaseMock();
                var items = Builder<Movie>.CreateListOfSize(20).Build().AsQueryable();
                var paging = new PagingAndSortingInfo(orderByField: "ID");
                var pageIndex = paging.Page - 1;
                var expectedItems = items.OrderBy(x => x.ID).Skip(pageIndex * paging.PageSize).Take(paging.PageSize);
                var methodInfo = sut.GetType().GetMethod("HandleCustomQuery", BindingFlags.NonPublic | BindingFlags.Instance);

                var res = (IQueryable<Movie>)methodInfo.Invoke(sut, new object[] { items, paging });

                res.Should().NotBeNull()
                    .And.HaveCount(expectedItems.Count())
                    .And.ContainInOrder(expectedItems);
            }
            public void it_should_sort_descending_and_page_using_the_specified_order_field_when_order_field_is_not_null_nor_empty()
            {
                var items = Builder<Movie>.CreateListOfSize(10).Build().AsQueryable();
                var sut = new FindMoviesByTitleQueryHandlerBuilder().SetMovies(items).Build();
                var query = new FindMoviesByTitleQuery(string.Empty);
                var pagingAndSortingInfo = new PagingAndSortingInfo(3, 3, "ID", OrderDirection.Descending);
                var processedItems = items.OrderByDescending(x => x.ID).Skip(6).Take(3);

                var res = sut.HandleQuery(query, pagingAndSortingInfo);

                res.Should().NotBeNull();
                res.VirtualRowsCount.Should().Be(10);
                res.Results.Should().NotBeNull()
                    .And.HaveCount(3)
                    .And.ContainInOrder(processedItems);
            }
            public void it_should_paginate_the_results()
            {
                var sut = new QueryPageAndSortingBaseMock();
                var page = 3;
                var pageSize = 4;
                var pageIndex = page - 1;
                var pagingInfo = new PagingAndSortingInfo(orderByField: "Title", orderDirection: OrderDirection.Descending, page: page, pageSize: pageSize);
                var items = Builder<Movie>.CreateListOfSize(20).Build().AsQueryable();
                var expectedItems = items.OrderByDescending(x => x.Title).Skip(pageIndex * pageSize).Take(pageSize);
                var methodInfo = sut.GetType().GetMethod("ApplyPagingAndSorting", BindingFlags.Instance | BindingFlags.NonPublic);

                var res = (IQueryable<Movie>)methodInfo.Invoke(sut, new object[] { items, pagingInfo });

                res.Should().NotBeNull()
                    .And.HaveCount(pageSize)
                    .And.ContainInOrder(expectedItems);
            }
            public void it_should_return_all_the_movies_paging_when_the_pagingAndSortingInfo_parameter_is_not_null()
            {
                var builder = new MovieQueryManagerBuilder()
                    .SetupMoviesQueryRepositoryMockWithDefaultMovies();
                var movies = builder.GetDefaultMovies();
                var sut = builder.Build();
                var page = 3;
                var pageIndex = page - 1;
                var pageSize = 3;
                var pagingAndSortingInfo = new PagingAndSortingInfo(page: page, pageSize: pageSize, orderByField: "Title", orderDirection: OrderDirection.Descending);
                var pagedMovies = movies.OrderByDescending(x => x.Title).Skip(pageIndex * pageSize).Take(pageSize);

                var res = sut.FindAll(pagingAndSortingInfo);

                res.Should().NotBeNull();
                res.VirtualRowsCount.Should().Be(pageSize);
                res.Results.Should().NotBeNull().And.ContainInOrder(pagedMovies);

            }