From 1a086a8772740918686acfc8d6b5d7611cdbece8 Mon Sep 17 00:00:00 2001
From: skwasjer <11424653+skwasjer@users.noreply.github.com>
Date: Fri, 28 Nov 2025 11:46:23 +0100
Subject: [PATCH] feat!: add new overload to match `RequestUri`, accepting
`Matches`
The behavior of the sibling overload accepting a string has now changed. It no longer infers a wildcard match if the input string contains an asterisk '*'. It now only expects relative or absolute URI's and will match them exactly.
To perform wildcard matches, it must now be explicitly provided via the overload accepting a pattern, eg. using `Matches.Wildcard("some*thing")`. By using this explicit approach, we give users full control over how a request URI can be matched, and remove the ambiguity. With the new API users can even use custom expression, regexes, etc.
Unfortunately, changing the behavior will cause friction amongst users that have used wildcards in their tests, but I see no other way to transition to this new API.
---
.../Extensions/RequestMatchingExtensions.cs | 46 +-----
src/MockHttp/Matchers/Matches.cs | 2 +-
.../MockHttpServerTests.cs | 3 +-
test/MockHttp.Testing/Specs/PublicApiSpec.cs | 5 +-
.../RequestMatchingExtensionsTests.cs | 149 ++++--------------
test/MockHttp.Tests/MockHttpHandlerTests.cs | 13 +-
.../PublicApi/.NET_10.0.verified.txt | 21 +++
.../PublicApi/.NET_8.0.verified.txt | 21 +++
..._2.0_via_.NET_Framework_4.6.2.verified.txt | 21 +++
..._2.0_via_.NET_Framework_4.7.2.verified.txt | 21 +++
...rd_2.0_via_.NET_Framework_4.8.verified.txt | 21 +++
...NET_Standard_2.1_via_.NET_6.0.verified.txt | 21 +++
12 files changed, 180 insertions(+), 164 deletions(-)
diff --git a/src/MockHttp/Extensions/RequestMatchingExtensions.cs b/src/MockHttp/Extensions/RequestMatchingExtensions.cs
index a07c387..9d8a5d4 100644
--- a/src/MockHttp/Extensions/RequestMatchingExtensions.cs
+++ b/src/MockHttp/Extensions/RequestMatchingExtensions.cs
@@ -19,20 +19,6 @@ namespace MockHttp;
///
public static class RequestMatchingExtensions
{
- private static bool ContainsWildcard(this string value)
- {
- if (value is null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
-#if NETSTANDARD2_0
- return value.Contains("*");
-#else
- return value.Contains('*', StringComparison.InvariantCultureIgnoreCase);
-#endif
- }
-
///
/// Matches a request by specified .
///
@@ -49,29 +35,7 @@ string requestUri
)
#pragma warning restore CA1054
{
- return builder.RequestUri(requestUri, true);
- }
-
- ///
- /// Matches a request by specified .
- ///
- /// The request matching builder instance.
- /// The request URI or a URI wildcard.
- /// to allow wildcards, or if exact matching.
- /// The request matching builder instance.
-#pragma warning disable CA1054
- // For now, keep this internal. For coverage, and most likely, the API will change so then we'd have more to deprecate (using patterns).
- internal static IRequestMatching RequestUri(this IRequestMatching builder, string requestUri, bool allowWildcards)
-#pragma warning restore CA1054
- {
- if (requestUri is null)
- {
- throw new ArgumentNullException(nameof(requestUri));
- }
-
- return allowWildcards && requestUri.ContainsWildcard()
- ? builder.RequestUri(Matches.Wildcard(requestUri))
- : builder.RequestUri(new Uri(requestUri, DotNetRelativeOrAbsolute));
+ return builder.RequestUri(new Uri(requestUri, DotNetRelativeOrAbsolute));
}
///
@@ -119,7 +83,13 @@ static bool IsRelativeUriMatch(Uri expectedUri, Uri uri)
/// The request matching builder instance.
/// The string matcher to use to match the request URI.
/// The request matching builder instance.
- private static IRequestMatching RequestUri(this IRequestMatching builder, Matches requestUri)
+ public static IRequestMatching RequestUri(
+ this IRequestMatching builder,
+#if NET8_0_OR_GREATER
+ [StringSyntax(StringSyntaxAttribute.Uri)]
+#endif
+ Matches requestUri
+ )
{
if (builder is null)
{
diff --git a/src/MockHttp/Matchers/Matches.cs b/src/MockHttp/Matchers/Matches.cs
index 599ee8c..bb534bc 100644
--- a/src/MockHttp/Matchers/Matches.cs
+++ b/src/MockHttp/Matchers/Matches.cs
@@ -8,7 +8,7 @@ namespace MockHttp.Matchers;
///
/// A string matcher encapsulating a delegate and 'pretty' name for debug/display needs when reporting errors to the user.
///
-internal readonly record struct Matches : IStringMatcher
+public readonly record struct Matches : IStringMatcher
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly string _value;
diff --git a/test/MockHttp.Server.Tests/MockHttpServerTests.cs b/test/MockHttp.Server.Tests/MockHttpServerTests.cs
index 943e9a4..1f0c2af 100644
--- a/test/MockHttp.Server.Tests/MockHttpServerTests.cs
+++ b/test/MockHttp.Server.Tests/MockHttpServerTests.cs
@@ -4,6 +4,7 @@
using MockHttp.Fixtures;
using MockHttp.FluentAssertions;
using MockHttp.Http;
+using MockHttp.Matchers;
using Xunit.Abstractions;
namespace MockHttp;
@@ -107,7 +108,7 @@ public static IEnumerable RequestResponseTestCases()
[
(Action)(m => m
.When(matching => matching
- .RequestUri("*path/child*")
+ .RequestUri(Matches.Wildcard("*path/child*"))
.QueryString("?key=value")
)
.Respond(with => with.Body("has content"))
diff --git a/test/MockHttp.Testing/Specs/PublicApiSpec.cs b/test/MockHttp.Testing/Specs/PublicApiSpec.cs
index 7b66371..0c70af0 100644
--- a/test/MockHttp.Testing/Specs/PublicApiSpec.cs
+++ b/test/MockHttp.Testing/Specs/PublicApiSpec.cs
@@ -17,7 +17,10 @@ public abstract class PublicApiSpec
ExcludeAttributes =
[
typeof(InternalsVisibleToAttribute).FullName!,
- typeof(ExcludeFromCodeCoverageAttribute).FullName!
+ typeof(ExcludeFromCodeCoverageAttribute).FullName!,
+#if NET8_0_OR_GREATER
+ typeof(MemberNotNullAttribute).FullName!
+#endif
],
DenyNamespacePrefixes = []
};
diff --git a/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs b/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs
index 32e73ed..1139e4b 100644
--- a/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs
+++ b/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs
@@ -23,118 +23,36 @@ protected RequestMatchingExtensionsTests()
public class RequestUri : RequestMatchingExtensionsTests
{
[Theory]
- [InlineData("", false, "http://127.0.0.1", true)]
- [InlineData("", false, "http://127.0.0.1/", true)]
- [InlineData("", true, "http://127.0.0.1", true)]
- [InlineData("", true, "http://127.0.0.1/", true)]
- [InlineData("/", false, "http://127.0.0.1", true)]
- [InlineData("/", false, "http://127.0.0.1/", true)]
- [InlineData("/", true, "http://127.0.0.1", true)]
- [InlineData("/", true, "http://127.0.0.1/", true)]
-
- [InlineData("relative.htm", true, "http://127.0.0.1/relative.htm", true)]
- [InlineData("relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("relative.htm", false, "http://127.0.0.1/relative.htm", true)]
- [InlineData("relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)]
-
- [InlineData("/relative.htm", true, "http://127.0.0.1/relative.htm", true)]
- [InlineData("/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("/relative.htm", false, "http://127.0.0.1/relative.htm", true)]
- [InlineData("/relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)]
-
- [InlineData("relative.htm?query=string", true, "http://127.0.0.1/relative.htm?query=string", true)]
- [InlineData("relative.htm?query=string", false, "http://127.0.0.1/relative.htm?query=string", true)]
- [InlineData("http://127.0.0.1/absolute.htm?query=string", true, "http://127.0.0.1/absolute.htm?query=string", true)]
- [InlineData("http://127.0.0.1/absolute.htm?query=string", false, "http://127.0.0.1/absolute.htm?query=string", true)]
-
- [InlineData("/folder/relative.htm", true, "http://127.0.0.1/relative.htm", false)]
- [InlineData("/folder/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("/folder/relative.htm", false, "http://127.0.0.1/relative.htm", false)]
- [InlineData("/folder/relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)]
-
- [InlineData("relative.htm", true, "http://127.0.0.1/folder/relative.htm", false)]
- [InlineData("relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("relative.htm", false, "http://127.0.0.1/folder/relative.htm", false)]
- [InlineData("relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)]
-
- [InlineData("folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm", true)]
- [InlineData("folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm", true)]
- [InlineData("folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)]
-
- [InlineData("/folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm", true)]
- [InlineData("/folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("/folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm", true)]
- [InlineData("/folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)]
-
- [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/absolute.htm", true)]
- [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/absolute.htm?query=string", false)]
- [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/absolute.htm", true)]
- [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/absolute.htm?query=string", false)]
-
- [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm", false)]
- [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)]
- [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm", false)]
- [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm?query=string", false)]
-
- [InlineData("http://127.0.0.1/folder/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm", true)]
- [InlineData("http://127.0.0.1/folder/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)]
- [InlineData("http://127.0.0.1/folder/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm", true)]
- [InlineData("http://127.0.0.1/folder/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm?query=string", false)]
-
- [InlineData("*.htm", true, "http://127.0.0.1/relative.htm", true)]
- [InlineData("*.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("*.htm", false, "http://127.0.0.1/relative.htm", false)]
-
- [InlineData("*/relative.htm", true, "http://127.0.0.1/relative.htm", true)]
- [InlineData("*/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("*/relative.htm", false, "http://127.0.0.1/relative.htm", false)]
-
- [InlineData("/*/relative.htm", true, "http://127.0.0.1/folder/relative.htm", false)]
- [InlineData("/*/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("/*/relative.htm", false, "http://127.0.0.1/folder/relative.htm", false)]
-
- [InlineData("/*/relative.htm", true, "http://127.0.0.1/relative.htm", false)]
- [InlineData("/*/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("/*/relative.htm", false, "http://127.0.0.1/relative.htm", false)]
-
- [InlineData("/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm", false)]
- [InlineData("/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("/folder/*.htm", false, "http://127.0.0.1/folder/relative.htm", false)]
-
- [InlineData("*/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm", true)]
- [InlineData("*/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)]
- [InlineData("*/folder/*.htm", false, "http://127.0.0.1/folder/relative.htm", false)]
-
- [InlineData("/folder/*.htm", true, "http://127.0.0.1/relative.htm", false)]
- [InlineData("/folder/*.htm", true, "http://127.0.0.1/relative.htm?query=string", false)]
- [InlineData("/folder/*.htm", false, "http://127.0.0.1/relative.htm", false)]
-
- [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm", false)]
- [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm?query=string", false)]
- [InlineData("/*/*/relative.*", false, "http://127.0.0.1/folder1/folder2/relative.htm", false)]
-
- [InlineData("*/folder1/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm", true)]
- [InlineData("*/folder1/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm?query=string", true)]
- [InlineData("*/folder1/*/relative.*", false, "http://127.0.0.1/folder1/folder2/relative.htm", false)]
-
- [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/relative.htm", false)]
- [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/relative.htm?query=string", false)]
- [InlineData("/*/*/relative.*", false, "http://127.0.0.1/folder1/relative.htm", false)]
-
- [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/absolute.htm", true)]
- [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/absolute.htm?query=string", false)]
- [InlineData("http://127.0.0.1/*.htm", false, "http://127.0.0.1/absolute.htm", false)]
-
- [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/folder/absolute.htm", true)]
- [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)]
- [InlineData("http://127.0.0.1/*.htm", false, "http://127.0.0.1/folder/absolute.htm", false)]
- public async Task When_configuring_requestUri_as_string_it_should_match(string uriString, bool allowWildcards, string requestUri, bool isMatch)
+ [InlineData("", "http://127.0.0.1", true)]
+ [InlineData("", "http://127.0.0.1/", true)]
+ [InlineData("/", "http://127.0.0.1", true)]
+ [InlineData("/", "http://127.0.0.1/", true)]
+ [InlineData("relative.htm", "http://127.0.0.1/relative.htm", true)]
+ [InlineData("relative.htm", "http://127.0.0.1/relative.htm?query=string", false)]
+ [InlineData("/relative.htm", "http://127.0.0.1/relative.htm", true)]
+ [InlineData("/relative.htm", "http://127.0.0.1/relative.htm?query=string", false)]
+ [InlineData("relative.htm?query=string", "http://127.0.0.1/relative.htm?query=string", true)]
+ [InlineData("http://127.0.0.1/absolute.htm?query=string", "http://127.0.0.1/absolute.htm?query=string", true)]
+ [InlineData("/folder/relative.htm", "http://127.0.0.1/relative.htm", false)]
+ [InlineData("/folder/relative.htm", "http://127.0.0.1/relative.htm?query=string", false)]
+ [InlineData("relative.htm", "http://127.0.0.1/folder/relative.htm", false)]
+ [InlineData("relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)]
+ [InlineData("folder/relative.htm", "http://127.0.0.1/folder/relative.htm", true)]
+ [InlineData("folder/relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)]
+ [InlineData("/folder/relative.htm", "http://127.0.0.1/folder/relative.htm", true)]
+ [InlineData("/folder/relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)]
+ [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/absolute.htm", true)]
+ [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/absolute.htm?query=string", false)]
+ [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/folder/absolute.htm", false)]
+ [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/folder/absolute.htm?query=string", false)]
+ [InlineData("http://127.0.0.1/folder/absolute.htm", "http://127.0.0.1/folder/absolute.htm", true)]
+ [InlineData("http://127.0.0.1/folder/absolute.htm", "http://127.0.0.1/folder/absolute.htm?query=string", false)]
+ public async Task When_configuring_requestUri_as_string_it_should_match(string uriString, string requestUri, bool isMatch)
{
var request = new HttpRequestMessage { RequestUri = new Uri(requestUri, UriKind.Absolute) };
// Act
- _sut.RequestUri(uriString, allowWildcards);
+ _sut.RequestUri(uriString);
IReadOnlyCollection matchers = _sut.Build();
// Assert
@@ -169,18 +87,14 @@ public async Task When_configuring_requestUri_as_uri_it_should_match(string matc
}
[Theory]
- [InlineData("*/controller/*", false)]
- [InlineData("*/controller/*", true)]
- [InlineData("file.jpg", true)]
- [InlineData("file.jpg", false)]
- [InlineData("http://0.0.0.0/path/file.jpg", true)]
- [InlineData("http://0.0.0.0/path/file.jpg", false)]
- public void When_formatting_uriString_matcher_it_should_return_human_readable_representation(string uriString, bool allowWildcards)
+ [InlineData("file.jpg")]
+ [InlineData("http://0.0.0.0/path/file.jpg")]
+ public void When_formatting_uriString_matcher_it_should_return_human_readable_representation(string uriString)
{
string expectedText = $"RequestUri: '{uriString}'";
// Act
- _sut.RequestUri(uriString, allowWildcards);
+ _sut.RequestUri(uriString);
IReadOnlyCollection matchers = _sut.Build();
string displayText = matchers.Should()
.ContainSingle()
@@ -859,8 +773,7 @@ public void Given_null_argument_when_executing_method_it_should_throw(params obj
DelegateTestCase.Create(
RequestMatchingExtensions.RequestUri,
instance,
- uri.ToString(),
- true
+ Matches.Empty
),
DelegateTestCase.Create(
RequestMatchingExtensions.RequestUri,
diff --git a/test/MockHttp.Tests/MockHttpHandlerTests.cs b/test/MockHttp.Tests/MockHttpHandlerTests.cs
index e225ce5..32d9057 100644
--- a/test/MockHttp.Tests/MockHttpHandlerTests.cs
+++ b/test/MockHttp.Tests/MockHttpHandlerTests.cs
@@ -6,6 +6,7 @@
using MockHttp.Http;
using MockHttp.Language;
using MockHttp.Language.Flow;
+using MockHttp.Matchers;
using Newtonsoft.Json;
namespace MockHttp;
@@ -251,7 +252,7 @@ public async Task Given_number_of_requests_match_expected_callCount_when_verifyi
// Act
Action verifyGet = () => _sut.Verify(
- matching => matching.RequestUri("**/url"),
+ matching => matching.RequestUri(Matches.Wildcard("**/url")),
isSent
);
@@ -293,7 +294,7 @@ public async Task Given_number_of_requests_does_not_match_expected_callCount_whe
// Act
Action verifyGet = () => _sut.Verify(
- matching => matching.RequestUri("**/url"),
+ matching => matching.RequestUri(Matches.Wildcard("**/url")),
isSent
);
@@ -367,7 +368,7 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co
_sut
.When(matching => matching
- .RequestUri("http://0.0.0.1/*/action*")
+ .RequestUri(Matches.Wildcard("http://0.0.0.1/*/action*"))
.QueryString("test", "$%^&*")
.QueryString("test2=value")
.Method("POST")
@@ -380,7 +381,7 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co
.Version(version)
.Any(any => any
.RequestUri("not-matching")
- .RequestUri("**controller**")
+ .RequestUri(Matches.Wildcard("**controller**"))
)
.Where(r => 0 < r.Version.Major)
)
@@ -418,7 +419,9 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co
HttpResponseMessage response = await _httpClient.SendAsync(req);
// Assert
- _sut.Verify(matching => matching.RequestUri("**/controller/**"), IsSent.Exactly(2), "we sent it");
+#pragma warning disable S6966
+ _sut.Verify(matching => matching.RequestUri(Matches.Wildcard("**/controller/**")), IsSent.Exactly(2), "we sent it");
+#pragma warning restore S6966
#if !NETFRAMEWORK
await _sut.VerifyAsync(matching => matching.Body(jsonPostContent), IsSent.Once, "we sent it");
#endif
diff --git a/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt
index 0a8f21e..de11935 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt
@@ -148,6 +148,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -386,6 +387,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex([System.Diagnostics.CodeAnalysis.StringSyntax("Regex")] string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{
diff --git a/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt
index 546449f..50e3bac 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt
@@ -148,6 +148,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -386,6 +387,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex([System.Diagnostics.CodeAnalysis.StringSyntax("Regex")] string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{
diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt
index 0432b85..179b5db 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt
@@ -147,6 +147,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -385,6 +386,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex(string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{
diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt
index 0432b85..179b5db 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt
@@ -147,6 +147,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -385,6 +386,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex(string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{
diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt
index 0432b85..179b5db 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt
@@ -147,6 +147,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -385,6 +386,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex(string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{
diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt
index fd91946..8d9c771 100644
--- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt
+++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt
@@ -147,6 +147,7 @@ namespace MockHttp
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { }
public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { }
+ public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { }
public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { }
public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { }
@@ -385,6 +386,26 @@ namespace MockHttp.Matchers
bool IsExclusive { get; }
System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext);
}
+ public readonly struct Matches : System.IEquatable
+ {
+ public required System.Func IsMatch { get; init; }
+ public required string Value { get; init; }
+ public static MockHttp.Matchers.Matches Any { get; }
+ public static MockHttp.Matchers.Matches Empty { get; }
+ public override string ToString() { }
+ public static MockHttp.Matchers.Matches Exactly(string value) { }
+ public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { }
+ public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { }
+ public static MockHttp.Matchers.Matches Regex(string regex) { }
+ public static MockHttp.Matchers.Matches Wildcard(string value) { }
+ public static MockHttp.Matchers.Matches op_Implicit(string value) { }
+ public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { }
+ public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ public static bool operator false(MockHttp.Matchers.Matches _) { }
+ public static bool operator true(MockHttp.Matchers.Matches _) { }
+ public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { }
+ }
}
namespace MockHttp.Response
{