public async Task PutBook_Valid_Returns200OkAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var saveBook = new SaveBook()
            {
                Name        = "x",
                Description = "x",
            };
            var book = new List <Models.Book> {
                new Models.Book()
                {
                    BookId = 1
                }
            };

            this.BookRepositoryMock
            .Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(book);
            this.BookRepositoryMock.Setup(x => x.UpdateAsync(book.First(), It.IsAny <CancellationToken>())).ReturnsAsync(book.First());

            var response = await this.client.PutAsJsonAsync("book/1", saveBook).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal(ContentType.RestfulJson, response.Content.Headers.ContentType?.MediaType);
            var bookViewModel = await response.Content.ReadAsAsync <Book>(this.formatters).ConfigureAwait(false);

            Assert.Equal(bookViewModel.BookId, book.First().BookId);
        }
        public async Task PostBook_Valid_Returns201CreatedAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var saveBook = new SaveBook()
            {
                Name        = "x",
                Description = "x",
            };
            var book = new Models.Book()
            {
                BookId = 1
            };

            this.BookRepositoryMock
            .Setup(x => x.AddAsync(It.IsAny <Models.Book>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(book);

            var response = await this.client.PostAsJsonAsync("book", saveBook).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.Created, response.StatusCode);
            Assert.Equal(ContentType.RestfulJson, response.Content.Headers.ContentType?.MediaType);
            var bookViewModel = await response.Content.ReadAsAsync <Book>(this.formatters).ConfigureAwait(false);

            var uriString = AddQueryString("/book", filters);

            Assert.Equal(new Uri($"http://localhost{uriString}"), response.Headers.Location);
        }
        private static string AddQueryString(string uriString, Models.BookOptionFilter filters)
        {
            var provider = CultureInfo.InvariantCulture;

            if (filters.BookId.HasValue)
            {
                uriString = QueryHelpers.AddQueryString(uriString, $"BookId", filters.BookId.Value.ToString(provider));
            }

            return(uriString);
        }
        public async Task Delete_BookNotFound_Returns404NotFoundAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 999,
            };
            var book = new List <Models.Book>();

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);
            var response = await this.client.DeleteAsync(new Uri("/book/999", UriKind.Relative)).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
            var problemDetails = await response.Content.ReadAsAsync <ProblemDetails>(this.formatters).ConfigureAwait(false);

            Assert.Equal(StatusCodes.Status404NotFound, problemDetails.Status);
        }
        public async Task Delete_BookFound_Returns204NoBookAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var book = new List <Models.Book> {
                new Models.Book()
            };

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);
            this.BookRepositoryMock.Setup(x => x.DeleteAsync(book.First(), It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            var response = await this.client.DeleteAsync(new Uri("/book/1", UriKind.Relative)).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
        }
Example #6
0
        /// <summary>
        /// Execute async.
        /// </summary>
        /// <param name="saveBook">The save book.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>An action result.</returns>
        public async Task <IActionResult> ExecuteAsync(SaveBook saveBook, CancellationToken cancellationToken)
        {
            var book = this.saveBookToBookMapper.Map(saveBook);

            book = await this.bookRepository.AddAsync(book, cancellationToken).ConfigureAwait(false);

            var bookViewModel = this.bookToBookMapper.Map(book);

            var filters = new Models.BookOptionFilter {
                BookId = bookViewModel.BookId
            };

            return(new CreatedAtRouteResult(
                       BookControllerRoute.GetBook,
                       filters,
                       bookViewModel));
        }
        public async Task Get_InvalidAcceptHeaderByBook_Returns406NotAcceptableAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var book = new List <Models.Book>();

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);
            var uriString = AddQueryString("/book", filters);

            using var request = new HttpRequestMessage(HttpMethod.Get, uriString);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(ContentType.Text));

            var response = await this.client.SendAsync(request).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.NotAcceptable, response.StatusCode);
            // Note: ASP.NET Core should be automatically returning a ProblemDetails response but is returning an empty
            // response body instead. See https://github.com/aspnet/AspNetCore/issues/16889
        }
Example #8
0
        /// <summary>
        /// Execute async.
        /// </summary>
        /// <param name="bookId">The book id.</param>
        /// <param name="saveBook">The save book.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A action result.</returns>
        public async Task <IActionResult> ExecuteAsync(long bookId, SaveBook saveBook, CancellationToken cancellationToken)
        {
            var filters = new Models.BookOptionFilter {
                BookId = bookId
            };
            var book = await this.bookRepository.GetAsync(filters, cancellationToken).ConfigureAwait(false);

            if (book is null || !book.Any())
            {
                return(new NotFoundResult());
            }

            var item = book.First();

            this.saveBookToBookMapper.Map(saveBook, item);
            item = await this.bookRepository.UpdateAsync(item, cancellationToken).ConfigureAwait(false);

            var bookViewModel = this.bookToBookMapper.Map(item);

            return(new OkObjectResult(bookViewModel));
        }
        public async Task Get_BookFound_Returns200OkAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var book = new List <Models.Book> {
                new Models.Book {
                    BookId = 1
                }
            };

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);
            var uriString = AddQueryString("/book", filters);
            var response  = await this.client.GetAsync(new Uri(uriString, UriKind.Relative)).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal(ContentType.RestfulJson, response.Content.Headers.ContentType?.MediaType);
            var bookViewModel = await response.Content.ReadAsAsync <List <Models.Book> >(this.formatters).ConfigureAwait(false);

            Assert.Equal(book.First().BookId, bookViewModel.First().BookId);
        }
        public async Task PutBook_BookNotFound_Returns404NotFoundAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 999,
            };
            var saveBook = new SaveBook()
            {
                Name        = "x",
                Description = "x",
            };
            var book = new List <Models.Book>();

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);

            var response = await this.client.PutAsJsonAsync("book/999", saveBook).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
            var problemDetails = await response.Content.ReadAsAsync <ProblemDetails>(this.formatters).ConfigureAwait(false);

            Assert.Equal(StatusCodes.Status404NotFound, problemDetails.Status);
        }
        public async Task Get_BookByBookHasBeenModifiedSince_Returns200OKAsync()
        {
            var filters = new Models.BookOptionFilter
            {
                BookId = 1,
            };
            var book = new List <Models.Book> {
                new Models.Book()
                {
                    ModifiedDate = new DateTimeOffset(2000, 1, 1, 0, 0, 1, TimeSpan.Zero)
                }
            };

            this.BookRepositoryMock.Setup(x => x.GetAsync(It.IsAny <Models.BookOptionFilter>(), It.IsAny <CancellationToken>())).ReturnsAsync(book);
            var uriString = AddQueryString("/book", filters);

            using var request = new HttpRequestMessage(HttpMethod.Get, uriString);
            request.Headers.IfModifiedSince = new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero);

            var response = await this.client.SendAsync(request).ConfigureAwait(false);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }