public async Task PostCheckAvailability_ShouldBeAvailable()
        {
            // Arrange
            var context  = new TestBookStoreAPIContext();
            var testBook = DemoData.GetDemoBook();

            context.Books.Add(testBook);
            var testBookDTO = DemoData.GetDTOfromBook(testBook);
            var cartItem    = new CartItem {
                Book = testBookDTO, Quantity = 1
            };
            var cart = new Cart()
            {
                CartItems = new List <CartItem> {
                    cartItem
                }
            };

            // Act
            var controller = new BooksController(context);
            var result     = await controller.PostAvailability(cart) as IHttpActionResult;

            var contentResult  = result as OkNegotiatedContentResult <ApiResponse>;
            var availableBooks = contentResult.Content.Data as IEnumerable <IBookDTO>;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(!contentResult.Content.Error);
            Assert.AreEqual("all available", contentResult.Content.Message);
            Assert.AreEqual(testBookDTO, availableBooks.ElementAt(0));
        }
        public async Task GetSearch_ShouldReturnKewordMatchingBooks()
        {
            // Arrange
            var context = new TestBookStoreAPIContext();

            context.Books.Add(new Book {
                Id = "id1", Title = "Generic Title", Author = "Cunning Basterd", Price = 499M, InStock = 1
            });
            context.Books.Add(new Book {
                Id = "id2", Title = "Generic Title", Author = "Cunning Basterd", Price = 999M, InStock = 5
            });
            context.Books.Add(new Book {
                Id = "id3", Title = "Desired", Author = "Author Here", Price = 960M, InStock = 0
            });

            // Act
            var controller = new BooksController(context);
            var result     = await controller.GetSearch("generic") as IHttpActionResult;

            var contentResult = result as OkNegotiatedContentResult <ApiResponse>;
            var books         = contentResult.Content.Data as IQueryable <IBookDTO>;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(!contentResult.Content.Error);
            Assert.AreEqual(2, books.Count());
        }
        public async Task PostOrder_ShouldReturnError()
        {
            // Arrange
            var context  = new TestBookStoreAPIContext();
            var testBook = DemoData.GetDemoBook();

            context.Books.Add(testBook);
            var cart = new Cart
            {
                //this item is out of stock
                CartItems =
                    new List <CartItem> {
                    new CartItem(DemoData.GetDTOfromBook(testBook), 5)
                }
            };

            // Act
            var controller = new OrdersController(context);
            var result     = await controller.PostOrder(cart) as IHttpActionResult;

            var contentResult = result as OkNegotiatedContentResult <ApiResponse>;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(contentResult.Content.Error);
        }
        public async Task GetOrder_ShouldReturnOrderDetails()
        {
            // Arrange
            var context = new TestBookStoreAPIContext();
            var order   = DemoData.GetDemoOrder();

            context.Orders.Add(order);
            OrderItem orderItem = new OrderItem
            {
                Id             = Util.Util.GetNewId(),
                OrderId        = order.Id,
                BookId         = "xta",
                SellingPrice   = 499,
                Quantity       = 1,
                ShippingStatus = 0,
                CreatedAt      = new System.DateTime()
            };

            context.OrderItems.Add(orderItem);

            // Act
            var controller = new OrdersController(context);
            var result     = await controller.GetOrder("XyZ") as IHttpActionResult;

            var contentResult = result as OkNegotiatedContentResult <ApiResponse>;
            var orderDetails  = contentResult.Content.Data as OrderDetailsDTO;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(!contentResult.Content.Error);
            Assert.AreEqual("XyZ", orderDetails.Id);
            Assert.AreEqual(499, orderDetails.TotalAmount);
        }
        public void GetBooks_ShouldReturnAllBooks()
        {
            // Arrange
            var context = new TestBookStoreAPIContext();

            context.Books.Add(DemoData.GetDemoBook());

            // Act
            var controller    = new BooksController(context);
            var result        = controller.GetBooks() as IHttpActionResult;
            var contentResult = result as OkNegotiatedContentResult <ApiResponse>;
            var books         = contentResult.Content.Data as IQueryable <IBookDTO>;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(!contentResult.Content.Error);
            Assert.AreEqual(1, books.Count());
        }
        public async Task GetBook_ShouldReturnBookDetails()
        {
            // Arrange
            var context = new TestBookStoreAPIContext();

            context.Books.Add(DemoData.GetDemoBook());

            // Act
            var controller = new BooksController(context);
            var result     = await controller.GetBook("id1") as IHttpActionResult;

            var contentResult = result as OkNegotiatedContentResult <ApiResponse>;
            var book          = contentResult.Content.Data as IBookDTO;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(!contentResult.Content.Error);
            Assert.AreEqual("id1", book.Id);
        }