Newer
Older
Warehouse / tests / WebApi.UnitTests / API / V1 / ProductControllerTests.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 5 KB Init
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Moq;
using MyWarehouse.Application.Products.CreateProduct;
using MyWarehouse.Application.Products.DeleteProduct;
using MyWarehouse.Application.Products.GetProduct;
using MyWarehouse.Application.Products.GetProducts;
using MyWarehouse.Application.Products.GetProductsSummary;
using MyWarehouse.Application.Products.ProductStockMass;
using MyWarehouse.Application.Products.ProductStockValue;
using MyWarehouse.Application.Products.UpdateProduct;
using MyWarehouse.Infrastructure.ApplicationDependencies.DataAccess.Repositories.Common;
using MyWarehouse.WebApi.API.V1;
using NUnit.Framework;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace MyWarehouse.WebApi.UnitTests.API.V1
{
    // Simple happy path tests.
    public class ProductControllerTests
    {
        private Mock<IMediator> _mockMediator;
        private ProductController _sut;

        [SetUp]
        public void Setup()
        {
            _mockMediator = new Mock<IMediator>(MockBehavior.Strict);
            _sut = new ProductController(_mockMediator.Object);
        }

        [Test]
        public async Task Create()
        {
            var command = new CreateProductCommand();
            _mockMediator.Setup(x => x.Send(command, It.IsAny<CancellationToken>()))
                .ReturnsAsync(123);

            var result = await _sut.Create(command);

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(123, ((OkObjectResult)result.Result).Value);
        }

        [Test]
        public async Task Get()
        {
            var expectedId = 123;
            var response = new ProductDetailsDto();
            _mockMediator.Setup(x => x.Send(It.Is<GetProductDetailsQuery>(q => q.Id == expectedId), It.IsAny<CancellationToken>()))
                .ReturnsAsync(response);

            var result = await _sut.Get(expectedId);

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(response, ((OkObjectResult)result.Result).Value);
        }

        [Test]
        public async Task GetList()
        {
            var query = new GetProductsListQuery();
            var response = new ListResponseModel<ProductDto>(query, 100, new List<ProductDto>());
            _mockMediator.Setup(x => x.Send(query, It.IsAny<CancellationToken>()))
                .ReturnsAsync(response);

            var result = await _sut.GetList(query);

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(response, ((OkObjectResult)result.Result).Value);
        }

        [Test]
        public async Task Update()
        {
            var command = new UpdateProductCommand() { Id = 123 };
            _mockMediator.Setup(x => x.Send(command, It.IsAny<CancellationToken>()))
                .Returns(Task.FromResult(Unit.Value));

            var result = await _sut.Update(command.Id, command);

            _mockMediator.Verify(x => x.Send(command, It.IsAny<CancellationToken>()),
                Times.Once);
        }


        [Test]
        public async Task Update_WithIdMismatch_ShouldReturnBadRequest()
        {
            var command = new UpdateProductCommand() { Id = 123 };
            _mockMediator.Setup(x => x.Send(command, It.IsAny<CancellationToken>()))
                .Returns(Task.FromResult(Unit.Value));

            var result = await _sut.Update(456, command);

            Assert.IsAssignableFrom(typeof(BadRequestResult), result);
        }

        [Test]
        public async Task Delete()
        {
            var expectedId = 123;
            _mockMediator.Setup(x => x.Send(It.Is<DeleteProductCommand>(q => q.Id == expectedId), It.IsAny<CancellationToken>()))
                .ReturnsAsync(Unit.Value);

            var result = await _sut.Delete(expectedId);

            _mockMediator.Verify(x => x.Send(It.Is<DeleteProductCommand>(c => c.Id == expectedId), It.IsAny<CancellationToken>()),
                Times.Once);
        }

        [Test]
        public async Task ProductStockCount()
        {
            var response = new ProductStockCountDto();
            _mockMediator.Setup(x => x.Send(It.IsAny<ProductStockCountQuery>(), It.IsAny<CancellationToken>()))
                .ReturnsAsync(response);

            var result = await _sut.ProductStockCount();

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(response, ((OkObjectResult)result.Result).Value);
        }

        [Test]
        public async Task ProductStockMass()
        {
            var response = new StockMassDto();
            _mockMediator.Setup(x => x.Send(It.IsAny<ProductStockMassQuery>(), It.IsAny<CancellationToken>()))
                .ReturnsAsync(response);

            var result = await _sut.ProductStockMass();

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(response, ((OkObjectResult)result.Result).Value);
        }

        [Test]
        public async Task ProductStockValue()
        {
            var response = new StockValueDto();
            _mockMediator.Setup(x => x.Send(It.IsAny<ProductStockValueQuery>(), It.IsAny<CancellationToken>()))
                .ReturnsAsync(response);

            var result = await _sut.ProductStockValue();

            Assert.IsAssignableFrom<OkObjectResult>(result.Result);
            Assert.AreEqual(response, ((OkObjectResult)result.Result).Value);
        }
    }
}