Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: xunit v3 and shouldly #203

Merged
merged 1 commit into from
Mar 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 62 additions & 33 deletions Directory.Build.targets
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,67 @@
<CoreBuildDependsOn>$(CoreBuildDependsOn);_CheckVersion</CoreBuildDependsOn>
</PropertyGroup>

<PropertyGroup Condition=" '$(IsTestProject)' == 'true' Or '$(IsPackable)' == 'false' ">
<GenerateDocumentationFile>false</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup Condition=" '$(IsTestProject)' == 'true' Or '$(IsPackable)' == 'false' ">
<DocFileItem Remove="@(DocFileItem)" />
</ItemGroup>

<ItemGroup Condition=" '$(IsTestProject)' == 'true' ">
<PackageReference Include="coverlet.collector">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" />
<PackageReference Include="FluentAssertions.Analyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" />
<PackageReference Include="xunit.runner.visualstudio">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

<Using Include="FluentAssertions" />
<Using Include="Xunit" />
</ItemGroup>

<ItemGroup Condition=" '$(IsTestProject)' != 'true' ">
<InternalsVisibleTo Include="$(AssemblyName).Tests" />
</ItemGroup>
<Choose>
<When Condition=" '$(IsTestProject)' == 'true' Or '$(IsTestLibrary)' == 'true' ">

<PropertyGroup>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<NoWarn>$(NoWarn);SA0001</NoWarn>
<XUnitVersion Condition=" '$(XUnitVersion)' == '' ">v3</XUnitVersion>
</PropertyGroup>

<ItemGroup>
<DocFileItem Remove="@(DocFileItem)" />
</ItemGroup>

<ItemGroup Condition=" '$(IsTestProject)' == 'true' ">
<PackageReference Include="coverlet.collector">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" Condition=" '$(XUnitVersion)' == 'v2' " />
<PackageReference Include="FluentAssertions.Analyzers"
Condition=" '$(XUnitVersion)' == 'v2' ">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Shouldly" Condition=" '$(XUnitVersion)' == 'v3' " />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" Condition=" '$(XUnitVersion)' == 'v2' " />
<PackageReference Include="xunit.v3" Condition=" '$(XUnitVersion)' == 'v3' " />
<PackageReference Include="xunit.runner.visualstudio">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup Condition=" '$(IsTestLibrary)' == 'true' ">
<PackageReference Include="FluentAssertions" Condition=" '$(XUnitVersion)' == 'v2' " />
<PackageReference Include="Shouldly" Condition=" '$(XUnitVersion)' == 'v3' " />
<PackageReference Include="xunit.assert" Condition=" '$(XUnitVersion)' == 'v2' " />
<PackageReference Include="xunit.extensibility.core" Condition=" '$(XUnitVersion)' == 'v2' " />
<PackageReference Include="xunit.v3.assert" Condition=" '$(XUnitVersion)' == 'v3' " />
<PackageReference Include="xunit.v3.extensibility.core"
Condition=" '$(XUnitVersion)' == 'v3' " />
</ItemGroup>

<ItemGroup>
<Using Include="FluentAssertions" Condition=" '$(XUnitVersion)' == 'v2' " />
<Using Include="Shouldly" Condition=" '$(XUnitVersion)' == 'v3' " />
<Using Include="Xunit" />
</ItemGroup>

</When>

<Otherwise>
<!-- not test project -->

<ItemGroup>
<InternalsVisibleTo Include="$(AssemblyName).Tests" />
</ItemGroup>

</Otherwise>
</Choose>

<ItemGroup Condition=" '$(IsPackable)' == 'true' ">
<PackageReference Include="Microsoft.Build.Artifacts" PrivateAssets="all"
Expand Down Expand Up @@ -79,4 +108,4 @@
<Error Condition="'$(Version)' == ''" Text="Version not defined in '$(VersionFilePath)'" />
</Target>

