From d929ec240a627b20943bc9048ba604d95bb10a6d Mon Sep 17 00:00:00 2001 From: eggwhat Date: Thu, 18 Jan 2024 20:12:20 +0100 Subject: [PATCH] #116: add tests for create order handlers --- .../Contexts/IdentityContext.cs | 3 + .../ApproveOrderOfficeWorkerHandlerTests.cs | 138 +++++ .../CreateOrderMiniCurrierHandlerTests.cs | 49 ++ .../CreateOrderSwiftParcelHandlerTests.cs | 508 ++++++++++++++++++ ...rvices.Orders.Application.UnitTests.csproj | 2 + 5 files changed, 700 insertions(+) create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/ApproveOrderOfficeWorkerHandlerTests.cs create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderMiniCurrierHandlerTests.cs create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderSwiftParcelHandlerTests.cs diff --git a/SwiftParcel.Services.Orders/src/SwiftParcel.Services.Orders.Infrastructure/SwiftParcel.Services.Orders.Infrastructure/Contexts/IdentityContext.cs b/SwiftParcel.Services.Orders/src/SwiftParcel.Services.Orders.Infrastructure/SwiftParcel.Services.Orders.Infrastructure/Contexts/IdentityContext.cs index 9f67813..b1daf91 100644 --- a/SwiftParcel.Services.Orders/src/SwiftParcel.Services.Orders.Infrastructure/SwiftParcel.Services.Orders.Infrastructure/Contexts/IdentityContext.cs +++ b/SwiftParcel.Services.Orders/src/SwiftParcel.Services.Orders.Infrastructure/SwiftParcel.Services.Orders.Infrastructure/Contexts/IdentityContext.cs @@ -1,4 +1,7 @@ using SwiftParcel.Services.Orders.Application; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SwiftParcel.Services.Orders.Application.UnitTests")] namespace SwiftParcel.Services.Orders.Infrastructure.Contexts { diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/ApproveOrderOfficeWorkerHandlerTests.cs b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/ApproveOrderOfficeWorkerHandlerTests.cs new file mode 100644 index 0000000..5b673d2 --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/ApproveOrderOfficeWorkerHandlerTests.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Convey.CQRS.Commands; +using Convey.CQRS.Events; +using SwiftParcel.Services.Orders.Application.Commands; +using SwiftParcel.Services.Orders.Application.Commands.Handlers; +using SwiftParcel.Services.Orders.Application.Events; +using SwiftParcel.Services.Orders.Application.Exceptions; +using SwiftParcel.Services.Orders.Application.Services; +using SwiftParcel.Services.Orders.Core.Entities; +using SwiftParcel.Services.Orders.Core.Repositories; +using SwiftParcel.Services.Orders.Infrastructure.Contexts; + +namespace SwiftParcel.Services.Orders.Application.UnitTests.Commands +{ + public class ApproveOrderOfficeWorkerHandlerTests + { + private readonly ApproveOrderOfficeWorkerHandler _approveOrdersOfficeWorkerHandler; + private readonly Mock _orderRepositoryMock; + private readonly Mock _messageBrokerMock; + private readonly Mock _eventMapperMock; + private readonly Mock _appContextMock; + private readonly Mock _commandDispatcherMock; + private readonly Mock _dateTimeProviderMock; + + public ApproveOrderOfficeWorkerHandlerTests() + { + _orderRepositoryMock = new Mock(); + _messageBrokerMock = new Mock(); + _eventMapperMock = new Mock(); + _appContextMock = new Mock(); + _commandDispatcherMock = new Mock(); + _dateTimeProviderMock = new Mock(); + _approveOrdersOfficeWorkerHandler = new ApproveOrderOfficeWorkerHandler(_orderRepositoryMock.Object, _messageBrokerMock.Object, _eventMapperMock.Object, _appContextMock.Object, _commandDispatcherMock.Object, _dateTimeProviderMock.Object); + } + + [Fact] + public async Task HandleAsync_WithValidOrderAndOfficeWorkerIdentity_ShouldApproveOrderAndSendEmail() + { + // Arrange + var orderId = Guid.NewGuid(); + var command = new ApproveOrderOfficeWorker(orderId); + + var identityContext = new IdentityContext(Guid.NewGuid().ToString(), "officeworker", + true, new Dictionary()); + + var order = Order.Create(new AggregateId(orderId), Guid.NewGuid(), OrderStatus.WaitingForDecision, + DateTime.Now, "validName", "valid@email.com", + new Address("street", "buildingNumber", "apartmentNumber", "city", "00-433", "country")); + + _appContextMock.Setup(ctx => ctx.Identity).Returns(identityContext); + _orderRepositoryMock.Setup(repo => repo.GetAsync(command.OrderId)).ReturnsAsync(order); + var decisionDate = DateTime.Now; + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(decisionDate); + + var cancellationToken = new CancellationToken(); + + // Act + await _approveOrdersOfficeWorkerHandler.HandleAsync(command, cancellationToken); + + // Assert + _orderRepositoryMock.Verify(repo => repo.UpdateAsync(order), Times.Once); + _eventMapperMock.Verify(mapper => mapper.MapAll(order.Events), Times.Once); + _commandDispatcherMock.Verify(dispatcher => dispatcher.SendAsync(It.IsAny(), cancellationToken), Times.Once); + } + + // [Fact] + // public async Task HandleAsync_WithInvalidOrder_ShouldThrowOrderNotFoundException() + // { + // // Arrange + // var command = new ApproveOrderOfficeWorker + // { + // OrderId = Guid.NewGuid() + // // Set other properties as needed + // }; + + // var cancellationToken = new CancellationToken(); + // var orderRepositoryMock = new Mock(); + // var appContextMock = new Mock(); + // var dateTimeProviderMock = new Mock(); + // var eventMapperMock = new Mock(); + // var messageBrokerMock = new Mock(); + // var commandDispatcherMock = new Mock(); + + // var handler = new ApproveOrderOfficeWorkerHandler( + // orderRepositoryMock.Object, + // appContextMock.Object, + // dateTimeProviderMock.Object, + // eventMapperMock.Object, + // messageBrokerMock.Object, + // commandDispatcherMock.Object + // ); + + // orderRepositoryMock.Setup(repo => repo.GetAsync(command.OrderId)).ReturnsAsync((Order)null); + + // // Act & Assert + // await Assert.ThrowsAsync(() => handler.HandleAsync(command, cancellationToken)); + // } + + // [Fact] + // public async Task HandleAsync_WithNonOfficeWorkerIdentity_ShouldThrowUnauthorizedOrderAccessException() + // { + // // Arrange + // var orderId = Guid.NewGuid(); + // var command = new ApproveOrderOfficeWorker(orderId); + + // var identityContext = new IdentityContext(Guid.NewGuid().ToString(), "officeworker", + // true, new Dictionary()); + + // _appContextMock.Setup(ctx => ctx.Identity).Returns(identityContext); + + + + // var order = new Order + // { + // Id = command.OrderId, + // // Set other properties as needed + // }; + + // var identity = new AppIdentity + // { + // IsOfficeWorker = false + // // Set other identity properties as needed + // }; + + // appContextMock.Setup(ctx => ctx.Identity).Returns(identity); + // orderRepositoryMock.Setup(repo => repo.GetAsync(command.OrderId)).ReturnsAsync(order); + + // // Act & Assert + // await Assert.ThrowsAsync(() => handler.HandleAsync(command, cancellationToken)); + // } + } + + +} diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderMiniCurrierHandlerTests.cs b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderMiniCurrierHandlerTests.cs new file mode 100644 index 0000000..01df0fd --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderMiniCurrierHandlerTests.cs @@ -0,0 +1,49 @@ +using SwiftParcel.Services.Orders.Application.Commands; +using SwiftParcel.Services.Orders.Application.Commands.Handlers; +using SwiftParcel.Services.Orders.Application.Services.Clients; +using SwiftParcel.Services.Orders.Core.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SwiftParcel.Services.Orders.Application.UnitTests.Commands +{ + public class CreateOrderMiniCurrierHandlerTests + { + private readonly CreateOrderMiniCurrierHandler _createOrderMiniCurrierHandler; + private readonly Mock _lecturerApiServiceClientMock; + + public CreateOrderMiniCurrierHandlerTests() + { + _lecturerApiServiceClientMock = new Mock(); + _createOrderMiniCurrierHandler = new CreateOrderMiniCurrierHandler(_lecturerApiServiceClientMock.Object); + } + + //[Fact] + //public async Task HandleAsync_WithValidOrder_ShouldSendPostOfferAsync() + //{ + // // Arrange + // var address = new Address() + // { + // City = "City", + // Country = "Country", + // ApartmentNumber = "32", + // BuildingNumber = "32", + // ZipCode = "00-323", + // Street = "Street" + // }; + // var createOrder = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "Name", "valid@email.com", address, Company.MiniCurrier); + // var command = new CreateOrderMiniCurrier(createOrder); + // var cancellationToken = new CancellationToken(); + + // // Act + // await _createOrderMiniCurrierHandler.HandleAsync(command, cancellationToken); + + // // Assert + // _lecturerApiServiceClientMock.Verify(client => client.PostOfferAsync(It.IsAny()), Times.Once); + //} + + } +} diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderSwiftParcelHandlerTests.cs b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderSwiftParcelHandlerTests.cs new file mode 100644 index 0000000..fb333f8 --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderSwiftParcelHandlerTests.cs @@ -0,0 +1,508 @@ +using Castle.Core.Resource; +using SwiftParcel.Services.Orders.Application.Commands; +using SwiftParcel.Services.Orders.Application.Commands.Handlers; +using SwiftParcel.Services.Orders.Application.DTO; +using SwiftParcel.Services.Orders.Application.Events; +using SwiftParcel.Services.Orders.Application.Exceptions; +using SwiftParcel.Services.Orders.Application.Services; +using SwiftParcel.Services.Orders.Application.Services.Clients; +using SwiftParcel.Services.Orders.Core.Entities; +using SwiftParcel.Services.Orders.Core.Events; +using SwiftParcel.Services.Orders.Core.Exceptions; +using SwiftParcel.Services.Orders.Core.Repositories; +using System.ComponentModel.DataAnnotations; +using System.Threading; + +namespace SwiftParcel.Services.Orders.Application.UnitTests.Commands +{ + public class CreateOrderSwiftParcelHandlerTests + { + private readonly CreateOrderSwiftParcelHandler _createOrderSwiftParcelHandler; + private readonly Mock _orderRepositoryMock; + private readonly Mock _customerRepositoryMock; + private readonly Mock _messageBrokerMock; + private readonly Mock _eventMapperMock; + private readonly Mock _dateTimeProviderMock; + private readonly Mock _parcelsServiceClientMock; + + public CreateOrderSwiftParcelHandlerTests() + { + _orderRepositoryMock = new Mock(); + _customerRepositoryMock = new Mock(); + _messageBrokerMock = new Mock(); + _eventMapperMock = new Mock(); + _dateTimeProviderMock = new Mock(); + _parcelsServiceClientMock = new Mock(); + _createOrderSwiftParcelHandler = new CreateOrderSwiftParcelHandler(_orderRepositoryMock.Object, _customerRepositoryMock.Object, + _messageBrokerMock.Object, _eventMapperMock.Object, _dateTimeProviderMock.Object, _parcelsServiceClientMock.Object); + } + + [Fact] + public async Task HandleAsync_WithValidParcelId_ShouldCreateOrderAndPublishEvents() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "32", + BuildingNumber = "32", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + var order = Order.Create(command.OrderId, command.CustomerId, OrderStatus.WaitingForDecision, dateTimeNow, + command.Name, command.Email, command.Address); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().NotThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidParcelId_ShouldThrowParcelNotFoundException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "32", + BuildingNumber = "32", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync((ParcelDto)null); + + // Act & Assert + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidParcelValidToDate_ShouldThrowParcelRequestExpiredException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "32", + BuildingNumber = "32", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = DateTime.Now.AddDays(-1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(DateTime.Now); + + // Act & Assert + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidAddressFieldCity_ShouldThrowInvalidAddressElementException() + { + // Arrange + var address = new Address() + { + City = "", + Country = "Country", + ApartmentNumber = "32", + BuildingNumber = "32", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.AddressElement == "city"); + } + + [Fact] + public async Task HandleAsync_WithInvalidAddressFieldCountry_ShouldThrowInvalidAddressElementException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "", + ApartmentNumber = "32", + BuildingNumber = "32", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.AddressElement == "country"); + } + + + [Fact] + public async Task HandleAsync_WithInvalidAddressFieldBuildingNumber_ShouldThrowInvalidAddressElementException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "", + BuildingNumber = "", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.AddressElement == "building number"); + } + + [Fact] + public async Task HandleAsync_WithInvalidAddressFieldZipCode_ShouldThrowInvalidAddressElementException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "", + BuildingNumber = "32", + ZipCode = "00323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.AddressElement == "zip code"); + } + + [Fact] + public async Task HandleAsync_WithInvalidAddressFieldStreet_ShouldThrowInvalidAddressElementException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "", + BuildingNumber = "", + ZipCode = "00-323", + Street = "" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.AddressElement == "street"); + } + + [Fact] + public async Task HandleAsync_WithInvalidBuyerName_ShouldThrowInvalidBuyerNameException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "", + BuildingNumber = "", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "", "valid@email.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync().Where(ex => ex.BuyerName == ""); + } + + [Fact] + public async Task HandleAsync_WithInvalidBuyerEmail_ShouldThrowInvalidBuyerEmailException() + { + // Arrange + var address = new Address() + { + City = "City", + Country = "Country", + ApartmentNumber = "", + BuildingNumber = "3", + ZipCode = "00-323", + Street = "Street" + }; + var cancellationToken = new CancellationToken(); + var createOrderCommand = new CreateOrder(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), + "Name", "invalidemail.com", address, Company.SwiftParcel); + var command = new CreateOrderSwiftParcel(createOrderCommand); + + var dateTimeNow = DateTime.Now; + var parcelDto = new ParcelDto() + { + Id = Guid.NewGuid(), + CustomerId = Guid.NewGuid(), + Description = "Sample Description", + Width = 0.2, + Height = 0.2, + Depth = 0.3, + Weight = 0.5, + Source = new AddressDto("", "", "", "", "", ""), + Destination = new AddressDto("", "", "", "", "", ""), + Priority = Priority.Low, + AtWeekend = false, + PickupDate = DateTime.Now, + DeliveryDate = DateTime.Now, + IsCompany = false, + VipPackage = false, + CreatedAt = DateTime.Now, + ValidTo = dateTimeNow.AddDays(1), + CalculatedPrice = 50.0m, // Set a sample price + PriceBreakDown = new List() + }; + _parcelsServiceClientMock.Setup(client => client.GetAsync(command.ParcelId)).ReturnsAsync(parcelDto); + _dateTimeProviderMock.Setup(provider => provider.Now).Returns(dateTimeNow); + + // Act + Func act = async () => await _createOrderSwiftParcelHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync(); + } + } +} diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj index 598ed7c..7c01bd6 100644 --- a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj @@ -26,6 +26,8 @@ + +