|
using Basket.API.IntegrationEvents.Events;
|
|
using Basket.API.Model;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
|
using Microsoft.eShopOnContainers.Services.Basket.API.Controllers;
|
|
using Microsoft.eShopOnContainers.Services.Basket.API.Model;
|
|
using Moq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using Xunit;
|
|
using IBasketIdentityService = Microsoft.eShopOnContainers.Services.Basket.API.Services.IIdentityService;
|
|
|
|
namespace UnitTest.Basket.Application
|
|
{
|
|
public class BasketWebApiTest
|
|
{
|
|
private readonly Mock<IBasketRepository> _basketRepositoryMock;
|
|
private readonly Mock<IBasketIdentityService> _identityServiceMock;
|
|
private readonly Mock<IEventBus> _serviceBusMock;
|
|
|
|
public BasketWebApiTest()
|
|
{
|
|
_basketRepositoryMock = new Mock<IBasketRepository>();
|
|
_identityServiceMock = new Mock<IBasketIdentityService>();
|
|
_serviceBusMock = new Mock<IEventBus>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_customer_basket_success()
|
|
{
|
|
//Arrange
|
|
var fakeCustomerId = "1";
|
|
var fakeCustomerBasket = GetCustomerBasketFake(fakeCustomerId);
|
|
|
|
_basketRepositoryMock.Setup(x => x.GetBasketAsync(It.IsAny<string>()))
|
|
.Returns(Task.FromResult(fakeCustomerBasket));
|
|
_identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId);
|
|
|
|
_serviceBusMock.Setup(x => x.Publish(It.IsAny<UserCheckoutAcceptedIntegrationEvent>()));
|
|
//Act
|
|
var basketController = new BasketController(
|
|
_basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object);
|
|
var actionResult = await basketController.Get(fakeCustomerId) as OkObjectResult;
|
|
|
|
//Assert
|
|
Assert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);
|
|
Assert.Equal(((CustomerBasket)actionResult.Value).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<CustomerBasket>()))
|
|
.Returns(Task.FromResult(fakeCustomerBasket));
|
|
_identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId);
|
|
_serviceBusMock.Setup(x => x.Publish(It.IsAny<UserCheckoutAcceptedIntegrationEvent>()));
|
|
//Act
|
|
var basketController = new BasketController(
|
|
_basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object);
|
|
|
|
var actionResult = await basketController.Post(fakeCustomerBasket) as OkObjectResult;
|
|
|
|
//Assert
|
|
Assert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);
|
|
Assert.Equal(((CustomerBasket)actionResult.Value).BuyerId, fakeCustomerId);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Doing_Checkout_Without_Basket_Should_Return_Bad_Request()
|
|
{
|
|
var fakeCustomerId = "2";
|
|
_basketRepositoryMock.Setup(x => x.GetBasketAsync(It.IsAny<string>()))
|
|
.Returns(Task.FromResult((CustomerBasket)null));
|
|
_identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId);
|
|
//Act
|
|
var basketController = new BasketController(
|
|
_basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object);
|
|
|
|
var result = await basketController.Checkout(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<string>()))
|
|
.Returns(Task.FromResult(fakeCustomerBasket));
|
|
_identityServiceMock.Setup(x => x.GetUserIdentity()).Returns(fakeCustomerId);
|
|
//Act
|
|
var basketController = new BasketController(
|
|
_basketRepositoryMock.Object, _identityServiceMock.Object, _serviceBusMock.Object);
|
|
|
|
var result = await basketController.Checkout(new BasketCheckout(), Guid.NewGuid().ToString()) as AcceptedResult;
|
|
_serviceBusMock.Verify(mock => mock.Publish(It.IsAny<UserCheckoutAcceptedIntegrationEvent>()), Times.Once);
|
|
Assert.NotNull(result);
|
|
}
|
|
|
|
private CustomerBasket GetCustomerBasketFake(string fakeCustomerId)
|
|
{
|
|
return new CustomerBasket(fakeCustomerId)
|
|
{
|
|
Items = new List<BasketItem>()
|
|
{
|
|
new BasketItem()
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|