Skip to content

Commit 6ed21f9

Browse files
authored
Prepare release (#332)
1 parent 61fbaa2 commit 6ed21f9

6 files changed

Lines changed: 74 additions & 42 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ All notable changes to TestableHttpClient will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and
55
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7-
## [0.12] - unplanned
7+
## [0.12] - 2026-06-06
88
### Deprecated
99
- The methods `WithRequestHeader` and `WithContentHeader` are deprecated, please use `WithHeader` instead.
1010
- The `WithFilter` method is deprecated and will be removed. If there is a specific assertion that is missing, please open an issue.
1111

1212
### Removed
1313
- .NET 6.0 target, since it is no longer supported
14-
- .NET Framework 4.6.2, 4.7.0 and 4.7.2, since these can't be tested using xUnit v3
14+
- .NET Framework 4.6.2, 4.7.0 and 4.7.1, since these can't be tested using xUnit v3
1515
- Automatic nuget updates by dependabot, since we want to test against the lowest supported nuget version and most of the time dependabot does not choose the right package.
1616

1717
### Added

src/TestableHttpClient/PublicAPI.Shipped.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ TestableHttpClient.TestableHttpMessageHandler.Options.get -> TestableHttpClient.
55
TestableHttpClient.TestableHttpMessageHandler.Requests.get -> System.Collections.Generic.IEnumerable<System.Net.Http.HttpRequestMessage!>!
66
TestableHttpClient.TestableHttpMessageHandler.RespondWith(TestableHttpClient.IResponse! response) -> void
77
TestableHttpClient.TestableHttpMessageHandler.TestableHttpMessageHandler() -> void
8+
TestableHttpClient.TestableHttpMessageHandler.ShouldHaveMadeRequests(int numberOfRequests, System.Action<TestableHttpClient.RequestBuilder!>! builder) -> void
9+
TestableHttpClient.TestableHttpMessageHandler.ShouldHaveMadeRequests(System.Action<TestableHttpClient.RequestBuilder!>! builder) -> void
10+
override TestableHttpClient.TestableHttpMessageHandler.Dispose(bool disposing) -> void
811
override TestableHttpClient.TestableHttpMessageHandler.SendAsync(System.Net.Http.HttpRequestMessage! request, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage!>!
912

1013
TestableHttpClient.TestableHttpMessageHandlerOptions
@@ -26,6 +29,8 @@ TestableHttpClient.UriPatternMatchingOptions.SchemeCaseInsensitive.set -> void
2629
TestableHttpClient.UriPatternMatchingOptions.UriPatternMatchingOptions() -> void
2730

2831
TestableHttpClient.IRoutingResponseBuilder
32+
TestableHttpClient.IRoutingResponseBuilder.Map(string! route, TestableHttpClient.IResponse! response) -> TestableHttpClient.IRoutingResponseBuilder!
33+
TestableHttpClient.IRoutingResponseBuilder.MapFallBackResponse(TestableHttpClient.IResponse! fallBackResponse) -> TestableHttpClient.IRoutingResponseBuilder!
2934

3035
TestableHttpClient.IResponse
3136
TestableHttpClient.IResponse.ExecuteAsync(TestableHttpClient.HttpResponseContext! context, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
@@ -66,6 +71,18 @@ TestableHttpClient.IHttpRequestMessagesCheck.Options.get -> TestableHttpClient.T
6671
TestableHttpClient.IHttpRequestMessagesCheck.WithFilter(System.Func<System.Net.Http.HttpRequestMessage!, bool>! requestFilter, int expectedNumberOfRequests, string! condition) -> TestableHttpClient.IHttpRequestMessagesCheck!
6772
TestableHttpClient.IHttpRequestMessagesCheck.WithFilter(System.Func<System.Net.Http.HttpRequestMessage!, bool>! requestFilter, int? expectedNumberOfRequests, string! condition) -> TestableHttpClient.IHttpRequestMessagesCheck!
6873
TestableHttpClient.IHttpRequestMessagesCheck.WithFilter(System.Func<System.Net.Http.HttpRequestMessage!, bool>! requestFilter, string! condition) -> TestableHttpClient.IHttpRequestMessagesCheck!
74+
TestableHttpClient.IHttpRequestMessagesCheck.WithContent(string! pattern) -> TestableHttpClient.IHttpRequestMessagesCheck!
75+
TestableHttpClient.IHttpRequestMessagesCheck.WithContent(string! pattern, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
76+
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName) -> TestableHttpClient.IHttpRequestMessagesCheck!
77+
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
78+
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, string! headerValue) -> TestableHttpClient.IHttpRequestMessagesCheck!
79+
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, string! headerValue, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
80+
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpMethod(System.Net.Http.HttpMethod! httpMethod) -> TestableHttpClient.IHttpRequestMessagesCheck!
81+
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpMethod(System.Net.Http.HttpMethod! httpMethod, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
82+
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpVersion(System.Version! httpVersion) -> TestableHttpClient.IHttpRequestMessagesCheck!
83+
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpVersion(System.Version! httpVersion, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
84+
TestableHttpClient.IHttpRequestMessagesCheck.WithRequestUri(string! pattern) -> TestableHttpClient.IHttpRequestMessagesCheck!
85+
TestableHttpClient.IHttpRequestMessagesCheck.WithRequestUri(string! pattern, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
6986

7087
TestableHttpClient.HttpRequestMessageAssertionException
7188
TestableHttpClient.HttpRequestMessageAssertionException.HttpRequestMessageAssertionException() -> void
@@ -92,3 +109,19 @@ TestableHttpClient.Utils.UriPatternParserException
92109
TestableHttpClient.Utils.UriPatternParserException.UriPatternParserException() -> void
93110
TestableHttpClient.Utils.UriPatternParserException.UriPatternParserException(string! message) -> void
94111
TestableHttpClient.Utils.UriPatternParserException.UriPatternParserException(string! message, System.Exception! innerException) -> void
112+
113+
TestableHttpClient.RequestBuilder
114+
TestableHttpClient.RequestBuilder.WithContent(string! pattern) -> TestableHttpClient.RequestBuilder!
115+
TestableHttpClient.RequestBuilder.WithHeader(string! headerName) -> TestableHttpClient.RequestBuilder!
116+
TestableHttpClient.RequestBuilder.WithHeader(string! headerName, string! pattern) -> TestableHttpClient.RequestBuilder!
117+
TestableHttpClient.RequestBuilder.WithMethod(System.Net.Http.HttpMethod! httpMethod) -> TestableHttpClient.RequestBuilder!
118+
TestableHttpClient.RequestBuilder.WithRequestUri(string! pattern) -> TestableHttpClient.RequestBuilder!
119+
TestableHttpClient.RequestBuilder.WithVersion(System.Version! httpVersion) -> TestableHttpClient.RequestBuilder!
120+
121+
TestableHttpClient.RequestBuilderExtension
122+
static TestableHttpClient.RequestBuilderExtension.Get(this TestableHttpClient.RequestBuilder! builder, string! pattern) -> TestableHttpClient.RequestBuilder!
123+
static TestableHttpClient.RequestBuilderExtension.Post(this TestableHttpClient.RequestBuilder! builder, string! pattern, string! content) -> TestableHttpClient.RequestBuilder!
124+
static TestableHttpClient.RequestBuilderExtension.PostAsJson(this TestableHttpClient.RequestBuilder! builder, string! pattern, object? content) -> TestableHttpClient.RequestBuilder!
125+
static TestableHttpClient.RequestBuilderExtension.WithFormUrlEncodedContent(this TestableHttpClient.RequestBuilder! builder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string?, string?>>! formValues) -> TestableHttpClient.RequestBuilder!
126+
static TestableHttpClient.RequestBuilderExtension.WithJsonContent(this TestableHttpClient.RequestBuilder! builder, object? content) -> TestableHttpClient.RequestBuilder!
127+
static TestableHttpClient.RequestBuilderExtension.WithJsonContent(this TestableHttpClient.RequestBuilder! builder, object? content, System.Text.Json.JsonSerializerOptions? options) -> TestableHttpClient.RequestBuilder!
Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1 @@
1-
override TestableHttpClient.TestableHttpMessageHandler.Dispose(bool disposing) -> void
2-
static TestableHttpClient.RequestBuilderExtension.Get(this TestableHttpClient.RequestBuilder! builder, string! pattern) -> TestableHttpClient.RequestBuilder!
3-
static TestableHttpClient.RequestBuilderExtension.Post(this TestableHttpClient.RequestBuilder! builder, string! pattern, string! content) -> TestableHttpClient.RequestBuilder!
4-
static TestableHttpClient.RequestBuilderExtension.PostAsJson(this TestableHttpClient.RequestBuilder! builder, string! pattern, object? content) -> TestableHttpClient.RequestBuilder!
5-
static TestableHttpClient.RequestBuilderExtension.WithFormUrlEncodedContent(this TestableHttpClient.RequestBuilder! builder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string?, string?>>! formValues) -> TestableHttpClient.RequestBuilder!
6-
static TestableHttpClient.RequestBuilderExtension.WithJsonContent(this TestableHttpClient.RequestBuilder! builder, object? content) -> TestableHttpClient.RequestBuilder!
7-
static TestableHttpClient.RequestBuilderExtension.WithJsonContent(this TestableHttpClient.RequestBuilder! builder, object? content, System.Text.Json.JsonSerializerOptions? options) -> TestableHttpClient.RequestBuilder!
8-
TestableHttpClient.IHttpRequestMessagesCheck.WithContent(string! pattern) -> TestableHttpClient.IHttpRequestMessagesCheck!
9-
TestableHttpClient.IHttpRequestMessagesCheck.WithContent(string! pattern, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
10-
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName) -> TestableHttpClient.IHttpRequestMessagesCheck!
11-
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
12-
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, string! headerValue) -> TestableHttpClient.IHttpRequestMessagesCheck!
13-
TestableHttpClient.IHttpRequestMessagesCheck.WithHeader(string! headerName, string! headerValue, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
14-
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpMethod(System.Net.Http.HttpMethod! httpMethod) -> TestableHttpClient.IHttpRequestMessagesCheck!
15-
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpMethod(System.Net.Http.HttpMethod! httpMethod, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
16-
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpVersion(System.Version! httpVersion) -> TestableHttpClient.IHttpRequestMessagesCheck!
17-
TestableHttpClient.IHttpRequestMessagesCheck.WithHttpVersion(System.Version! httpVersion, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
18-
TestableHttpClient.IHttpRequestMessagesCheck.WithRequestUri(string! pattern) -> TestableHttpClient.IHttpRequestMessagesCheck!
19-
TestableHttpClient.IHttpRequestMessagesCheck.WithRequestUri(string! pattern, int expectedNumberOfRequests) -> TestableHttpClient.IHttpRequestMessagesCheck!
20-
TestableHttpClient.IRoutingResponseBuilder.Map(string! route, TestableHttpClient.IResponse! response) -> TestableHttpClient.IRoutingResponseBuilder!
21-
TestableHttpClient.IRoutingResponseBuilder.MapFallBackResponse(TestableHttpClient.IResponse! fallBackResponse) -> TestableHttpClient.IRoutingResponseBuilder!
22-
TestableHttpClient.RequestBuilder
23-
TestableHttpClient.RequestBuilder.WithContent(string! pattern) -> TestableHttpClient.RequestBuilder!
24-
TestableHttpClient.RequestBuilder.WithHeader(string! headerName) -> TestableHttpClient.RequestBuilder!
25-
TestableHttpClient.RequestBuilder.WithHeader(string! headerName, string! pattern) -> TestableHttpClient.RequestBuilder!
26-
TestableHttpClient.RequestBuilder.WithMethod(System.Net.Http.HttpMethod! httpMethod) -> TestableHttpClient.RequestBuilder!
27-
TestableHttpClient.RequestBuilder.WithRequestUri(string! pattern) -> TestableHttpClient.RequestBuilder!
28-
TestableHttpClient.RequestBuilder.WithVersion(System.Version! httpVersion) -> TestableHttpClient.RequestBuilder!
29-
TestableHttpClient.RequestBuilderExtension
30-
TestableHttpClient.TestableHttpMessageHandler.ShouldHaveMadeRequests(int numberOfRequests, System.Action<TestableHttpClient.RequestBuilder!>! builder) -> void
31-
TestableHttpClient.TestableHttpMessageHandler.ShouldHaveMadeRequests(System.Action<TestableHttpClient.RequestBuilder!>! builder) -> void
1+


src/TestableHttpClient/RequestBuilder.cs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
namespace TestableHttpClient;
22

3+
/// <summary>
4+
/// Class to build a request, used for assertions.
5+
/// </summary>
36
public sealed class RequestBuilder
47
{
58
private Request request;
9+
610
internal TestableHttpMessageHandlerOptions Options { get; }
711

812
internal RequestBuilder(TestableHttpMessageHandlerOptions? options = null)
@@ -11,6 +15,11 @@ internal RequestBuilder(TestableHttpMessageHandlerOptions? options = null)
1115
request = new(Options.UriPatternMatchingOptions);
1216
}
1317

18+
/// <summary>
19+
/// Specify the HTTP Method of a request, if not specified any method is matched.
20+
/// </summary>
21+
/// <param name="httpMethod">The expected HTTP Method.</param>
22+
/// <returns>The request builder.</returns>
1423
public RequestBuilder WithMethod(HttpMethod httpMethod)
1524
{
1625
Guard.ThrowIfNull(httpMethod);
@@ -19,6 +28,11 @@ public RequestBuilder WithMethod(HttpMethod httpMethod)
1928
return this;
2029
}
2130

31+
/// <summary>
32+
/// Specify the expected request uri, this can be a pattern, when not given any uri is used.
33+
/// </summary>
34+
/// <param name="pattern">The expected pattern of the request uri.</param>
35+
/// <returns>The request builder.</returns>
2236
public RequestBuilder WithRequestUri(string pattern)
2337
{
2438
Guard.ThrowIfNullOrEmpty(pattern);
@@ -27,6 +41,11 @@ public RequestBuilder WithRequestUri(string pattern)
2741
return this;
2842
}
2943

44+
/// <summary>
45+
/// Specify the expected HTTP Version used for the request, if not specified any version is matched.
46+
/// </summary>
47+
/// <param name="httpVersion">The expected HTTP Version.</param>
48+
/// <returns>The request builder.</returns>
3049
public RequestBuilder WithVersion(Version httpVersion)
3150
{
3251
Guard.ThrowIfNull(httpVersion);
@@ -35,14 +54,19 @@ public RequestBuilder WithVersion(Version httpVersion)
3554
return this;
3655
}
3756

38-
public RequestBuilder WithHeader(string headerName)
39-
{
40-
Guard.ThrowIfNullOrEmpty(headerName);
41-
42-
request = request.AddHeader(headerName, Value.Any());
43-
return this;
44-
}
57+
/// <summary>
58+
/// Specify the headername that should be present in the request, the value is matched with the any value.
59+
/// </summary>
60+
/// <param name="headerName">The expected header name.</param>
61+
/// <returns>The request builder.</returns>
62+
public RequestBuilder WithHeader(string headerName) => WithHeader(headerName, "*");
4563

64+
/// <summary>
65+
/// Specify the header name and value that should be present in the request, the value can be a pattern.
66+
/// </summary>
67+
/// <param name="headerName">The expected header name.</param>
68+
/// <param name="pattern">The expected value.</param>
69+
/// <returns>The request builder.</returns>
4670
public RequestBuilder WithHeader(string headerName, string pattern)
4771
{
4872
Guard.ThrowIfNullOrEmpty(headerName);
@@ -52,6 +76,11 @@ public RequestBuilder WithHeader(string headerName, string pattern)
5276
return this;
5377
}
5478

79+
/// <summary>
80+
/// Specify the content that should be present in the request, if not specified any content is valid.
81+
/// </summary>
82+
/// <param name="pattern">The expected content, this can be a pattern.</param>
83+
/// <returns>The request value</returns>
5584
public RequestBuilder WithContent(string pattern)
5685
{
5786
Guard.ThrowIfNull(pattern);

src/TestableHttpClient/Utils/Value.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal abstract record Value
77
private static readonly Value _anyValue = new AnyValue();
88
public static Value Any() => _anyValue;
99
public static Value Exact(string value) => new ExactValue(value);
10-
public static Value Pattern(string pattern) => new PatternValue(pattern);
10+
public static Value Pattern(string pattern) => pattern == "*" ? _anyValue : new PatternValue(pattern);
1111
internal abstract bool Matches(string value, bool ignoreCase);
1212
}
1313

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "0.12-alpha",
3+
"version": "0.12",
44
"versionHeightOffset": -1,
55
"publicReleaseRefSpec": [
66
"^refs/tags/v\\d+(?:\\.\\d+)?$"

0 commit comments

Comments
 (0)