Skip to content

Commit 7050b14

Browse files
committed
Start using a custom Request type for asserting
1 parent b227699 commit 7050b14

File tree

3 files changed

+78
-110
lines changed

3 files changed

+78
-110
lines changed

src/TestableHttpClient/HttpRequestMessageAsserter.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
internal sealed class HttpRequestMessageAsserter : IHttpRequestMessagesCheck
77
{
88
private readonly List<string> _expectedConditions = new();
9+
private Request expectedRequest;
910

1011
/// <summary>
1112
/// Construct a new HttpRequestMessageAsserter.
@@ -16,6 +17,7 @@ public HttpRequestMessageAsserter(IEnumerable<HttpRequestMessage> httpRequestMes
1617
{
1718
Requests = httpRequestMessages ?? throw new ArgumentNullException(nameof(httpRequestMessages));
1819
Options = options ?? new TestableHttpMessageHandlerOptions();
20+
expectedRequest = new Request(Options.UriPatternMatchingOptions);
1921
}
2022

2123
/// <summary>
@@ -108,8 +110,9 @@ private IHttpRequestMessagesCheck WithRequestUri(string pattern, int? expectedNu
108110
}
109111

110112
UriPattern uriPattern = UriPatternParser.Parse(pattern);
113+
expectedRequest = expectedRequest with { RequestUri = uriPattern };
111114

112-
return WithFilter(x => x.RequestUri is not null && uriPattern.Matches(x.RequestUri, Options.UriPatternMatchingOptions), expectedNumberOfRequests, condition);
115+
return WithFilter(x => expectedRequest.Equals(x), expectedNumberOfRequests, condition);
113116
}
114117

115118
/// <summary>
@@ -130,8 +133,8 @@ private IHttpRequestMessagesCheck WithRequestUri(string pattern, int? expectedNu
130133
private IHttpRequestMessagesCheck WithHttpMethod(HttpMethod httpMethod, int? expectedNumberOfRequests)
131134
{
132135
Guard.ThrowIfNull(httpMethod);
133-
134-
return WithFilter(x => x.HasHttpMethod(httpMethod), expectedNumberOfRequests, $"HTTP Method '{httpMethod}'");
136+
expectedRequest = expectedRequest with { HttpMethod = httpMethod };
137+
return WithFilter(x => expectedRequest.Equals(x), expectedNumberOfRequests, $"HTTP Method '{httpMethod}'");
135138
}
136139

137140
/// <summary>
@@ -154,7 +157,9 @@ private IHttpRequestMessagesCheck WithHttpVersion(Version httpVersion, int? expe
154157
{
155158
Guard.ThrowIfNull(httpVersion);
156159

157-
return WithFilter(x => x.HasHttpVersion(httpVersion), expectedNumberOfRequests, $"HTTP Version '{httpVersion}'");
160+
expectedRequest = expectedRequest with { HttpVersion = httpVersion };
161+
162+
return WithFilter(x => expectedRequest.Equals(x), expectedNumberOfRequests, $"HTTP Version '{httpVersion}'");
158163
}
159164

160165
/// <summary>
@@ -223,6 +228,7 @@ private IHttpRequestMessagesCheck WithContent(string pattern, int? expectedNumbe
223228
{
224229
Guard.ThrowIfNull(pattern);
225230

226-
return WithFilter(x => x.HasContent(pattern), expectedNumberOfRequests, $"content '{pattern}'");
231+
expectedRequest = expectedRequest with { Content = pattern };
232+
return WithFilter(x => expectedRequest.Equals(x), expectedNumberOfRequests, $"content '{pattern}'");
227233
}
228234
}

src/TestableHttpClient/HttpRequestMessageExtensions.cs

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,6 @@
55
/// </summary>
66
internal static class HttpRequestMessageExtensions
77
{
8-
/// <summary>
9-
/// Determines whether a specific HttpVersion is set on a request.
10-
/// </summary>
11-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct version on.</param>
12-
/// <param name="httpVersion">The expected version.</param>
13-
/// <returns>true when the HttpVersion matches; otherwise, false.</returns>
14-
internal static bool HasHttpVersion(this HttpRequestMessage httpRequestMessage, Version httpVersion)
15-
{
16-
Guard.ThrowIfNull(httpRequestMessage);
17-
Guard.ThrowIfNull(httpVersion);
18-
19-
return httpRequestMessage.Version == httpVersion;
20-
}
21-
22-
/// <summary>
23-
/// Determines whether a specific HttpMethod is set on a request.
24-
/// </summary>
25-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
26-
/// <param name="httpMethod">The expected method.</param>
27-
/// <returns>true when the HttpMethod matches; otherwise, false.</returns>
28-
internal static bool HasHttpMethod(this HttpRequestMessage httpRequestMessage, HttpMethod httpMethod)
29-
{
30-
Guard.ThrowIfNull(httpRequestMessage);
31-
Guard.ThrowIfNull(httpMethod);
32-
33-
return httpRequestMessage.Method == httpMethod;
34-
}
35-
368
internal static bool HasHeader(this HttpRequestMessage httpRequestMessage, string headerName)
379
{
3810
Guard.ThrowIfNull(httpRequestMessage);
@@ -49,81 +21,4 @@ internal static bool HasHeader(this HttpRequestMessage httpRequestMessage, strin
4921

5022
return httpRequestMessage.Headers.HasHeader(headerName, headerValue) || (httpRequestMessage.Content is not null && httpRequestMessage.Content.Headers.HasHeader(headerName, headerValue));
5123
}
52-
53-
[Obsolete("Use HasHeader instead.")]
54-
internal static bool HasRequestHeader(this HttpRequestMessage httpRequestMessage, string headerName)
55-
{
56-
Guard.ThrowIfNull(httpRequestMessage);
57-
Guard.ThrowIfNullOrEmpty(headerName);
58-
59-
return httpRequestMessage.Headers.HasHeader(headerName);
60-
}
61-
62-
[Obsolete("Use HasHeader instead.")]
63-
internal static bool HasRequestHeader(this HttpRequestMessage httpRequestMessage, string headerName, string headerValue)
64-
{
65-
Guard.ThrowIfNull(httpRequestMessage);
66-
Guard.ThrowIfNullOrEmpty(headerName);
67-
Guard.ThrowIfNullOrEmpty(headerValue);
68-
69-
return httpRequestMessage.Headers.HasHeader(headerName, headerValue);
70-
}
71-
72-
[Obsolete("Use HasHeader instead.")]
73-
internal static bool HasContentHeader(this HttpRequestMessage httpRequestMessage, string headerName)
74-
{
75-
Guard.ThrowIfNull(httpRequestMessage);
76-
Guard.ThrowIfNullOrEmpty(headerName);
77-
78-
if (httpRequestMessage.Content == null)
79-
{
80-
return false;
81-
}
82-
83-
return httpRequestMessage.Content.Headers.HasHeader(headerName);
84-
}
85-
86-
[Obsolete("Use HasHeader instead.")]
87-
internal static bool HasContentHeader(this HttpRequestMessage httpRequestMessage, string headerName, string headerValue)
88-
{
89-
Guard.ThrowIfNull(httpRequestMessage);
90-
Guard.ThrowIfNullOrEmpty(headerName);
91-
Guard.ThrowIfNullOrEmpty(headerValue);
92-
93-
if (httpRequestMessage.Content == null)
94-
{
95-
return false;
96-
}
97-
98-
return httpRequestMessage.Content.Headers.HasHeader(headerName, headerValue);
99-
}
100-
101-
/// <summary>
102-
/// Determines whether the request content matches a string pattern.
103-
/// </summary>
104-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct content on.</param>
105-
/// <param name="pattern">A pattern to match the request content, supports * as wildcards.</param>
106-
/// <returns>true when the request content matches the pattern; otherwise, false.</returns>
107-
internal static bool HasContent(this HttpRequestMessage httpRequestMessage, string pattern)
108-
{
109-
Guard.ThrowIfNull(httpRequestMessage);
110-
Guard.ThrowIfNull(pattern);
111-
112-
if (httpRequestMessage.Content == null)
113-
{
114-
return false;
115-
}
116-
117-
var stringContent = httpRequestMessage.Content.ReadAsStringAsync()
118-
.ConfigureAwait(false)
119-
.GetAwaiter()
120-
.GetResult();
121-
122-
return pattern switch
123-
{
124-
"" => stringContent == pattern,
125-
"*" => true,
126-
_ => StringMatcher.Matches(stringContent, pattern),
127-
};
128-
}
12924
}

src/TestableHttpClient/Request.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
namespace TestableHttpClient;
2+
3+
internal record Request : IEquatable<HttpRequestMessage>
4+
{
5+
public Request(UriPatternMatchingOptions uriPatternMatchingOptions)
6+
{
7+
UriPatternMatchingOptions = uriPatternMatchingOptions;
8+
}
9+
10+
public UriPatternMatchingOptions UriPatternMatchingOptions { get; }
11+
12+
public HttpMethod? HttpMethod { get; init; }
13+
public UriPattern? RequestUri { get; init; }
14+
public Version? HttpVersion { get; init; }
15+
16+
public string? Content { get; init; }
17+
18+
public bool Equals(HttpRequestMessage? other)
19+
{
20+
if (other is null)
21+
{
22+
return false;
23+
}
24+
25+
if (HttpMethod is not null && other.Method != HttpMethod)
26+
{
27+
return false;
28+
}
29+
30+
if (RequestUri is not null && other.RequestUri is not null && !RequestUri.Matches(other.RequestUri, UriPatternMatchingOptions))
31+
{
32+
return false;
33+
}
34+
35+
if (HttpVersion is not null && other.Version != HttpVersion)
36+
{
37+
return false;
38+
}
39+
40+
if (Content is not null)
41+
{
42+
if(other.Content is null)
43+
{
44+
return false;
45+
}
46+
47+
var stringContent = other.Content.ReadAsStringAsync()
48+
.ConfigureAwait(false)
49+
.GetAwaiter()
50+
.GetResult();
51+
52+
var contentMatches = Content switch
53+
{
54+
"" => stringContent == Content,
55+
"*" => true,
56+
_ => StringMatcher.Matches(stringContent, Content),
57+
};
58+
59+
if (!contentMatches)
60+
{
61+
return false;
62+
}
63+
}
64+
65+
return true;
66+
}
67+
}

0 commit comments

Comments
 (0)