Newer
Older
Warehouse / tests / Application.IntegrationTests / Transactions / GetTransactionDetailsTests.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 2 KB Init
using FluentAssertions;
using MyWarehouse.Application.Common.Exceptions;
using MyWarehouse.Application.Transactions.GetTransactionDetails;
using NUnit.Framework;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace MyWarehouse.Application.IntegrationTests.Transactions
{
    public class GetTransactionDetailsTests : TestBase
    {
        [Test]
        public void WhenIdIsInvalid_ShouldThrow_EntityNotFoundException()
        {
            var command = new GetTransactionDetailsQuery() { Id = 1234567 };

            FluentActions.Invoking(() => TestFramework.SendAsync(command))
                .Should().ThrowExactlyAsync<EntityNotFoundException>();
        }

        [Test]
        public async Task WhenIdValid_ShouldReturnTransactionDetails()
        {
            var existing = await TestFramework.DataFactory.CreateProcurementTransaction(4);

            var result = await TestFramework.SendAsync(new GetTransactionDetailsQuery() { Id = existing.Id });

            result.Should().NotBeNull();
            result.CreatedAt.Should().BeCloseTo(DateTime.Now, TimeSpan.FromSeconds(1));
            result.PartnerId.Should().Be(existing.PartnerId);
            result.PartnerName.Should().Be(existing.Partner.Name);
            result.PartnerAddress.Should().Be(existing.Partner.Address.ToString());
            result.TotalAmount.Should().Be(existing.Total.Amount);
            result.TotalCurrencyCode.Should().Be(existing.Total.Currency.Code);
            result.TransactionType.Should().Be((int)existing.TransactionType);
            result.TransactionLines
                .Should().BeEquivalentTo(existing.TransactionLines
                .Select(ent => new { 
                    ent.ProductId,
                    ent.Quantity,
                    ProductName = ent.Product.Name,
                    UnitPrice = ent.UnitPrice.ToString(),
                    UnitPriceAmount = ent.UnitPrice.Amount,
                    UnitPriceCurrencyCode = ent.UnitPrice.Currency.Code }),
                o => o.ExcludingMissingMembers());
        }
    }
}