From 7c30ba02d5ac3de57522332e0fff78f703c5351d Mon Sep 17 00:00:00 2001 From: eggwhat Date: Fri, 19 Jan 2024 22:10:19 +0100 Subject: [PATCH] #116: add tests for addparcel handler --- .../SwiftParcel.Services.Parcels.sln | 12 + .../InvalidParcelDateTimeException.cs | 8 +- .../InvalidParcelDimensionException.cs | 5 +- .../Handlers/AddParcelHandlerTests.cs | 395 ++++++++++++++++++ .../GlobalUsings.cs | 3 + ...vices.Parcels.Application.UnitTests.csproj | 31 ++ 6 files changed, 451 insertions(+), 3 deletions(-) create mode 100644 SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/Commands/Handlers/AddParcelHandlerTests.cs create mode 100644 SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/GlobalUsings.cs create mode 100644 SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests.csproj diff --git a/SwiftParcel.Services.Parcels/SwiftParcel.Services.Parcels.sln b/SwiftParcel.Services.Parcels/SwiftParcel.Services.Parcels.sln index fc22361..b901c4d 100644 --- a/SwiftParcel.Services.Parcels/SwiftParcel.Services.Parcels.sln +++ b/SwiftParcel.Services.Parcels/SwiftParcel.Services.Parcels.sln @@ -21,6 +21,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SwiftParcel.Services.Parcel EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SwiftParcel.Services.Parcels.Infrastructure", "src\SwiftParcel.Services.Parcels.Infrastructure\SwiftParcel.Services.Parcels.Infrastructure\SwiftParcel.Services.Parcels.Infrastructure.csproj", "{098CDE85-D73E-4FBC-8349-742411248CA9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{46BEA55F-95AC-436A-9D3A-A7A04932FF88}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SwiftParcel.Services.Parcels.Application.UnitTests", "SwiftParcel.Services.Parcels.Application.UnitTests", "{BAAE3F52-A831-4508-AFBE-5539A461051A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SwiftParcel.Services.Parcels.Application.UnitTests", "tests\SwiftParcel.Services.Parcels.Application.UnitTests\SwiftParcel.Services.Parcels.Application.UnitTests\SwiftParcel.Services.Parcels.Application.UnitTests.csproj", "{6F67D351-065C-4E9B-A50D-DDEB58D7AB18}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -46,6 +52,10 @@ Global {098CDE85-D73E-4FBC-8349-742411248CA9}.Debug|Any CPU.Build.0 = Debug|Any CPU {098CDE85-D73E-4FBC-8349-742411248CA9}.Release|Any CPU.ActiveCfg = Release|Any CPU {098CDE85-D73E-4FBC-8349-742411248CA9}.Release|Any CPU.Build.0 = Release|Any CPU + {6F67D351-065C-4E9B-A50D-DDEB58D7AB18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F67D351-065C-4E9B-A50D-DDEB58D7AB18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F67D351-065C-4E9B-A50D-DDEB58D7AB18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F67D351-065C-4E9B-A50D-DDEB58D7AB18}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {DA4A44B7-960C-4E6D-AC68-EF00868B61FB} = {676BEB4D-578A-41D1-A70C-1B59E357237E} @@ -56,5 +66,7 @@ Global {DF4B8924-6E29-468A-98B0-B3CC5B42FF92} = {355ED247-1070-4DE4-BB87-148538CA28AD} {BE086060-031B-48E4-984A-95518F25E153} = {676BEB4D-578A-41D1-A70C-1B59E357237E} {098CDE85-D73E-4FBC-8349-742411248CA9} = {BE086060-031B-48E4-984A-95518F25E153} + {BAAE3F52-A831-4508-AFBE-5539A461051A} = {46BEA55F-95AC-436A-9D3A-A7A04932FF88} + {6F67D351-065C-4E9B-A50D-DDEB58D7AB18} = {BAAE3F52-A831-4508-AFBE-5539A461051A} EndGlobalSection EndGlobal diff --git a/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDateTimeException.cs b/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDateTimeException.cs index 3cd4a45..c75d85b 100644 --- a/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDateTimeException.cs +++ b/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDateTimeException.cs @@ -2,9 +2,13 @@ { public class InvalidParcelDateTimeException : DomainException { - public InvalidParcelDateTimeException(string element, string description) - : base("invalid_parcel_datetime_property", $"Parcel DateTime property ({element}) is invalid: {description}.") + public string Element { get; } + public string Value { get; } + public InvalidParcelDateTimeException(string element, string value) + : base("invalid_parcel_datetime_property", $"Parcel DateTime property ({element}) is invalid: {value}.") { + Element = element; + Value = value; } } } diff --git a/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDimensionException.cs b/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDimensionException.cs index 1248338..dc34ccd 100644 --- a/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDimensionException.cs +++ b/SwiftParcel.Services.Parcels/src/SwiftParcel.Services.Parcels.Core/SwiftParcel.Services.Parcels.Core/Exceptions/InvalidParcelDimensionException.cs @@ -8,11 +8,14 @@ namespace SwiftParcel.Services.Parcels.Core.Exceptions { public class InvalidParcelDimensionException : DomainException { + public string DimensionType { get; } + public double DimensionValue { get; } public InvalidParcelDimensionException(string dimensionType, double dimensionValue) : base("invalid_parcel_dimension", $"Parcel dimension ({dimensionType}) is invalid: {dimensionValue}." + $" It must be greater or equal 0.2 and less than 8.") { - + DimensionType = dimensionType; + DimensionValue = dimensionValue; } } } diff --git a/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/Commands/Handlers/AddParcelHandlerTests.cs b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/Commands/Handlers/AddParcelHandlerTests.cs new file mode 100644 index 0000000..0724761 --- /dev/null +++ b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/Commands/Handlers/AddParcelHandlerTests.cs @@ -0,0 +1,395 @@ +using SwiftParcel.Services.Parcels.Application.Commands; +using SwiftParcel.Services.Parcels.Application.Commands.Handlers; +using SwiftParcel.Services.Parcels.Application.DTO; +using SwiftParcel.Services.Parcels.Application.Exceptions; +using SwiftParcel.Services.Parcels.Application.Services; +using SwiftParcel.Services.Parcels.Application.Services.Clients; +using SwiftParcel.Services.Parcels.Core.Entities; +using SwiftParcel.Services.Parcels.Core.Exceptions; +using SwiftParcel.Services.Parcels.Core.Repositories; + +namespace SwiftParcel.Services.Parcels.Application.UnitTests +{ + public class AddParcelHandlerTests + { + private readonly AddParcelHandler _addParcelHandler; + private readonly Mock _parcelRepositoryMock; + private readonly Mock _customerRepositoryMock; + private readonly Mock _pricingServiceClientMock; + private readonly Mock _dateTimeProviderMock; + private readonly Mock _messageBrokerMock; + private readonly Mock _lecturerApiServiceClientMock; + + public AddParcelHandlerTests() + { + _parcelRepositoryMock = new Mock(); + _customerRepositoryMock = new Mock(); + _pricingServiceClientMock = new Mock(); + _dateTimeProviderMock = new Mock(); + _messageBrokerMock = new Mock(); + _lecturerApiServiceClientMock = new Mock(); + _addParcelHandler = new AddParcelHandler(_parcelRepositoryMock.Object, _customerRepositoryMock.Object, + _pricingServiceClientMock.Object, _dateTimeProviderMock.Object, _messageBrokerMock.Object, + _lecturerApiServiceClientMock.Object); + } + + [Fact] + public async Task HandleAsync_WithNotExistingCustomer_ThrowsCustomerNotFoundException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString(), deliveryDate.ToString(), true, true); + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(false); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidPriorityValue_ThrowsInvalidParcelPriorityException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + "invalidPriority", true, pickupDate.ToString(), deliveryDate.ToString(), true, true); + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.Priority == command.Priority); + } + + [Fact] + public async Task HandleAsync_WithInvalidPickupDateFormat_ThrowsInvalidParcelDateTimeException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, "invalidDateTime", + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.Value == command.PickupDate && ex.Element == "pickup_date"); + } + + [Fact] + public async Task HandleAsync_WithInvalidDeliveryDateFormat_ThrowsInvalidParcelDateTimeException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddSeconds(10); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + "invalidDateTime", true, true); + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.Value == command.DeliveryDate && ex.Element == "delivery_date"); + } + + [Fact] + public async Task HandleAsync_WithNullPrice_ThrowsPricingServiceException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), true, false, true)) + .ReturnsAsync((ParcelDeliveryPricingDto?)null); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidDescription_ThrowsInvalidParcelDescriptionException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + CustomerDiscount = 0.0m, + OrderDiscountPrice = 0.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidWidth_ThrowsInvalidParcelDimensionException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var invalidDimensionValue = 200; + var command = new AddParcel(parcelId, customerId, "desc", invalidDimensionValue, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.DimensionType == "width" && ex.DimensionValue == 200); + } + + [Fact] + public async Task HandleAsync_WithInvalidHeight_ThrowsInvalidParcelDimensionException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var invalidDimensionValue = 200; + var command = new AddParcel(parcelId, customerId, "desc", 0.2, invalidDimensionValue, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.DimensionType == "height" && ex.DimensionValue == 200); + } + + [Fact] + public async Task HandleAsync_WithInvalidDepth_ThrowsInvalidParcelDimensionException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var invalidDimensionValue = 200; + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, invalidDimensionValue, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync() + .Where(ex => ex.DimensionType == "depth" && ex.DimensionValue == 200); + } + + [Fact] + public async Task HandleAsync_WithInvalidWeight_ThrowsInvalidParcelWeightException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 1000, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidPickupDate_ThrowsInvalidParcelPickupDateException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now.AddDays(1); + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + _dateTimeProviderMock.Setup(x => x.Now).Returns(DateTime.Now.AddMinutes(100)); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task HandleAsync_WithInvalidDeliveryDate_ThrowsInvalidParcelDeliveryDateException() + { + // Arrange + var parcelId = Guid.NewGuid(); + var customerId = Guid.NewGuid(); + var pickupDate = DateTime.Now.AddMinutes(20); + var deliveryDate = DateTime.Now; + var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + "street", "12", "23", "city", "00-343", "country", + "street", "12", "23", "city", "00-343", "country", + Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + var parcelDeliveryPricing = new ParcelDeliveryPricingDto + { + OrderPrice = 10.0m, + FinalPrice = 10.0m, + PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + }; + + _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + .ReturnsAsync(parcelDeliveryPricing); + + // Act & Assert + Func act = async () => await _addParcelHandler.HandleAsync(command); + await act.Should().ThrowAsync(); + } + + //[Fact] + //public async Task HandleAsync_WithInvalidSourceAddressStreet_ThrowsInvalidParcelDeliveryDateException() + //{ + // // Arrange + // var parcelId = Guid.NewGuid(); + // var customerId = Guid.NewGuid(); + // var pickupDate = DateTime.Now.AddMinutes(20); + // var deliveryDate = DateTime.Now; + // var command = new AddParcel(parcelId, customerId, "desc", 0.2, 0.2, 0.2, 0.5, + // "street", "12", "23", "city", "00-343", "country", + // "street", "12", "23", "city", "00-343", "country", + // Priority.Low.ToString(), true, pickupDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + // deliveryDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), true, true); + // var parcelDeliveryPricing = new ParcelDeliveryPricingDto + // { + // OrderPrice = 10.0m, + // FinalPrice = 10.0m, + // PriceBreakDown = new List() { new PriceBreakDownItem(10.0m, "Pln", "desc") } + // }; + + // _customerRepositoryMock.Setup(x => x.ExistsAsync(It.IsAny())).ReturnsAsync(true); + // _pricingServiceClientMock.Setup(x => x.GetParcelDeliveryPriceAsync(It.IsAny(), It.IsAny(), + // It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), false, true, true)) + // .ReturnsAsync(parcelDeliveryPricing); + + // // Act & Assert + // Func act = async () => await _addParcelHandler.HandleAsync(command); + // await act.Should().ThrowAsync(); + //} + } +} \ No newline at end of file diff --git a/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/GlobalUsings.cs b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/GlobalUsings.cs new file mode 100644 index 0000000..4d4f405 --- /dev/null +++ b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.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.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests.csproj b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests.csproj new file mode 100644 index 0000000..5479c00 --- /dev/null +++ b/SwiftParcel.Services.Parcels/tests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests/SwiftParcel.Services.Parcels.Application.UnitTests.csproj @@ -0,0 +1,31 @@ + + + + net7.0 + enable + enable + + false + true + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + +