Skip to content

Commit 46d9a3e

Browse files
authored
Added WithContent assertion
Added the `HasContent` extension method, that checks if a `HttpRequestMessage` contains a specific string representation of content. Added the `WithContent` method to the `HttpRequestMessageAsserter` to be able to simply assert the string content of the message. Closes #2
1 parent 4595dc4 commit 46d9a3e

File tree

4 files changed

+191
-8
lines changed

4 files changed

+191
-8
lines changed

src/HttpClientTestHelpers/HttpRequestMessageAsserter.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,21 @@ public HttpRequestMessageAsserter WithHeader(string headerName, string headerVal
254254
return With(x => x.HasRequestHeader(headerName, headerValue) || x.HasContentHeader(headerName, headerValue), $"header '{headerName}' and value '{headerValue}'");
255255
}
256256

257+
/// <summary>
258+
/// Asserts whether requests were made with specific content.
259+
/// </summary>
260+
/// <param name="pattern">The expected content, supports wildcards.</param>
261+
/// <returns>The <seealso cref="HttpRequestMessageAsserter"/> for further assertions.</returns>
262+
public HttpRequestMessageAsserter WithContent(string pattern)
263+
{
264+
if(pattern == null)
265+
{
266+
throw new ArgumentNullException(nameof(pattern));
267+
}
268+
269+
return With(x => x.HasContent(pattern), $"content '{pattern}'");
270+
}
271+
257272
/// <summary>
258273
/// Asserts that a specific amount of requests were made.
259274
/// </summary>