</Project>
</Project>
12 changes: 8 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="FluentAssertions.Analyzers" Version="0.34.1" />
<PackageVersion Include="FluentAssertions" Version="7.1.0" />
<PackageVersion Include="Microsoft.ApplicationInsights" Version="2.22.0" />
<PackageVersion Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
<PackageVersion Include="Microsoft.ApplicationInsights" Version="2.22.0" />
<PackageVersion Include="Microsoft.Build.Artifacts" Version="6.1.48" />
<PackageVersion Include="Microsoft.Build.Locator" Version="1.7.8" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.12.0" />
Expand All @@ -38,20 +38,24 @@
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.11.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.11.0" />
<PackageVersion Include="OpenTelemetry" Version="1.11.1" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Spectre.Console.Cli" Version="0.49.1" />
<PackageVersion Include="Swashbuckle.AspNetCore.Swagger" Version="7.2.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.2.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="7.2.0" />
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="System.CommandLine.Hosting" Version="0.4.0-alpha.22272.1" />
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.5.0" />
<PackageVersion Include="System.IO.Pipelines" Version="9.0.2" />
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.2.0" />
<PackageVersion Include="Verify.SourceGenerators" Version="2.5.0" />
<PackageVersion Include="Verify.Xunit" Version="28.11.0" />
<PackageVersion Include="Verify.XunitV3" Version="28.11.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
<PackageVersion Include="xunit.v3.assert" Version="1.1.0" />
<PackageVersion Include="xunit.v3.extensibility.core" Version="1.1.0" />
<PackageVersion Include="xunit.v3" Version="1.1.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="Yuniql.Core" Version="1.3.15" />
<PackageVersion Include="Yuniql.PostgreSql" Version="1.3.15" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,28 @@ static void TestRoundTrip(ProblemDescriptor descriptor)
var deserialized = JsonSerializer.Deserialize<AltinnProblemDetails>(json, _options);

Assert.NotNull(deserialized);
deserialized.Detail.Should().Be(problemDetails.Detail);
deserialized.Status.Should().Be(problemDetails.Status);
deserialized.ErrorCode.Should().Be(problemDetails.ErrorCode);
deserialized.Detail.ShouldBe(problemDetails.Detail);
deserialized.Status.ShouldBe(problemDetails.Status);
deserialized.ErrorCode.ShouldBe(problemDetails.ErrorCode);
}
}

[Fact]
public void SetsStatusCode()
{
TestErrors.BadRequest.StatusCode.Should().Be(HttpStatusCode.BadRequest);
TestErrors.NotFound.StatusCode.Should().Be(HttpStatusCode.NotFound);
TestErrors.InternalServerError.StatusCode.Should().Be(HttpStatusCode.InternalServerError);
TestErrors.NotImplemented.StatusCode.Should().Be(HttpStatusCode.NotImplemented);
TestErrors.BadRequest.StatusCode.ShouldBe(HttpStatusCode.BadRequest);
TestErrors.NotFound.StatusCode.ShouldBe(HttpStatusCode.NotFound);
TestErrors.InternalServerError.StatusCode.ShouldBe(HttpStatusCode.InternalServerError);
TestErrors.NotImplemented.StatusCode.ShouldBe(HttpStatusCode.NotImplemented);
}

[Fact]
public void SetsDetail()
{
TestErrors.BadRequest.Detail.Should().Be("Bad request");
TestErrors.NotFound.Detail.Should().Be("Not found");
TestErrors.InternalServerError.Detail.Should().Be("Internal server error");
TestErrors.NotImplemented.Detail.Should().Be("Not implemented");
TestErrors.BadRequest.Detail.ShouldBe("Bad request");
TestErrors.NotFound.Detail.ShouldBe("Not found");
TestErrors.InternalServerError.Detail.ShouldBe("Internal server error");
TestErrors.NotImplemented.Detail.ShouldBe("Not implemented");
}

internal static class TestErrors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public void HasCorrectErrorCode()
{
var problemDetails = new AltinnValidationProblemDetails();

problemDetails.ErrorCode.Should().Be(StdProblemDescriptors.ValidationError.ErrorCode);
problemDetails.ErrorCode.ShouldBe(StdProblemDescriptors.ValidationError.ErrorCode);
}

[Fact]
Expand All @@ -28,9 +28,9 @@ public void CanDeserializeAsValidationProblemDetails()
var deserialized = JsonSerializer.Deserialize<ValidationProblemDetails>(serialized, _options);

