Skip to content

Commit e0d429e

Browse files
committed
Adds assertion for the used HttpMethod of a request.
1 parent 3cd6b24 commit e0d429e

File tree

2 files changed

+99
-5
lines changed

2 files changed

+99
-5
lines changed

src/HttpClientTestHelpers/HttpRequestMessageAsserter.cs

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,37 @@
55

66
namespace HttpClientTestHelpers
77
{
8+
/// <summary>
9+
/// This class makes it easy to create assertions on a collection of <seealso cref="HttpRequestMessage"/>s.
10+
/// </summary>
811
public class HttpRequestMessageAsserter
912
{
1013
private readonly List<string> _expectedConditions = new List<string>();
1114
private readonly bool _negate = false;
1215

16+
/// <summary>
17+
/// Construct a new HttpRequestMessageAsserter.
18+
/// </summary>
19+
/// <param name="httpRequestMessages">The list of requests to assert on.</param>
1320
public HttpRequestMessageAsserter(IEnumerable<HttpRequestMessage> httpRequestMessages)
21+
: this(httpRequestMessages, false)
1422
{
15-
Requests = httpRequestMessages ?? throw new ArgumentNullException(nameof(httpRequestMessages));
1623
}
1724

25+
/// <summary>
26+
/// Construct a new HttpRequestMessageAsserter.
27+
/// </summary>
28+
/// <param name="httpRequestMessages">The list of requests to assert on.</param>
29+
/// <param name="negate">Whether or not all assertions should be negated.</param>
1830
public HttpRequestMessageAsserter(IEnumerable<HttpRequestMessage> httpRequestMessages, bool negate)
1931
{
2032
Requests = httpRequestMessages ?? throw new ArgumentNullException(nameof(httpRequestMessages));
2133
_negate = negate;
2234
}
2335

36+
/// <summary>
37+
/// The list of requests received from <seealso cref="TestableHttpMessageHandler"/>.
38+
/// </summary>
2439
public IEnumerable<HttpRequestMessage> Requests { get; private set; }
2540

2641
private void Assert(int? count = null)
@@ -66,16 +81,52 @@ private void Assert(int? count = null)
6681
}
6782
}
6883

69-
public HttpRequestMessageAsserter WithUriPattern(string pattern)
84+
/// <summary>
85+
/// Asserts whether requests comply with a specific filter.
86+
/// </summary>
87+
/// <param name="requestFilter">The filter to filter requests with before asserting.</param>
88+
/// <param name="condition">The name of the conditon, used in the exception message.</param>
89+
/// <returns>The <seealso cref="HttpRequestMessageAsserter"/> for further assertions.</returns>
90+
public HttpRequestMessageAsserter With(Func<HttpRequestMessage, bool> requestFilter, string condition)
7091
{
71-
if (pattern != "*")
92+
if (!string.IsNullOrEmpty(condition))
7293
{
73-
_expectedConditions.Add($"uri pattern '{pattern}'");
94+
_expectedConditions.Add(condition);
7495
}
7596

76-
Requests = Requests.Where(x => x.HasMatchingUri(pattern));
97+
Requests = Requests.Where(requestFilter);
7798
Assert();
7899
return this;
79100
}
101+
102+
/// <summary>
103+
/// Asserts wheter requests were made to a given URI based on a pattern.
104+
/// </summary>
105+
/// <param name="pattern">The uri pattern that is expected.</param>
106+
/// <returns>The <seealso cref="HttpRequestMessageAsserter"/> for further assertions.</returns>
107+
public HttpRequestMessageAsserter WithUriPattern(string pattern)
108+
{
109+
string condition = string.Empty;
110+
if (pattern != "*")
111+
{
112+
condition = $"uri pattern '{pattern}'";
113+
}
114+
return With(x => x.HasMatchingUri(pattern), condition);
115+
}
116+
117+
/// <summary>
118+
/// Asserts wheter requests were made with a given HTTP Method.
119+
/// </summary>
120+
/// <param name="httpMethod">The <seealso cref="HttpMethod"/> that is expected.</param>
121+
/// <returns>The <seealso cref="HttpRequestMessageAsserter"/> for further assertions.</returns>
122+
public HttpRequestMessageAsserter WithHttpMethod(HttpMethod httpMethod)
123+
{
124+
if (httpMethod == null)
125+
{
126+
throw new ArgumentNullException(nameof(httpMethod));
127+
}
128+
129+
return With(x => x.HasHttpMethod(httpMethod), $"HTTP Method '{httpMethod}'");
130+
}
80131
}
81132
}

test/HttpClientTestHelpers.Tests/HttpRequestMessageAsserterTests.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,48 @@ public void WithUriPattern_RequestWithStarPatternAndNoRequests_ThrowsHttpRequest
5050
var exception = Assert.Throws<HttpRequestMessageAssertionException>(() => sut.WithUriPattern("*"));
5151
Assert.Equal("Expected at least one request to be made, but no requests were made.", exception.Message);
5252
}
53+
54+
#nullable disable
55+
[Fact]
56+
public void WithHttpmethod_NullHttpMethod_ThrowsArgumentNullException()
57+
{
58+
var sut = new HttpRequestMessageAsserter(Enumerable.Empty<HttpRequestMessage>());
59+
60+
var exception = Assert.Throws<ArgumentNullException>(() => sut.WithHttpMethod(null));
61+
62+
Assert.Equal("httpMethod", exception.ParamName);
63+
}
64+
#nullable restore
65+
66+
[Fact]
67+
public void WithHttpmethod_NoRequests_ThrowsHttpRequestMessageAssertionExceptionWithSpecificMessage()
68+
{
69+
var sut = new HttpRequestMessageAsserter(Enumerable.Empty<HttpRequestMessage>());
70+
71+
var exception = Assert.Throws<HttpRequestMessageAssertionException>(() => sut.WithHttpMethod(HttpMethod.Get));
72+
73+
Assert.Equal("Expected at least one request to be made with HTTP Method 'GET', but no requests were made.", exception.Message);
74+
}
75+
76+
[Fact]
77+
public void WithHttpmethod_RequestsWithIncorrectHttpMethod_ThrowsHttpRequestMessageAssertionExceptionWithSpecificMessage()
78+
{
79+
var sut = new HttpRequestMessageAsserter(new[] { new HttpRequestMessage(HttpMethod.Post, new Uri("https://example.com")) });
80+
81+
var exception = Assert.Throws<HttpRequestMessageAssertionException>(() => sut.WithHttpMethod(HttpMethod.Get));
82+
83+
Assert.Equal("Expected at least one request to be made with HTTP Method 'GET', but no requests were made.", exception.Message);
84+
}
85+
86+
[Fact]
87+
public void WithHttpMethod_RequestsWithCorrectMethod_ReturnsHttpRequestMessageAsserter()
88+
{
89+
var sut = new HttpRequestMessageAsserter(new[] { new HttpRequestMessage(HttpMethod.Get, new Uri("https://example.com")) });
90+
91+
var result = sut.WithHttpMethod(HttpMethod.Get);
92+
93+
Assert.NotNull(result);
94+
Assert.IsType<HttpRequestMessageAsserter>(result);
95+
}
5396
}
5497
}

0 commit comments

Comments
 (0)