using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.eShopOnContainers.WebMVC.Controllers; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Moq; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Xunit; using BasketModel = Microsoft.eShopOnContainers.WebMVC.ViewModels.Basket; namespace UnitTest.Basket.Application { public class CartControllerTest { private readonly Mock _catalogServiceMock; private readonly Mock _basketServiceMock; private readonly Mock> _identityParserMock; private readonly Mock _contextMock; public CartControllerTest() { _catalogServiceMock = new Mock(); _basketServiceMock = new Mock(); _identityParserMock = new Mock>(); _contextMock = new Mock(); } [Fact] public async Task Post_cart_success() { //Arrange var fakeBuyerId = "1"; var action = string.Empty; var fakeBasket = GetFakeBasket(fakeBuyerId); var fakeQuantities = new Dictionary() { ["fakeProdA"] = 1, ["fakeProdB"] = 2 }; _basketServiceMock.Setup(x => x.SetQuantities(It.IsAny(), It.IsAny>())) .Returns(Task.FromResult(fakeBasket)); _basketServiceMock.Setup(x => x.UpdateBasket(It.IsAny())) .Returns(Task.FromResult(fakeBasket)); //Act var cartController = new CartController(_basketServiceMock.Object, _catalogServiceMock.Object, _identityParserMock.Object); cartController.ControllerContext.HttpContext = _contextMock.Object; var actionResult = await cartController.Index(fakeQuantities, action); //Assert var viewResult = Assert.IsType(actionResult); } [Fact] public async Task Post_cart_checkout_success() { //Arrange var fakeBuyerId = "1"; var action = "[ Checkout ]"; var fakeBasket = GetFakeBasket(fakeBuyerId); var fakeQuantities = new Dictionary() { ["fakeProdA"] = 1, ["fakeProdB"] = 2 }; _basketServiceMock.Setup(x => x.SetQuantities(It.IsAny(), It.IsAny>())) .Returns(Task.FromResult(fakeBasket)); _basketServiceMock.Setup(x => x.UpdateBasket(It.IsAny())) .Returns(Task.FromResult(fakeBasket)); //Act var orderController = new CartController(_basketServiceMock.Object, _catalogServiceMock.Object, _identityParserMock.Object); orderController.ControllerContext.HttpContext = _contextMock.Object; var actionResult = await orderController.Index(fakeQuantities, action); //Assert var redirectToActionResult = Assert.IsType(actionResult); Assert.Equal("Order", redirectToActionResult.ControllerName); Assert.Equal("Create", redirectToActionResult.ActionName); } [Fact] public async Task Add_to_cart_success() { //Arrange var fakeCatalogItem = GetFakeCatalogItem(); _basketServiceMock.Setup(x => x.AddItemToBasket(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(1)); //Act var orderController = new CartController(_basketServiceMock.Object, _catalogServiceMock.Object, _identityParserMock.Object); orderController.ControllerContext.HttpContext = _contextMock.Object; var actionResult = await orderController.AddToCart(fakeCatalogItem); //Assert var redirectToActionResult = Assert.IsType(actionResult); Assert.Equal("Catalog", redirectToActionResult.ControllerName); Assert.Equal("Index", redirectToActionResult.ActionName); } private BasketModel GetFakeBasket(string buyerId) { return new BasketModel() { BuyerId = buyerId }; } private CatalogItem GetFakeCatalogItem() { return new CatalogItem() { Id = 1, Name = "fakeName", CatalogBrand = "fakeBrand", CatalogType = "fakeType", CatalogBrandId = 2, CatalogTypeId = 5, Price = 20 }; } } }