From 75e87459aa8e70a2e580f28206011467fb66b6ae Mon Sep 17 00:00:00 2001 From: eggwhat Date: Thu, 18 Jan 2024 18:19:51 +0100 Subject: [PATCH] #116: create project structure and add first tests --- .../SwiftParcel.Services.Orders.sln | 12 +++ .../Commands/CreateOrderHandlerTests.cs | 97 +++++++++++++++++++ .../GlobalUsings.cs | 3 + ...rvices.Orders.Application.UnitTests.csproj | 31 ++++++ 4 files changed, 143 insertions(+) create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderHandlerTests.cs create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/GlobalUsings.cs create mode 100644 SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj diff --git a/SwiftParcel.Services.Orders/SwiftParcel.Services.Orders.sln b/SwiftParcel.Services.Orders/SwiftParcel.Services.Orders.sln index 1359455..8e5be58 100644 --- a/SwiftParcel.Services.Orders/SwiftParcel.Services.Orders.sln +++ b/SwiftParcel.Services.Orders/SwiftParcel.Services.Orders.sln @@ -21,6 +21,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SwiftParcel.Services.Orders EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SwiftParcel.Services.Orders.Infrastructure", "src\SwiftParcel.Services.Orders.Infrastructure\SwiftParcel.Services.Orders.Infrastructure\SwiftParcel.Services.Orders.Infrastructure.csproj", "{1256CFDD-28BC-4233-A2E2-11CC5925C154}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{EDFB6002-392F-431B-AAE2-DB2B1414E097}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SwiftParcel.Services.Orders.Application.UnitTests", "SwiftParcel.Services.Orders.Application.UnitTests", "{D0F373EE-A9D3-45BF-82D0-C2198C734C6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SwiftParcel.Services.Orders.Application.UnitTests", "tests\SwiftParcel.Services.Orders.Application.UnitTests\SwiftParcel.Services.Orders.Application.UnitTests\SwiftParcel.Services.Orders.Application.UnitTests.csproj", "{54AAAE25-748F-4F96-A197-D42986F388F2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -46,6 +52,10 @@ Global {1256CFDD-28BC-4233-A2E2-11CC5925C154}.Debug|Any CPU.Build.0 = Debug|Any CPU {1256CFDD-28BC-4233-A2E2-11CC5925C154}.Release|Any CPU.ActiveCfg = Release|Any CPU {1256CFDD-28BC-4233-A2E2-11CC5925C154}.Release|Any CPU.Build.0 = Release|Any CPU + {54AAAE25-748F-4F96-A197-D42986F388F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54AAAE25-748F-4F96-A197-D42986F388F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54AAAE25-748F-4F96-A197-D42986F388F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54AAAE25-748F-4F96-A197-D42986F388F2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {6DA713C4-A10F-4248-B54C-9AE6AFB1E882} = {32E2CA73-681D-46E3-BFF4-F9DD0126E32A} @@ -56,5 +66,7 @@ Global {E894C4D2-05B4-479B-93E3-C49CDDF49B9C} = {58C56B7C-E6D8-4CBD-B730-3F307C1DB930} {69CF0B3C-64D8-44EE-AC46-7066C12E81DB} = {32E2CA73-681D-46E3-BFF4-F9DD0126E32A} {1256CFDD-28BC-4233-A2E2-11CC5925C154} = {69CF0B3C-64D8-44EE-AC46-7066C12E81DB} + {D0F373EE-A9D3-45BF-82D0-C2198C734C6F} = {EDFB6002-392F-431B-AAE2-DB2B1414E097} + {54AAAE25-748F-4F96-A197-D42986F388F2} = {D0F373EE-A9D3-45BF-82D0-C2198C734C6F} EndGlobalSection EndGlobal diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderHandlerTests.cs b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderHandlerTests.cs new file mode 100644 index 0000000..836747e --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/Commands/CreateOrderHandlerTests.cs @@ -0,0 +1,97 @@ +using SwiftParcel.Services.Orders.Application.Commands; +using SwiftParcel.Services.Orders.Application.Commands.Handlers; +using SwiftParcel.Services.Orders.Application.Exceptions; +using SwiftParcel.Services.Orders.Core.Entities; +using SwiftParcel.Services.Orders.Core.Exceptions; +using SwiftParcel.Services.Orders.Core.Repositories; +using Convey.CQRS.Commands; + +namespace SwiftParcel.Services.Orders.Application.UnitTests.Commands +{ + public class CreateOrderHandlerTests + { + private readonly CreateOrderHandler _createOrderHandler; + private readonly Mock _customerRepositoryMock; + private readonly Mock _commandDispatcherMock; + + public CreateOrderHandlerTests() + { + _customerRepositoryMock = new Mock(); + _commandDispatcherMock = new Mock(); + _createOrderHandler = new CreateOrderHandler(_customerRepositoryMock.Object, _commandDispatcherMock.Object); + } + + [Fact] + public async Task HandleAsync_WithValidCustomerAndSwiftParcelCompany_ShouldSendCreateOrderSwiftParcelCommand() + { + // Arrange + var orderId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var parcelId = Guid.NewGuid(); + var command = new CreateOrder(orderId, customerId, parcelId, "", "", new Address(), Company.SwiftParcel); + var cancellationToken = new CancellationToken(); + + _customerRepositoryMock.Setup(repo => repo.ExistsAsync(command.CustomerId)).ReturnsAsync(true); + + // Act + await _createOrderHandler.HandleAsync(command, cancellationToken); + + // Assert + _commandDispatcherMock.Verify(dispatcher => dispatcher.SendAsync(It.IsAny(), cancellationToken), Times.Once); + } + + [Fact] + public async Task HandleAsync_WithValidCustomerAndMiniCurrierCompany_ShouldSendCreateOrderMiniCurrierCommand() + { + // Arrange + var orderId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var parcelId = Guid.NewGuid(); + var command = new CreateOrder(orderId, customerId, parcelId, "", "", new Address(), Company.MiniCurrier); + var cancellationToken = new CancellationToken(); + + _customerRepositoryMock.Setup(repo => repo.ExistsAsync(command.CustomerId)).ReturnsAsync(true); + + // Act + await _createOrderHandler.HandleAsync(command, cancellationToken); + + // Assert + _commandDispatcherMock.Verify(dispatcher => dispatcher.SendAsync(It.IsAny(), cancellationToken), Times.Once); + } + + [Fact] + public async Task HandleAsync_WithInvalidCustomer_ShouldThrowCustomerNotFoundException() + { + // Arrange + var orderId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var parcelId = Guid.NewGuid(); + var command = new CreateOrder(orderId, customerId, parcelId, "", "", new Address(), Company.MiniCurrier); + var cancellationToken = new CancellationToken(); + + _customerRepositoryMock.Setup(repo => repo.ExistsAsync(command.CustomerId)).ReturnsAsync(false); + + // Act & Assert + + Func act = async () => await _createOrderHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidCompany_ShouldThrowCompanyNotFoundException() + { + // Arrange + var orderId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var parcelId = Guid.NewGuid(); + var command = new CreateOrder(orderId, customerId, parcelId, "", "", new Address(), (Company)int.MaxValue); + var cancellationToken = new CancellationToken(); + + _customerRepositoryMock.Setup(repo => repo.ExistsAsync(command.CustomerId)).ReturnsAsync(true); + + // Act & Assert + Func act = async () => await _createOrderHandler.HandleAsync(command, cancellationToken); + await act.Should().ThrowAsync(); + } + } +} diff --git a/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/GlobalUsings.cs b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/GlobalUsings.cs new file mode 100644 index 0000000..4d4f405 --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using Xunit; +global using Moq; +global using FluentAssertions; \ No newline at end of file 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 new file mode 100644 index 0000000..598ed7c --- /dev/null +++ b/SwiftParcel.Services.Orders/tests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests/SwiftParcel.Services.Orders.Application.UnitTests.csproj @@ -0,0 +1,31 @@ + + + + net6.0 + enable + disable + + false + true + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + +