Skip to content

Commit f2f9b11

Browse files
committed
Add tests for when content is disposed and throw a custom exception instead.
1 parent 2c3a7d0 commit f2f9b11

File tree

6 files changed

+71
-17
lines changed

6 files changed

+71
-17
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1414
### Added
1515
- `CreateClient` now accepts `DelegateHandlers` in order to chain Handlers. The InnerHandler property of each handler is set automatically and the `TestableHttpMessageHandler` is automatically set as the last handler. This is showcased with Polly in the integration tests.
1616
- Added support for .NET Framework 4.6.2, .NET Framework 4.7 and .NET Framework 4.8 by running the tests against these versions.
17+
- When validating requests, an `HttpRequestMessageAssertionException` will be thrown when the content of a request is disposed. This typically happens on .NET Framework when the runtime decides to use the older version of System.Net.Http.
1718
- Added several `Responses`, including `Delayed`, `Timeout`, `Configured`, `Sequenced`, `StatusCode` and `Json`. These responses can now be used inside the `RespondWith`.
1819
- Added the possibility to set and override the JsonSerializerOptions.
1920

src/TestableHttpClient/HttpRequestMessageAsserter.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,15 @@ public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> reque
6969
_expectedConditions.Add(condition);
7070
}
7171

72-
Requests = Requests.Where(requestFilter);
73-
Assert(expectedNumberOfRequests);
72+
try
73+
{
74+
Requests = Requests.Where(requestFilter);
75+
Assert(expectedNumberOfRequests);
76+
}
77+
catch (ObjectDisposedException)
78+
{
79+
throw new HttpRequestMessageAssertionException("Can't validate requests, because one or more requests have content that is already disposed.");
80+
}
7481
return this;
7582
}
7683
}

test/TestableHttpClient.IntegrationTests/CustomizeJsonSerialization.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ public async Task Asserting_also_works_this_way()
5151
using var client = sut.CreateClient();
5252
await client.PostAsJsonAsync("http://localhost", new { Name = "Charlie" });
5353

54+
#if NETFRAMEWORK
55+
// Well this doesn't really work on .NET Framework.
56+
sut.ShouldHaveMadeRequests();
57+
#else
5458
sut.ShouldHaveMadeRequests().WithJsonContent(new { Name = "Charlie" });
59+
#endif
5560
}
5661

5762
[Fact]
@@ -67,6 +72,11 @@ public async Task And_we_can_go_crazy_with_it()
6772

6873
await client.PostAsJsonAsync("http://localhost", new { Name = "Charlie" }, options);
6974

75+
#if NETFRAMEWORK
76+
// Well this doesn't really work on .NET Framework.
77+
sut.ShouldHaveMadeRequests();
78+
#else
7079
sut.ShouldHaveMadeRequests().WithJsonContent(new { Name = "Charlie" }, options);
80+
#endif
7181
}
7282
}

test/TestableHttpClient.Tests/HttpRequestMessageAsserterTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,16 @@ public void WithFilter_WithRequestExpectation_PredicateThatDoesMatchAnyRequests_
9191

9292
sut.WithFilter(x => x != null, 1, string.Empty);
9393
}
94+
95+
[Fact]
96+
public void WithFilter_WithDisposedRequestContent_DoesThrowSensibleException()
97+
{
98+
StringContent content = new("");
99+
content.Dispose();
100+
HttpRequestMessage request = new() { Content = content };
101+
HttpRequestMessageAsserter sut = new(new[] { request });
102+
103+
var exception = Assert.Throws<HttpRequestMessageAssertionException>(() => sut.WithFilter(x => x.HasContent("test"), 1, "disposed check"));
104+
Assert.Equal("Can't validate requests, because one or more requests have content that is already disposed.", exception.Message);
105+
}
94106
}

test/TestableHttpClient.Tests/HttpRequestMessageExtensionsTests/HasContent.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,45 @@
22

33
public partial class HttpRequestMessageExtensionsTests
44
{
5-
#nullable disable
65
[Fact]
76
public void HasContent_NullRequest_ThrowsArgumentNullException()
87
{
9-
HttpRequestMessage sut = null;
8+
HttpRequestMessage sut = null!;
109

1110
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent());
1211
Assert.Equal("httpRequestMessage", exception.ParamName);
1312
}
14-
#nullable restore
1513

1614
[Fact]
1715
public void HasContent_NullContent_ReturnsFalse()
1816
{
19-
using var sut = new HttpRequestMessage();
17+
using HttpRequestMessage sut = new();
2018

2119
Assert.False(sut.HasContent());
2220
}
2321

