From 27ac0d3f25fa50ae1e95ccae480d65a2f96ac693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Breu=C3=9F?= Date: Sat, 20 Sep 2025 13:52:49 +0200 Subject: [PATCH 1/2] feat: add `HasScheme` for `Uri` --- Directory.Packages.props | 2 +- Source/aweXpect.Web/ThatUri.HasScheme.cs | 19 +++ .../ThatUri.HasScheme.Tests.cs | 148 ++++++++++++++++++ 3 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 Source/aweXpect.Web/ThatUri.HasScheme.cs create mode 100644 Tests/aweXpect.Web.Tests/ThatUri.HasScheme.Tests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index dd19cd3..099e30a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -4,7 +4,7 @@ - + diff --git a/Source/aweXpect.Web/ThatUri.HasScheme.cs b/Source/aweXpect.Web/ThatUri.HasScheme.cs new file mode 100644 index 0000000..8f88068 --- /dev/null +++ b/Source/aweXpect.Web/ThatUri.HasScheme.cs @@ -0,0 +1,19 @@ +using System; +using aweXpect.Core; +using aweXpect.Helpers; +using aweXpect.Results; + +namespace aweXpect; + +#nullable enable +public static partial class ThatUri +{ + /// + /// Verifies that the scheme of the subject… + /// + /// + /// + /// + public static PropertyResult.String HasScheme(this IThat source) + => new(source, u => u.Scheme, "scheme"); +} diff --git a/Tests/aweXpect.Web.Tests/ThatUri.HasScheme.Tests.cs b/Tests/aweXpect.Web.Tests/ThatUri.HasScheme.Tests.cs new file mode 100644 index 0000000..1d2f3ee --- /dev/null +++ b/Tests/aweXpect.Web.Tests/ThatUri.HasScheme.Tests.cs @@ -0,0 +1,148 @@ +namespace aweXpect.Tests; + +public sealed partial class ThatUri +{ + public sealed class HasScheme + { + public sealed class Tests + { + [Fact] + public async Task Containing_WhenSubjectSchemeContainsTheExpectedValue_ShouldSucceed() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).HasScheme().Containing("http"); + + await That(Act).DoesNotThrow(); + } + + [Fact] + public async Task EqualTo_WhenSubjectDoesNotEqualTheExpectedScheme_ShouldFail() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).HasScheme().EqualTo("http"); + + await That(Act).Throws() + .WithMessage(""" + Expected that subject + has scheme equal to "http", + but it had scheme "https" + """); + } + + [Fact] + public async Task EqualTo_WhenSubjectEqualsExpectedScheme_ShouldSucceed() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).HasScheme().EqualTo("https"); + + await That(Act).DoesNotThrow(); + } + + [Fact] + public async Task NotEqualTo_WhenSubjectDoesNotEqualTheExpectedScheme_ShouldFail() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).HasScheme().NotEqualTo("https"); + + await That(Act).Throws() + .WithMessage(""" + Expected that subject + has scheme not equal to "https", + but it had scheme "https" + """); + } + + [Fact] + public async Task NotEqualTo_WhenSubjectEqualsExpectedScheme_ShouldSucceed() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).HasScheme().NotEqualTo("http"); + + await That(Act).DoesNotThrow(); + } + } + + public sealed class NegatedTests + { + [Fact] + public async Task Containing_WhenSubjectSchemeContainsTheExpectedValue_ShouldFail() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).DoesNotComplyWith(it => it.HasScheme().Containing("http")); + + await That(Act).Throws() + .WithMessage(""" + Expected that subject + has scheme not containing "http", + but it had scheme "https" + """); + } + + [Fact] + public async Task EqualTo_WhenSubjectDoesNotEqualTheExpectedScheme_ShouldSucceed() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).DoesNotComplyWith(it => it.HasScheme().EqualTo("http")); + + await That(Act).DoesNotThrow(); + } + + [Fact] + public async Task EqualTo_WhenSubjectEqualsExpectedScheme_ShouldFail() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).DoesNotComplyWith(it => it.HasScheme().EqualTo("https")); + + await That(Act).Throws() + .WithMessage(""" + Expected that subject + has scheme not equal to "https", + but it had scheme "https" + """); + } + + [Fact] + public async Task NotEqualTo_WhenSubjectDoesNotEqualTheExpectedScheme_ShouldSucceed() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).DoesNotComplyWith(it => it.HasScheme().NotEqualTo("https")); + + await That(Act).DoesNotThrow(); + } + + [Fact] + public async Task NotEqualTo_WhenSubjectEqualsExpectedScheme_ShouldFail() + { + Uri subject = new("https://www.awexpect.com:80"); + + async Task Act() + => await That(subject).DoesNotComplyWith(it => it.HasScheme().NotEqualTo("http")); + + await That(Act).Throws() + .WithMessage(""" + Expected that subject + has scheme equal to "http", + but it had scheme "https" + """); + } + } + } +} From fa874a63805a61c05dea636e2f6c5dabce6060dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Breu=C3=9F=20Valentin?= Date: Sat, 20 Sep 2025 16:49:47 +0200 Subject: [PATCH 2/2] Accept API changes --- Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_net8.0.txt | 1 + .../Expected/aweXpect.Web_netstandard2.0.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_net8.0.txt b/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_net8.0.txt index 87fc4e9..4aa5381 100644 --- a/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_net8.0.txt +++ b/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_net8.0.txt @@ -29,6 +29,7 @@ namespace aweXpect { public static aweXpect.Results.AndOrResult> DoesNotHaveDefaultPort(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> HasDefaultPort(this aweXpect.Core.IThat source) { } + public static aweXpect.Results.PropertyResult.String HasScheme(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsAbsolute(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsFile(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsLoopback(this aweXpect.Core.IThat source) { } diff --git a/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_netstandard2.0.txt b/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_netstandard2.0.txt index 9918e60..6000976 100644 --- a/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_netstandard2.0.txt +++ b/Tests/aweXpect.Web.Api.Tests/Expected/aweXpect.Web_netstandard2.0.txt @@ -29,6 +29,7 @@ namespace aweXpect { public static aweXpect.Results.AndOrResult> DoesNotHaveDefaultPort(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> HasDefaultPort(this aweXpect.Core.IThat source) { } + public static aweXpect.Results.PropertyResult.String HasScheme(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsAbsolute(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsFile(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> IsLoopback(this aweXpect.Core.IThat source) { }