Assert.NotNull(deserialized);
deserialized.Errors.Should().BeEmpty();
deserialized.Status.Should().Be(problemDetails.Status);
deserialized.Detail.Should().Be(problemDetails.Detail);
deserialized.Errors.ShouldBeEmpty();
deserialized.Status.ShouldBe(problemDetails.Status);
deserialized.Detail.ShouldBe(problemDetails.Detail);
}

[Fact]
Expand All @@ -46,9 +46,9 @@ public void CanRoundTripThroughJson()
var deserialized = JsonSerializer.Deserialize<AltinnValidationProblemDetails>(serialized, _options);

Assert.NotNull(deserialized);
deserialized.Errors.Should().BeEquivalentTo(problemDetails.Errors);
deserialized.Status.Should().Be(problemDetails.Status);
deserialized.Detail.Should().Be(problemDetails.Detail);
deserialized.Errors.ShouldBeEquivalentTo(problemDetails.Errors);
deserialized.Status.ShouldBe(problemDetails.Status);
deserialized.Detail.ShouldBe(problemDetails.Detail);
}

[Fact]
Expand All @@ -59,8 +59,8 @@ public void CanDeserializeEmptyObject()
var deserialized = JsonSerializer.Deserialize<AltinnValidationProblemDetails>(json, _options);
Assert.NotNull(deserialized);

deserialized.ErrorCode.Should().NotBe(StdProblemDescriptors.ValidationError.ErrorCode);
deserialized.Errors.Should().BeEmpty();
deserialized.ErrorCode.ShouldNotBe(StdProblemDescriptors.ValidationError.ErrorCode);
deserialized.Errors.ShouldBeEmpty();
}

private static class ValidationDescriptors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,34 +23,34 @@ static void CheckEquality(ErrorCodeDomain domain, uint value)
var errorCode1 = domain.Code(value);
var errorCode2 = domain.Code(value);

errorCode1.Should().Be(errorCode2);
errorCode1.GetHashCode().Should().Be(errorCode2.GetHashCode());
errorCode1.Equals(errorCode2).Should().BeTrue();
errorCode2.Equals(errorCode1).Should().BeTrue();
errorCode1.Equals((object)errorCode2).Should().BeTrue();
errorCode2.Equals((object)errorCode1).Should().BeTrue();
(errorCode1 == errorCode2).Should().BeTrue();
(errorCode2 == errorCode1).Should().BeTrue();
(errorCode1 != errorCode2).Should().BeFalse();
(errorCode2 != errorCode1).Should().BeFalse();
errorCode1.ShouldBe(errorCode2);
errorCode1.GetHashCode().ShouldBe(errorCode2.GetHashCode());
errorCode1.Equals(errorCode2).ShouldBeTrue();
errorCode2.Equals(errorCode1).ShouldBeTrue();
errorCode1.Equals((object)errorCode2).ShouldBeTrue();
errorCode2.Equals((object)errorCode1).ShouldBeTrue();
(errorCode1 == errorCode2).ShouldBeTrue();
(errorCode2 == errorCode1).ShouldBeTrue();
(errorCode1 != errorCode2).ShouldBeFalse();
(errorCode2 != errorCode1).ShouldBeFalse();

var other = _domain.Code(42);
errorCode1.Should().NotBe(other);
errorCode1.Equals(other).Should().BeFalse();
other.Equals(errorCode1).Should().BeFalse();
errorCode1.Equals((object)other).Should().BeFalse();
other.Equals((object)errorCode1).Should().BeFalse();
(errorCode1 == other).Should().BeFalse();
(other == errorCode1).Should().BeFalse();
(errorCode1 != other).Should().BeTrue();
(other != errorCode1).Should().BeTrue();
errorCode1.ShouldNotBe(other);
errorCode1.Equals(other).ShouldBeFalse();
other.Equals(errorCode1).ShouldBeFalse();
errorCode1.Equals((object)other).ShouldBeFalse();
other.Equals((object)errorCode1).ShouldBeFalse();
(errorCode1 == other).ShouldBeFalse();
(other == errorCode1).ShouldBeFalse();
(errorCode1 != other).ShouldBeTrue();
(other != errorCode1).ShouldBeTrue();
}
}