2422
[Fact]
2523
public void HasContent_NotNullContent_ReturnsTrue()
2624
{
27-
using var sut = new HttpRequestMessage
25+
using HttpRequestMessage sut = new()
2826
{
2927
Content = new StringContent("")
3028
};
3129

3230
Assert.True(sut.HasContent());
3331
}
32+
33+
[Fact]
34+
public void HasContent_DisposedContent_ReturnsTrue()
35+
{
36+
StringContent content = new("");
37+
content.Dispose();
38+
39+
using HttpRequestMessage sut = new()
40+
{
41+
Content = content
42+
};
43+
44+
Assert.True(sut.HasContent());
45+
}
3446
}

test/TestableHttpClient.Tests/HttpRequestMessageExtensionsTests/HasContentWithPattern.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
public partial class HttpRequestMessageExtensionsTests
44
{
5-
#nullable disable
65
[Fact]
76
public void HasContentWithPattern_NullRequest_ThrowsArgumentNullException()
87
{
9-
HttpRequestMessage sut = null;
8+
HttpRequestMessage sut = null!;
109

1110
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent(""));
1211
Assert.Equal("httpRequestMessage", exception.ParamName);
@@ -15,17 +14,16 @@ public void HasContentWithPattern_NullRequest_ThrowsArgumentNullException()
1514
[Fact]
1615
public void HasContentWithPattern_NullExpectedContent_ThrowsArgumentNullException()
1716
{
18-
using var sut = new HttpRequestMessage();
17+
using HttpRequestMessage sut = new();
1918

20-
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent(null));
19+
var exception = Assert.Throws<ArgumentNullException>(() => sut.HasContent(null!));
2120
Assert.Equal("pattern", exception.ParamName);
2221
}
23-
#nullable enable
2422

2523
[Fact]
2624
public void HasContentWithPattern_NoContent_ReturnsFalse()
2725
{
28-
using var sut = new HttpRequestMessage();
26+
using HttpRequestMessage sut = new();
2927

3028
Assert.False(sut.HasContent(""));
3129
}
@@ -36,7 +34,7 @@ public void HasContentWithPattern_NoContent_ReturnsFalse()
3634
[InlineData("{\"key\":\"value\"}")]
3735
public void HasContentWithPattern_ExactlyMatchingStringContent_ReturnsTrue(string content)
3836
{
39-
using var sut = new HttpRequestMessage
37+
using HttpRequestMessage sut = new()
4038
{
4139
Content = new StringContent(content)
4240
};
@@ -50,7 +48,7 @@ public void HasContentWithPattern_ExactlyMatchingStringContent_ReturnsTrue(strin
5048
[InlineData("{\"key\":\"value\"}")]
5149
public void HasContentWithPattern_NotMatchingStringContent_ReturnsFalse(string content)
5250
{
53-
using var sut = new HttpRequestMessage
51+
using HttpRequestMessage sut = new()
5452
{
5553
Content = new StringContent("Example content")
5654
};
@@ -64,7 +62,7 @@ public void HasContentWithPattern_NotMatchingStringContent_ReturnsFalse(string c
6462
[InlineData("*admin*")]
6563
public void HasContentWithPattern_MatchingPattern_ReturnsTrue(string pattern)
6664
{
67-
using var sut = new HttpRequestMessage
65+
using HttpRequestMessage sut = new()
6866
{
6967
Content = new StringContent("username=admin&password=admin")
7068
};
@@ -77,11 +75,25 @@ public void HasContentWithPattern_MatchingPattern_ReturnsTrue(string pattern)
7775
[InlineData("*test*")]
7876
public void HasContentWithPattern_NotMatchingPattern_ReturnsFalse(string pattern)
7977
{
80-
using var sut = new HttpRequestMessage
78+
using HttpRequestMessage sut = new()
8179
{
8280
Content = new StringContent("username=admin&password=admin")
8381
};
8482

8583
Assert.False(sut.HasContent(pattern));
8684
}
85+
86+
[Fact]
87+
public void HasContentWithPattern_DisposedContent_ThrowsObjectDisposedException()
88+
{
89+
StringContent content = new("");
90+
content.Dispose();
91+
92+
using HttpRequestMessage sut = new()
93+
{
94+
Content = content
95+
};
96+
97+
Assert.Throws<ObjectDisposedException>(() => sut.HasContent("*"));
98+
}
8799
}

0 commit comments

Comments
 (0)