diff --git a/Chapter-2-modules-separation/Docs/ArchitectureDecisionLog/0018-select-assertion-framework.adoc b/Chapter-2-modules-separation/Docs/ArchitectureDecisionLog/0018-select-assertion-framework.adoc
new file mode 100644
index 00000000..1fadf4e2
--- /dev/null
+++ b/Chapter-2-modules-separation/Docs/ArchitectureDecisionLog/0018-select-assertion-framework.adoc
@@ -0,0 +1,44 @@
+= 18. Select Fluent Assertion Alternative Due to Licensing Issue
+
+Date: 2025-09-04
+
+== Problem
+
+We have been using Fluent Assertions as an assertion library to enhance the readability and maintainability of our test code through fluent interfaces. However, starting from version 8, Fluent Assertions has transitioned to a paid NuGet package. Given the current pricing model, the cost outweighs the benefits it provides to our project. Consequently, we are evaluating open-source alternatives to replace Fluent Assertions.
+
+=== Option 1: NFluentAssertions
+
+This library is a fork of Fluent Assertions, allowing us to transition without modifying our existing assertions—only a NuGet package change is required.
+
+The project is maintained by a separate group of developers, raising concerns about its long-term stability and ongoing support.
+
+Repository: https://github.com/tpierrain/NFluent
+
+=== Option 2: MSTest Assertions
+
+These assertions are the standard Microsoft .NET testing utilities, maintained and updated with each .NET release.
+
+They offer a reliable and well-supported alternative but lack the fluent syntax, resulting in assertions that are less readable and more verbose.
+
+Documentation: https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-mstest
+
+=== Option 3: Shouldly
+
+Shouldly provides a similar fluent interface to Fluent Assertions with minor syntactic differences.
+
+It is widely supported, maintained by an active community of contributors, and backed by sponsors, ensuring its long-term viability.
+
+The primary downside is the need to refactor existing assertions to align with Shouldly’s syntax.
+
+Repository: https://github.com/shouldly/shouldly
+
+== Decision
+
+After a thorough analysis of available options, we have decided to migrate from Fluent Assertions to Shouldly.
+
+== Consequences
+- Improved Long-Term Stability: Shouldly is actively maintained and supported by the open-source community, reducing the risk of unexpected licensing changes.
+- Maintainability & Readability: Shouldly retains a fluent syntax, ensuring our tests remain easy to read and maintain.
+- Refactoring Effort: Transitioning to Shouldly requires refactoring existing assertions, introducing short-term overhead but ensuring long-term sustainability.
+- Cost Reduction: Moving away from a paid assertion library eliminates unnecessary expenditure while maintaining similar functionality.
+- Ecosystem Alignment: Shouldly is widely adopted in the .NET ecosystem, ensuring compatibility and integration with modern development workflows.
\ No newline at end of file
diff --git a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/Fitnet.Common.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/Fitnet.Common.IntegrationTests.csproj
index 56679c8f..ce27d10a 100644
--- a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/Fitnet.Common.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/Fitnet.Common.IntegrationTests.csproj
@@ -7,7 +7,6 @@
-
diff --git a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/TestEngine/Database/IDatabaseConfiguration.cs b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/TestEngine/Database/IDatabaseConfiguration.cs
index 649bcc2f..21347eaf 100644
--- a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/TestEngine/Database/IDatabaseConfiguration.cs
+++ b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.IntegrationTests/TestEngine/Database/IDatabaseConfiguration.cs
@@ -2,5 +2,5 @@ namespace EvolutionaryArchitecture.Fitnet.Common.IntegrationTests.TestEngine.Dat
public interface IDatabaseConfiguration
{
- public Dictionary Get();
-}
\ No newline at end of file
+ Dictionary Get();
+}
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/Fitnet.Common.Api.UnitTests.csproj b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/Fitnet.Common.Api.UnitTests.csproj
index 5da3e17c..bf1f405d 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/Fitnet.Common.Api.UnitTests.csproj
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/Fitnet.Common.Api.UnitTests.csproj
@@ -9,9 +9,9 @@
-
+
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalExceptionHandlerTests.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalExceptionHandlerTests.cs
index 12e1ed37..3e8720d1 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalExceptionHandlerTests.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalExceptionHandlerTests.cs
@@ -22,10 +22,10 @@ internal async Task Given_business_rule_validation_exception_Then_returns_confli
await exceptionHandler.TryHandleAsync(_context, new BusinessRuleValidationException(exceptionMessage), default);
// Assert
- _context.Response.StatusCode.Should().Be((int)HttpStatusCode.Conflict);
+ _context.Response.StatusCode.ShouldBe((int)HttpStatusCode.Conflict);
var responseMessage = await GetExceptionResponseMessage();
- responseMessage.Title.Should().Be(exceptionMessage);
+ responseMessage.Title.ShouldBe(exceptionMessage);
}
[Fact]
@@ -40,10 +40,10 @@ internal async Task Given_other_than_business_rule_validation_exception_Then_ret
await exceptionHandler.TryHandleAsync(_context, new InvalidCastException("test"), CancellationToken.None);
// Assert
- _context.Response.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError);
+ _context.Response.StatusCode.ShouldBe((int)HttpStatusCode.InternalServerError);
var responseMessage = await GetExceptionResponseMessage();
- responseMessage.Title.Should().Be(exceptionMessage);
+ responseMessage.Title.ShouldBe(exceptionMessage);
}
private static DefaultHttpContext GetHttpContext() =>
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalUsings.cs
index a5ff7216..639bd117 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Api.UnitTests/GlobalUsings.cs
@@ -1,6 +1,6 @@
global using System.Net;
global using Xunit;
-global using FluentAssertions;
global using Microsoft.AspNetCore.Http;
global using Newtonsoft.Json;
-global using NSubstitute;
\ No newline at end of file
+global using NSubstitute;
+global using Shouldly;
\ No newline at end of file
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/BusinessRulesEngine/BusinessRuleValidatorTests.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/BusinessRulesEngine/BusinessRuleValidatorTests.cs
index d4db0562..c738f866 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/BusinessRulesEngine/BusinessRuleValidatorTests.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/BusinessRulesEngine/BusinessRuleValidatorTests.cs
@@ -13,7 +13,7 @@ internal void Given_concrete_business_rule_which_is_met_Then_validation_should_p
var act = () => BusinessRuleValidator.Validate(new FakeBusinessRule(20));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
[Fact]
@@ -25,6 +25,7 @@ internal void Given_concrete_business_rule_which_is_not_met_Then_validation_shou
var act = () => BusinessRuleValidator.Validate(new FakeBusinessRule(1));
// Assert
- act.Should().Throw().WithMessage("Fake business rule was not met");
+ var exception = act.ShouldThrow();
+ exception.Message.ShouldBe("Fake business rule was not met");
}
}
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/Fitnet.Common.Core.UnitTests.csproj b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/Fitnet.Common.Core.UnitTests.csproj
index 6d41db9a..e7c029f4 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/Fitnet.Common.Core.UnitTests.csproj
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/Fitnet.Common.Core.UnitTests.csproj
@@ -9,8 +9,8 @@
-
+
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/GlobalUsings.cs
index 7fef4b0e..bd8299f6 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Core.UnitTests/GlobalUsings.cs
@@ -1,2 +1,2 @@
global using Xunit;
-global using FluentAssertions;
\ No newline at end of file
+global using Shouldly;
\ No newline at end of file
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Events/EventBus/InMemory/InMemoryEventBusTests.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Events/EventBus/InMemory/InMemoryEventBusTests.cs
index 8ac4e17d..55720102 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Events/EventBus/InMemory/InMemoryEventBusTests.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Events/EventBus/InMemory/InMemoryEventBusTests.cs
@@ -22,7 +22,7 @@ internal async Task Given_valid_event_published_Then_event_should_be_consumed()
await eventBus!.PublishAsync(fakeEvent, CancellationToken.None);
// Assert
- fakeEvent.Consumed.Should().BeTrue();
+ fakeEvent.Consumed.ShouldBeTrue();
}
private IEventBus GetEventBus() =>
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Fitnet.Common.Infrastructure.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Fitnet.Common.Infrastructure.IntegrationTests.csproj
index 7b539ac3..436efd54 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Fitnet.Common.Infrastructure.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/Fitnet.Common.Infrastructure.IntegrationTests.csproj
@@ -7,6 +7,7 @@
+
diff --git a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/GlobalUsings.cs
index fda6a122..baf0603c 100644
--- a/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Common/Tests/Fitnet.Common.Infrastructure.IntegrationTests/GlobalUsings.cs
@@ -1,5 +1,5 @@
global using System.Reflection;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.AspNetCore.Mvc.Testing;
+global using Shouldly;
global using Xunit;
-global using FluentAssertions;
\ No newline at end of file
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/Fitnet.Contracts.Core.UnitTests.csproj b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/Fitnet.Contracts.Core.UnitTests.csproj
index 707d1a0c..6e40f5c4 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/Fitnet.Contracts.Core.UnitTests.csproj
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/Fitnet.Contracts.Core.UnitTests.csproj
@@ -6,7 +6,7 @@
-
+
all
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/GlobalUsings.cs
index 3fd6d921..beabd357 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/GlobalUsings.cs
@@ -1,3 +1,3 @@
global using System.Collections;
-global using FluentAssertions;
-global using Xunit;
\ No newline at end of file
+global using Shouldly;
+global using Xunit;
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/ContractCanBePreparedOnlyForAdultRuleTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/ContractCanBePreparedOnlyForAdultRuleTests.cs
index 8d526dae..92ab3b9e 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/ContractCanBePreparedOnlyForAdultRuleTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/ContractCanBePreparedOnlyForAdultRuleTests.cs
@@ -14,7 +14,8 @@ internal void Given_customer_age_which_is_less_than_18_Then_validation_should_th
var act = () => BusinessRuleValidator.Validate(new ContractCanBePreparedOnlyForAdultRule(17));
// Assert
- act.Should().Throw().WithMessage("Contract can not be prepared for a person who is not adult");
+ var exception = act.ShouldThrow();
+ exception.Message.ShouldBe("Contract can not be prepared for a person who is not adult");
}
[Fact]
@@ -26,7 +27,7 @@ internal void Given_customer_age_which_is_equal_to_18_Then_validation_should_pas
var act = () => BusinessRuleValidator.Validate(new ContractCanBePreparedOnlyForAdultRule(18));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
[Fact]
@@ -38,6 +39,6 @@ internal void Given_customer_age_which_is_greater_than_18_Then_validation_should
var act = () => BusinessRuleValidator.Validate(new ContractCanBePreparedOnlyForAdultRule(19));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
}
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/CustomerMustBeSmallerThanMaximumHeightLimitRuleTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/CustomerMustBeSmallerThanMaximumHeightLimitRuleTests.cs
index b1d89425..508b2fc0 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/CustomerMustBeSmallerThanMaximumHeightLimitRuleTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/CustomerMustBeSmallerThanMaximumHeightLimitRuleTests.cs
@@ -15,7 +15,8 @@ internal void Given_customer_height_which_is_greater_than_maximum_height_limit_T
var act = () => BusinessRuleValidator.Validate(new CustomerMustBeSmallerThanMaximumHeightLimitRule(height));
// Assert
- act.Should().Throw().WithMessage("Customer height must fit maximum limit for gym instruments");
+ var exception = act.ShouldThrow();
+ exception.Message.ShouldBe("Customer height must fit maximum limit for gym instruments");
}
[Fact]
@@ -28,7 +29,7 @@ internal void Given_customer_height_which_is_equal_to_maximum_height_limit_Then_
var act = () => BusinessRuleValidator.Validate(new CustomerMustBeSmallerThanMaximumHeightLimitRule(height));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
[Fact]
@@ -41,6 +42,6 @@ internal void Given_customer_height_which_is_less_than_maximum_height_limit_Then
var act = () => BusinessRuleValidator.Validate(new CustomerMustBeSmallerThanMaximumHeightLimitRule(height));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
}
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/PreviousContractHasToBeSignedRuleTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/PreviousContractHasToBeSignedRuleTests.cs
index 67ca924c..c38bb31b 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/PreviousContractHasToBeSignedRuleTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/PrepareContract/BusinessRules/PreviousContractHasToBeSignedRuleTests.cs
@@ -14,7 +14,7 @@ internal void Given_previous_contract_signed_Then_validation_should_pass()
var act = () => BusinessRuleValidator.Validate(new PreviousContractHasToBeSignedRule(true));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
[Fact]
@@ -26,10 +26,9 @@ internal void Given_previous_contract_not_exists_Then_validation_should_pass()
var act = () => BusinessRuleValidator.Validate(new PreviousContractHasToBeSignedRule(null));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
-
[Fact]
internal void Given_previous_contract_unsigned_Then_validation_should_throw()
{
@@ -39,6 +38,7 @@ internal void Given_previous_contract_unsigned_Then_validation_should_throw()
var act = () => BusinessRuleValidator.Validate(new PreviousContractHasToBeSignedRule(false));
// Assert
- act.Should().Throw().WithMessage("Previous contract must be signed by the customer");
+ var exception = act.ShouldThrow();
+ exception.Message.ShouldBe("Previous contract must be signed by the customer");
}
}
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/BusinessRules/ContractCanOnlyBeSignedWithin30DaysFromPreparationTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/BusinessRules/ContractCanOnlyBeSignedWithin30DaysFromPreparationTests.cs
index f5ef8321..aaaa5c08 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/BusinessRules/ContractCanOnlyBeSignedWithin30DaysFromPreparationTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/BusinessRules/ContractCanOnlyBeSignedWithin30DaysFromPreparationTests.cs
@@ -17,8 +17,8 @@ internal void Given_signed_at_date_which_is_more_than_30_days_from_prepared_at_d
DateTimeOffset.Now.AddDays(31)));
// Assert
- act.Should().Throw().WithMessage(
- "Contract can not be signed because more than 30 days have passed from the contract preparation");
+ var exception = act.ShouldThrow();
+ exception.Message.ShouldBe("Contract can not be signed because more than 30 days have passed from the contract preparation");
}
[Fact]
@@ -33,7 +33,7 @@ internal void Given_signed_at_date_which_is_30_days_from_prepared_at_date_Then_v
DateTimeOffset.Now.AddDays(30)));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
[Fact]
@@ -48,6 +48,6 @@ internal void Given_signed_at_date_which_is_less_than_30_days_from_prepared_at_d
DateTimeOffset.Now.AddDays(29)));
// Assert
- act.Should().NotThrow();
+ act.ShouldNotThrow();
}
}
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/SignContractTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/SignContractTests.cs
index 5324c7bc..b2cc2e82 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/SignContractTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.Core.UnitTests/SignContract/SignContractTests.cs
@@ -19,7 +19,7 @@ internal void Given_sign_contract_Then_expiration_date_is_set_to_contract_durati
contract.Sign(signedAt, fakeNow);
// Assert
- contract.ExpiringAt.Should().Be(expectedExpirationDate);
+ contract.ExpiringAt.ShouldBe(expectedExpirationDate);
}
private static Contract PrepareContract(DateTimeOffset preparedAt)
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/Fitnet.Contracts.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/Fitnet.Contracts.IntegrationTests.csproj
index f1322f0d..2eba993c 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/Fitnet.Contracts.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/Fitnet.Contracts.IntegrationTests.csproj
@@ -9,6 +9,7 @@
+
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/GlobalUsings.cs
index ca39d403..78b87c20 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/GlobalUsings.cs
@@ -2,5 +2,5 @@
global using System.Net.Http.Json;
global using Xunit;
global using Bogus;
-global using FluentAssertions;
-global using NSubstitute;
\ No newline at end of file
+global using NSubstitute;
+global using Shouldly;
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/PrepareContract/PrepareContractTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/PrepareContract/PrepareContractTests.cs
index 68d5bca3..5d4efcd6 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/PrepareContract/PrepareContractTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/PrepareContract/PrepareContractTests.cs
@@ -26,7 +26,7 @@ internal async Task Given_valid_contract_preparation_request_Then_should_return_
var prepareContractResponse = await PrepareCorrectContract(requestParameters);
// Assert
- prepareContractResponse.Should().HaveStatusCode(HttpStatusCode.Created);
+ prepareContractResponse.StatusCode.ShouldBe(HttpStatusCode.Created);
}
[Fact]
@@ -44,9 +44,8 @@ internal async Task Given_contract_preparation_request_with_invalid_age_Then_sho
// Assert
var responseMessage = await prepareContractResponse.Content.ReadFromJsonAsync();
- responseMessage?.Status.Should().Be((int)HttpStatusCode.Conflict);
- responseMessage?.Title.Should()
- .Be("Contract can not be prepared for a person who is not adult");
+ responseMessage?.Status.ShouldBe((int)HttpStatusCode.Conflict);
+ responseMessage?.Title.ShouldBe("Contract can not be prepared for a person who is not adult");
}
[Fact]
@@ -64,9 +63,8 @@ internal async Task Given_contract_preparation_request_with_invalid_height_Then_
// Assert
var responseMessage = await prepareContractResponse.Content.ReadFromJsonAsync();
- responseMessage?.Status.Should().Be((int)HttpStatusCode.Conflict);
- responseMessage?.Title.Should()
- .Be("Customer height must fit maximum limit for gym instruments");
+ responseMessage?.Status.ShouldBe((int)HttpStatusCode.Conflict);
+ responseMessage?.Title.ShouldBe("Customer height must fit maximum limit for gym instruments");
}
[Fact]
@@ -82,9 +80,8 @@ internal async Task Given_contract_preparation_request_When_contract_for_custome
// Assert
var responseMessage = await prepareContractResponse.Content.ReadFromJsonAsync();
- responseMessage?.Status.Should().Be((int)HttpStatusCode.Conflict);
- responseMessage?.Title.Should()
- .Be("Previous contract must be signed by the customer");
+ responseMessage?.Status.ShouldBe((int)HttpStatusCode.Conflict);
+ responseMessage?.Title.ShouldBe("Previous contract must be signed by the customer");
}
private async Task PrepareCorrectContract(PrepareContractRequestParameters requestParameters, Guid? customerId = null)
diff --git a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/SignContract/SignContractTests.cs b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/SignContract/SignContractTests.cs
index 7a76d355..8fa2deff 100644
--- a/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/SignContract/SignContractTests.cs
+++ b/Chapter-2-modules-separation/Src/Contracts/Tests/Fitnet.Contracts.IntegrationTests/SignContract/SignContractTests.cs
@@ -35,7 +35,7 @@ internal async Task Given_valid_contract_signature_request_Then_should_return_no
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
- signContractResponse.Should().HaveStatusCode(HttpStatusCode.NoContent);
+ signContractResponse.StatusCode.ShouldBe(HttpStatusCode.NoContent);
}
[Fact]
@@ -50,12 +50,11 @@ internal async Task Given_contract_signature_request_with_not_existing_id_Then_s
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
- signContractResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
+ signContractResponse.StatusCode.ShouldBe(HttpStatusCode.NotFound);
}
[Fact]
- internal async Task
- Given_contract_signature_request_with_invalid_signed_date_Then_should_return_conflict_status_code()
+ internal async Task Given_contract_signature_request_with_invalid_signed_date_Then_should_return_conflict_status_code()
{
// Arrange
var preparedContractId = await PrepareContract();
@@ -68,12 +67,11 @@ internal async Task
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
- signContractResponse.Should().HaveStatusCode(HttpStatusCode.Conflict);
+ signContractResponse.StatusCode.ShouldBe(HttpStatusCode.Conflict);
var responseMessage = await signContractResponse.Content.ReadFromJsonAsync();
- responseMessage?.Status.Should().Be((int)HttpStatusCode.Conflict);
- responseMessage?.Title.Should()
- .Be("Contract can not be signed because more than 30 days have passed from the contract preparation");
+ responseMessage?.Status.ShouldBe((int)HttpStatusCode.Conflict);
+ responseMessage?.Title.ShouldBe("Contract can not be signed because more than 30 days have passed from the contract preparation");
}
private async Task PrepareContract()
diff --git a/Chapter-2-modules-separation/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/Fitnet.Offers.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/Fitnet.Offers.IntegrationTests.csproj
index ac19e65c..e972d312 100644
--- a/Chapter-2-modules-separation/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/Fitnet.Offers.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/Fitnet.Offers.IntegrationTests.csproj
@@ -9,6 +9,7 @@
+
diff --git a/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Database/PassEntityConfiguration.cs b/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Database/PassEntityConfiguration.cs
index 1162b184..e057d5c1 100644
--- a/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Database/PassEntityConfiguration.cs
+++ b/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Database/PassEntityConfiguration.cs
@@ -10,7 +10,6 @@ public void Configure(EntityTypeBuilder builder)
builder.ToTable("Passes");
builder.HasKey(pass => pass.Id);
builder.Property(pass => pass.CustomerId).IsRequired();
- builder.Property(pass => pass.From).IsRequired();
builder.Property(pass => pass.To).IsRequired();
}
-}
\ No newline at end of file
+}
diff --git a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/Fitnet.Passes.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/Fitnet.Passes.IntegrationTests.csproj
index 78031737..5bcc69ce 100644
--- a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/Fitnet.Passes.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/Fitnet.Passes.IntegrationTests.csproj
@@ -9,6 +9,7 @@
+
diff --git a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/GlobalUsings.cs
index 4268d5b3..a3ee340b 100644
--- a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/GlobalUsings.cs
@@ -3,5 +3,5 @@
global using Xunit;
global using Microsoft.AspNetCore.Mvc.Testing;
global using Bogus;
-global using FluentAssertions;
-global using NSubstitute;
\ No newline at end of file
+global using NSubstitute;
+global using Shouldly;
\ No newline at end of file
diff --git a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/MarkPassAsExpired/MarkPassAsExpiredTests.cs b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/MarkPassAsExpired/MarkPassAsExpiredTests.cs
index e7c48395..47ea5555 100644
--- a/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/MarkPassAsExpired/MarkPassAsExpiredTests.cs
+++ b/Chapter-2-modules-separation/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/MarkPassAsExpired/MarkPassAsExpiredTests.cs
@@ -1,13 +1,13 @@
namespace EvolutionaryArchitecture.Fitnet.Passes.IntegrationTests.MarkPassAsExpired;
-using Common.Infrastructure.Events.EventBus;
-using EvolutionaryArchitecture.Fitnet.Common.IntegrationTests.TestEngine.Database;
-using EvolutionaryArchitecture.Fitnet.Common.IntegrationTests.TestEngine.IntegrationEvents.Handlers;
using Api;
using Api.GetAllPasses;
+using Common.Infrastructure.Events.EventBus;
using Common.IntegrationTests.TestEngine;
using Common.IntegrationTests.TestEngine.Configuration;
using Contracts.IntegrationEvents;
+using EvolutionaryArchitecture.Fitnet.Common.IntegrationTests.TestEngine.Database;
+using EvolutionaryArchitecture.Fitnet.Common.IntegrationTests.TestEngine.IntegrationEvents.Handlers;
using IntegrationEvents;
using RegisterPass;
@@ -55,7 +55,7 @@ internal async Task Given_valid_mark_pass_as_expired_request_Then_should_publish
var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);
// Assert
- markAsExpiredResponse.Should().HaveStatusCode(HttpStatusCode.NoContent);
+ markAsExpiredResponse.StatusCode.ShouldBe(HttpStatusCode.NoContent);
}
[Fact]
@@ -69,7 +69,7 @@ internal async Task Given_mark_pass_as_expired_request_with_not_existing_id_Then
var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);
// Assert
- markAsExpiredResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
+ markAsExpiredResponse.StatusCode.ShouldBe(HttpStatusCode.NotFound);
}
private async Task RegisterPass()
@@ -87,9 +87,9 @@ private async Task GetCreatedPass(Guid customerId)
var getAllPassesResponse = await _applicationHttpClient.GetAsync(PassesApiPaths.GetAll);
var response = await getAllPassesResponse.Content.ReadFromJsonAsync();
var createdPass = response!.Passes.FirstOrDefault(pass => pass.CustomerId == customerId);
- createdPass.Should().NotBeNull();
+ createdPass.ShouldNotBeNull();
- return createdPass!.Id;
+ return createdPass.Id;
}
private static string BuildUrl(Guid id) => PassesApiPaths.MarkPassAsExpired.Replace("{id}", id.ToString());
diff --git a/Chapter-2-modules-separation/Src/Reports/Fitnet.Reports/GenerateNewPassesRegistrationsPerMonthReport/DataRetriever/NewPassesRegistrationPerMonthReportDataRetriever.cs b/Chapter-2-modules-separation/Src/Reports/Fitnet.Reports/GenerateNewPassesRegistrationsPerMonthReport/DataRetriever/NewPassesRegistrationPerMonthReportDataRetriever.cs
index 3ff98c64..542044c0 100644
--- a/Chapter-2-modules-separation/Src/Reports/Fitnet.Reports/GenerateNewPassesRegistrationsPerMonthReport/DataRetriever/NewPassesRegistrationPerMonthReportDataRetriever.cs
+++ b/Chapter-2-modules-separation/Src/Reports/Fitnet.Reports/GenerateNewPassesRegistrationsPerMonthReport/DataRetriever/NewPassesRegistrationPerMonthReportDataRetriever.cs
@@ -25,6 +25,6 @@ WHERE EXTRACT(YEAR FROM ""Passes"".""From"") = '{timeProvider.GetUtcNow().Year}'
var newPassesRegistrationsPerMonthDtos =
await connection.QueryAsync(queryDefinition);
- return newPassesRegistrationsPerMonthDtos.ToList();
+ return [.. newPassesRegistrationsPerMonthDtos];
}
}
diff --git a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj
index ad99b22b..c73502fc 100644
--- a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj
+++ b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj
@@ -8,6 +8,7 @@
+
diff --git a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GenerateNewPassesPerMonthReport/GenerateNewPassesPerMonthReportTests.cs b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GenerateNewPassesPerMonthReport/GenerateNewPassesPerMonthReportTests.cs
index c233eac0..f9706d18 100644
--- a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GenerateNewPassesPerMonthReport/GenerateNewPassesPerMonthReportTests.cs
+++ b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GenerateNewPassesPerMonthReport/GenerateNewPassesPerMonthReportTests.cs
@@ -37,7 +37,7 @@ internal async Task Given_valid_generate_new_report_request_Then_should_return_c
var getReportResult = await _applicationHttpClient.GetAsync(ReportsApiPaths.GenerateNewReport);
// Assert
- getReportResult.Should().HaveStatusCode(HttpStatusCode.OK);
+ getReportResult.StatusCode.ShouldBe(HttpStatusCode.OK);
var reportData = await getReportResult.Content.ReadFromJsonAsync();
await Verify(reportData);
}
diff --git a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GlobalUsings.cs b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GlobalUsings.cs
index bb8a555e..62a0f908 100644
--- a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GlobalUsings.cs
+++ b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/GlobalUsings.cs
@@ -4,4 +4,4 @@
global using Xunit;
global using Microsoft.AspNetCore.Mvc.Testing;
global using Bogus;
-global using FluentAssertions;
\ No newline at end of file
+global using Shouldly;