public async Task <ActionResult <IEnumerable <BookDTO> > > GetBooks([FromQuery] BookSpecificationParams bookParams)
        {
            var spec = new BooksWithCategoriesAndAuthorsSpecification(bookParams);

            // get any overall count of items (after filtering has been applied)
            var countSpec  = new BooksWithFiltersForCountSpecification(bookParams);
            var totalItems = await _bookRepository.CountAsync(countSpec);

            // add pagination response headers to help client applications
            _httpContextAccessor.HttpContext.AddPaginationResponseHeaders(totalItems, bookParams.PageSize, bookParams.PageIndex);

            var books = await _bookRepository.ListAsync(spec);

            return(Ok(_mapper.Map <IEnumerable <Book>, IEnumerable <BookDTO> >(books)));
        }
        public async Task GetBooks_ReturnsOkResult()
        {
            // Arrange
            var context = new DefaultHttpContext();

            _httpContextAccessorMock.Setup(_ => _.HttpContext).Returns(context);

            var controller = new BooksController(_bookRepositoryMock.Object, _mapperMock.Object, _httpContextAccessorMock.Object);
            var bookParams = new BookSpecificationParams()
            {
                PageIndex = 1,
                PageSize  = 5
            };

            // Act
            var response = await controller.GetBooks(bookParams);

            // Assert
            Assert.IsType <OkObjectResult>(response.Result);
        }