src/HttpClientTestHelpers/HttpRequestMessageExtensions.cs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public static bool HasHttpMethod(this HttpRequestMessage httpRequestMessage, str
9898
/// Determines whether a specific header is set on a request.
9999
/// </summary>
100100
/// <remarks>This method only checks headers in <see cref="System.Net.Http.Headers.HttpRequestHeaders"/></remarks>
101-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
101+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the request header on.</param>
102102
/// <param name="headerName">The name of the header to locate on the request.</param>
103103
/// <returns>true when the request contains a header with the specified name; otherwise, false.</returns>
104104
public static bool HasRequestHeader(this HttpRequestMessage httpRequestMessage, string headerName)
@@ -120,7 +120,7 @@ public static bool HasRequestHeader(this HttpRequestMessage httpRequestMessage,
120120
/// Determines whether a specific header with a specific value is set on a request.
121121
/// </summary>
122122
/// <remarks>This method only checks headers in <see cref="System.Net.Http.Headers.HttpRequestHeaders"/></remarks>
123-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
123+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the request header on.</param>
124124
/// <param name="headerName">The name of the header to locate on the request.</param>
125125
/// <param name="headerValue">The value the header should have. Wildcard is supported.</param>
126126
/// <returns>true when the request contains a header with the specified name and value; otherwise, false.</returns>
@@ -148,8 +148,8 @@ public static bool HasRequestHeader(this HttpRequestMessage httpRequestMessage,
148148
/// Determines whether a specific header is set on a request.
149149
/// </summary>
150150
/// <remarks>This method only checks headers in <see cref="System.Net.Http.Headers.HttpContentHeaders"/></remarks>
151-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
152-
/// <param name="headerName">The name of the header to locate on the request.</param>
151+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the content header on.</param>
152+
/// <param name="headerName">The name of the header to locate on the request content.</param>
153153
/// <returns>true when the request contains a header with the specified name; otherwise, false.</returns>
154154
public static bool HasContentHeader(this HttpRequestMessage httpRequestMessage, string headerName)
155155
{
@@ -175,8 +175,8 @@ public static bool HasContentHeader(this HttpRequestMessage httpRequestMessage,
175175
/// Determines whether a specific header with a specific value is set on a request.
176176
/// </summary>
177177
/// <remarks>This method only checks headers in <see cref="System.Net.Http.Headers.HttpContentHeaders"/></remarks>
178-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
179-
/// <param name="headerName">The name of the header to locate on the request.</param>
178+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the content header on.</param>
179+
/// <param name="headerName">The name of the header to locate on the request content.</param>
180180
/// <param name="headerValue">The value the header should have. Wildcard is supported.</param>
181181
/// <returns>true when the request contains a header with the specified name and value; otherwise, false.</returns>
182182
public static bool HasContentHeader(this HttpRequestMessage httpRequestMessage, string headerName, string headerValue)
@@ -223,8 +223,8 @@ private static bool HasHeader(this HttpHeaders headers, string headerName, strin
223223
/// <summary>
224224
/// Determines whether the request uri matches a pattern.
225225
/// </summary>
226-
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct method on.</param>
227-
/// <param name="pattern">A pattern to match with the request uri, support * as wildcards.</param>
226+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct uri on.</param>
227+
/// <param name="pattern">A pattern to match with the request uri, supports * as wildcards.</param>
228228
/// <returns>true when the request uri matches the pattern; otherwise, false.</returns>
229229
public static bool HasMatchingUri(this HttpRequestMessage httpRequestMessage, string pattern)
230230
{
@@ -242,6 +242,39 @@ public static bool HasMatchingUri(this HttpRequestMessage httpRequestMessage, st
242242
};
243243
}
244244

245+
/// <summary>
246+
/// Determines whether the request content matches a string pattern.
247+
/// </summary>
248+
/// <param name="httpRequestMessage">A <see cref="HttpRequestMessage"/> to check the correct content on.</param>
249+
/// <param name="pattern">A pattern to match the request content, supports * as wildcards.</param>
250+
/// <returns>true when the request content matches the pattern; otherwise, false.</returns>
251+
public static bool HasContent(this HttpRequestMessage httpRequestMessage, string pattern)
252+
{
253+
if (httpRequestMessage == null)
254+
{
255+
throw new ArgumentNullException(nameof(httpRequestMessage));
256+
}
257+
258+
if (pattern == null)
259+
{
260+
throw new ArgumentNullException(nameof(pattern));
261+
}
262+
263+
if (httpRequestMessage.Content == null)
264+
{
265+
return false;
266+
}
267+
268+
var stringContent = httpRequestMessage.Content.ReadAsStringAsync().Result;
269+
270+
return pattern switch
271+
{
272+
"" => stringContent == pattern,
273+
"*" => true,
274+
_ => Matches(stringContent, pattern),
275+
};
276+
}
277+
245278
private static bool Matches(string value, string pattern)
246279
{
247280
var regex = Regex.Escape(pattern).Replace("\\*", "(.*)");

test/HttpClientTestHelpers.Tests/HttpRequestMessageAsserterTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,47 @@ public void WithHeaderNameAndValue_RequestWithMatchinHeader_ReturnsHttpRequestMe
555555
Assert.IsType<HttpRequestMessageAsserter>(result);
556556
}
557557

558+
#nullable disable
559+
[Fact]
560+
public void WithConten_NullPattern_ThrowsArgumentNullException()
561+
{
562+
var sut = new HttpRequestMessageAsserter(Enumerable.Empty<HttpRequestMessage>());
563+
564+
var exception = Assert.Throws<ArgumentNullException>(() => sut.WithContent(null));
565+
566+
Assert.Equal("pattern", exception.ParamName);
567+
}
568+
#nullable restore
569+
570+
[Fact]
571+
public void WithContent_RequestWithNotMatchingContent_ThrowsHttpRequestMessageAssertionExceptionWithSpecificMessage()
572+
{
573+
var request = new HttpRequestMessage
574+
{
575+
Content = new StringContent("")
576+
};
577+
var sut = new HttpRequestMessageAsserter(new[] { request });
578+
579+
var exception = Assert.Throws<HttpRequestMessageAssertionException>(() => sut.WithContent("some content"));
580+
581+
Assert.Equal("Expected at least one request to be made with content 'some content', but no requests were made.", exception.Message);
582+
}
583+
584+
[Fact]
585+
public void WithContent_RequestWithMatchingContent_ReturnsHttpRequestMessageAsserter()
586+
{
587+
var request = new HttpRequestMessage
588+
{
589+
Content = new StringContent("")
590+
};
591+
var sut = new HttpRequestMessageAsserter(new[] { request });
592+
593+
var result = sut.WithContent("");
594+
595+
Assert.NotNull(result);
596+
Assert.IsType<HttpRequestMessageAsserter>(result);
597+
}
598+
558599
[Fact]
559600
public void Times_ValueLessThan0_ThrowsArgumentException()
560601
{
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net.Http;
4+
using System.Text;
5+
using Xunit;
6+
7+
namespace HttpClientTestHelpers.Tests
8+
{
9+
public partial class HttpRequestMessageExtensionsTests
10+
{
11+
#nullable disable
12+
[Fact]
13+
public void HasContent_NullRequest_ThrowsArgumentNullException()
14+
{
15+
HttpRequestMessage sut = null;
16+
17+
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent(""));
18+
Assert.Equal("httpRequestMessage", exception.ParamName);
19+
}
20+
21+
[Fact]
22+
public void HasContent_NullExpectedContent_ThrowsArgumentNullException()
23+
{
24+
using var sut = new HttpRequestMessage();
25+
26+
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent(null));
27+
Assert.Equal("pattern", exception.ParamName);
28+
}
29+
#nullable enable
30+
31+
[Fact]
32+
public void HasContent_NoContent_ReturnsFalse()
33+
{
34+
using var sut = new HttpRequestMessage();
35+
36+
Assert.False(sut.HasContent(""));
37+
}
38+
39+
[Theory]
40+
[InlineData("")]
41+
[InlineData("Some text")]
42+
[InlineData("{\"key\":\"value\"}")]
43+
public void HasContent_ExactlyMatchingStringContent_ReturnsTrue(string content)
44+
{
45+
using var sut = new HttpRequestMessage
46+
{
47+
Content = new StringContent(content)
48+
};
49+
50+
Assert.True(sut.HasContent(content));
51+
}
52+
53+
[Theory]
54+
[InlineData("")]
55+
[InlineData("Some text")]
56+
[InlineData("{\"key\":\"value\"}")]
57+
public void HasContent_NotMatchingStringContent_ReturnsFalse(string content)
58+
{
59+
using var sut = new HttpRequestMessage
60+
{
61+
Content = new StringContent("Example content")
62+
};
63+
64+
Assert.False(sut.HasContent(content));
65+
}
66+
67+
[Theory]
68+
[InlineData("*")]
69+
[InlineData("username=*&password=*")]
70+
[InlineData("*admin*")]
71+
public void HasContent_MatchingPattern_ReturnsTrue(string pattern)
72+
{
73+
using var sut = new HttpRequestMessage
74+
{
75+
Content = new StringContent("username=admin&password=admin")
76+
};
77+
78+
Assert.True(sut.HasContent(pattern));
79+
}
80+
81+
[Theory]
82+
[InlineData("admin")]
83+
[InlineData("*test*")]
84+
public void HasContent_NotMatchingPattern_ReturnsFalse(string pattern)
85+
{
86+
using var sut = new HttpRequestMessage
87+
{
88+
Content = new StringContent("username=admin&password=admin")
89+
};
90+
91+
Assert.False(sut.HasContent(pattern));
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)