namespace UnitTest.Basket.Application; using Microsoft.eShopOnContainers.Services.Basket.API.Model; public class BasketWebApiTest { private readonly Mock _basketRepositoryMock; private readonly Mock _identityServiceMock; private readonly Mock _serviceBusMock; private readonly Mock> _loggerMock; public BasketWebApiTest() { _basketRepositoryMock = new Mock(); _identityServiceMock = new Mock(); _serviceBusMock = new Mock(); _loggerMock = new Mock>(); } [Fact] public async Task Get_customer_basket_success() { //Arrange var fakeCustomerId = "1"; var fakeCustomerBasket = GetCustomerBasketFake(fakeCustomerId); _basketRepositoryMock.Setup(x => x.GetBasketAsync(It.IsAny())) .Returns(Task.FromResult(fakeCustomerBasket)); _identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId); _serviceBusMock.Setup(x => x.Publish(It.IsAny())); //Act var basketController = new BasketController( _loggerMock.Object, _basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object); var actionResult = await basketController.GetBasketByIdAsync(fakeCustomerId); //Assert Assert.Equal((actionResult.Result as OkObjectResult).StatusCode, (int)System.Net.HttpStatusCode.OK); Assert.Equal((((ObjectResult)actionResult.Result).Value as CustomerBasket).BuyerId, fakeCustomerId); } [Fact] public async Task Post_customer_basket_success() { //Arrange var fakeCustomerId = "1"; var fakeCustomerBasket = GetCustomerBasketFake(fakeCustomerId); _basketRepositoryMock.Setup(x => x.UpdateBasketAsync(It.IsAny())) .Returns(Task.FromResult(fakeCustomerBasket)); _identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId); _serviceBusMock.Setup(x => x.Publish(It.IsAny())); //Act var basketController = new BasketController( _loggerMock.Object, _basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object); var actionResult = await basketController.UpdateBasketAsync(fakeCustomerBasket); //Assert Assert.Equal((actionResult.Result as OkObjectResult).StatusCode, (int)System.Net.HttpStatusCode.OK); Assert.Equal((((ObjectResult)actionResult.Result).Value as CustomerBasket).BuyerId, fakeCustomerId); } [Fact] public async Task Doing_Checkout_Without_Basket_Should_Return_Bad_Request() { var fakeCustomerId = "2"; _basketRepositoryMock.Setup(x => x.GetBasketAsync(It.IsAny())) .Returns(Task.FromResult((CustomerBasket)null)); _identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId); //Act var basketController = new BasketController( _loggerMock.Object, _basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object); var result = await basketController.CheckoutAsync(new BasketCheckout(), Guid.NewGuid().ToString()) as BadRequestResult; Assert.NotNull(result); } [Fact] public async Task Doing_Checkout_Wit_Basket_Should_Publish_UserCheckoutAccepted_Integration_Event() { var fakeCustomerId = "1"; var fakeCustomerBasket = GetCustomerBasketFake(fakeCustomerId); _basketRepositoryMock.Setup(x => x.GetBasketAsync(It.IsAny())) .Returns(Task.FromResult(fakeCustomerBasket)); _identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId); var basketController = new BasketController( _loggerMock.Object, _basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object); basketController.ControllerContext = new ControllerContext() { HttpContext = new DefaultHttpContext() { User = new ClaimsPrincipal( new ClaimsIdentity(new Claim[] { new Claim("sub", "testuser"), new Claim("unique_name", "testuser"), new Claim(ClaimTypes.Name, "testuser") })) } }; //Act var result = await basketController.CheckoutAsync(new BasketCheckout(), Guid.NewGuid().ToString()) as AcceptedResult; _serviceBusMock.Verify(mock => mock.Publish(It.IsAny()), Times.Once); Assert.NotNull(result); } private CustomerBasket GetCustomerBasketFake(string fakeCustomerId) { return new CustomerBasket(fakeCustomerId) { Items = new List() { new BasketItem() } }; } }