[Fact]
public void Throws_IfTooLarge()
{
Action act = () => _domain.Code(100_000);
act.Should().Throw<ArgumentOutOfRangeException>();
act.ShouldThrow<ArgumentOutOfRangeException>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@ public void Create_ReturnsCorrectAltinnProblemDetails()
var result = factory.Create(1, HttpStatusCode.BadRequest, "Test error");

// Assert
result.Should().NotBeNull();
result.ErrorCode.ToString().Should().Be("TEST-00001");
result.StatusCode.Should().Be(HttpStatusCode.BadRequest);
result.Detail.Should().Be("Test error");
result.ShouldNotBeNull();
result.ErrorCode.ToString().ShouldBe("TEST-00001");
result.StatusCode.ShouldBe(HttpStatusCode.BadRequest);
result.Detail.ShouldBe("Test error");
}

[Fact]
public void New_WithInvalidDomainName_ThrowsArgumentException()
{
// Arrange & Act & Assert
Action act = () => ProblemDescriptorFactory.New("TESTDOMAIN");
act.Should().ThrowExactly<ArgumentException>();
act.ShouldThrow<ArgumentException>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,12 @@ public void Create_WithExtensionsDictionary_ReturnsAltinnProblemDetailsWithExten
var result = descriptor.ToProblemDetails(extensions);

// Assert
result.Should().NotBeNull();
result.ErrorCode.ToString().Should().Be("TEST-00001");
result.Status.Should().Be((int)HttpStatusCode.BadRequest);
result.Detail.Should().Be("Test error");
result.Extensions.Should().ContainKey("Key1")
.WhoseValue.Should().Be("Value1");
result.Extensions.Should().ContainKey("Key2")
.WhoseValue.Should().Be(123);
result.ShouldNotBeNull();
result.ErrorCode.ToString().ShouldBe("TEST-00001");
result.Status.ShouldBe((int)HttpStatusCode.BadRequest);
result.Detail.ShouldBe("Test error");
result.Extensions.ShouldContainKeyAndValue("Key1", "Value1");
result.Extensions.ShouldContainKeyAndValue("Key2", 123);
}

[Fact]
Expand All @@ -44,13 +42,11 @@ public void Create_WithExtensionsCollectionExpression_ReturnsAltinnProblemDetail
]);

// Assert
result.Should().NotBeNull();
result.ErrorCode.ToString().Should().Be("TEST-00001");
result.Status.Should().Be((int)HttpStatusCode.BadRequest);
result.Detail.Should().Be("Test error");
result.Extensions.Should().ContainKey("Key1")
.WhoseValue.Should().Be("Value1");
result.Extensions.Should().ContainKey("Key2")
.WhoseValue.Should().Be(123);
result.ShouldNotBeNull();
result.ErrorCode.ToString().ShouldBe("TEST-00001");
result.Status.ShouldBe((int)HttpStatusCode.BadRequest);
result.Detail.ShouldBe("Test error");
result.Extensions.ShouldContainKeyAndValue("Key1", "Value1");
result.Extensions.ShouldContainKeyAndValue("Key2", 123);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,10 @@ public static void Dictionary_Values_Tests()
];

var values = (data as IDictionary<string, object?>).Values;
values.Should().HaveCount(4);
values.Should().BeEquivalentTo(["first value", "value", "value 2", "other value"]);
values.IsReadOnly.Should().BeTrue();
values.Contains("value").Should().BeTrue();
values.Count.ShouldBe(4);
values.ShouldBe((IEnumerable<object>)["first value", "value", "value 2", "other value"]);
values.IsReadOnly.ShouldBeTrue();
values.Contains("value").ShouldBeTrue();
}

[Fact]
Expand All @@ -230,10 +230,10 @@ public static void Dictionary_Keys_Tests()
];

var keys = (data as IDictionary<string, object?>).Keys;
keys.Should().HaveCount(4);
keys.Should().BeEquivalentTo(["first key", "key", "key", "other key"]);
keys.IsReadOnly.Should().BeTrue();
keys.Contains("key").Should().BeTrue();
keys.Count.ShouldBe(4);
keys.ShouldBe((IEnumerable<string>)["first key", "key", "key", "other key"]);
keys.IsReadOnly.ShouldBeTrue();
keys.Contains("key").ShouldBeTrue();
}

private static void AssertEqual(ProblemExtensionData expected, ProblemExtensionData actual)
Expand Down
Loading
Loading