Skip to content

Commit a8be76d

Browse files
authored
Add expectedNumberOfRequests parameter to With methods
- the `With()` method is renamed to `WithFilter()` since `With` is a language keyword. - the `Times()` method is replaced by an overload on the `WithFilter()` method that accepts an integer to indicate the exact number of requests expected. - an extra overload for WithFilter is added that accepts a nullable integer. Passing `null` indicates that at least 1 request is expected, passing a number indicates the exact number of requests that are expected. - all existing `With*()` methods also received the an overload that accepts an integer to indicate the exact number of expected requests. Note that both the `With` and `Times` methods will be removed in the release after 0.5 Fixes #47
1 parent 4ead628 commit a8be76d

22 files changed

+833
-386
lines changed

CHANGELOG.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Deprecated
9+
- `WithUriPattern(this IHttpRequestMessagesCheck, string)` will be removed in favour of `WithRequestUri(this IHttpRequestMessagesCheck, string)`
10+
- `With(Func<HttpRequestMessage, bool>, string)` will be removed in favour of `WithFilter(Func<HttpRequestMessage, bool>, string)`, since it conflicts with the language keyword `with`.
11+
- `Times(int)` will be removed in favour of the `With*` methods with an `int` parameter.
12+
813
### Added
914
- It is now possible to use NFluent to check `TestableHttpMessageHandler` by using `Check.That(handler).HasMadeRequests()` and `Check.That(handler).HasMadeRequestsTo("https://github.com/dnperfors/testablehttpclient")`. All existing `With` checks are supported.
15+
- All `With*` methods got an extra overload to specify the exact number of expected requests. This is instead of the `Times` method.
16+
1017
### Changed
1118
- Introduced `IHttpRequestMessagesCheck` as the public interface for all checks on requests made to `TestableHttpMessageHandler`. It contains the following api:
12-
- `With(Func<HttpRequestMessage, bool>, string)`
13-
- `Times(int)`
19+
- `WithFilter(Func<HttpRequestMessage, bool>, string)`
20+
- `WithFilter(Func<HttpRequestMessage, bool>, int, string)`
21+
- `WithFilter(Func<HttpRequestMessage, bool>, int?, string)`
1422
- Moved some api's from `TestableHttpMessageHandler` to `TestableHttpMessageHandlerAssertionExtensions`:
1523
- `ShouldHaveMadeRequests(this TestableHttpMessageHandler)`
1624
- `ShouldHaveMadeRequestsTo(this TestableHttpMessageHandler, string)`
@@ -30,9 +38,6 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
3038
- `WithJsonContent(this IHttpRequestMessagesCheck, object)`
3139
- `WithFormUrlEncodedContent(this IHttpRequestMessagesCheck, IEnumerable<KeyValuePair<string, string>)`
3240

33-
### Deprecated
34-
- `WithUriPattern(this IHttpRequestMessagesCheck, string)` will be removed in favour of `WithRequestUri(this IHttpRequestMessagesCheck, string)`
35-
3641
### Removed
3742
- `HttpRequestMessageAsserter` is made internal.
3843

src/TestableHttpClient.NFluent/FluentHttpRequestMessagesChecks.cs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,33 @@ internal class FluentHttpRequestMessagesChecks : FluentSut<IEnumerable<HttpReque
2222
public FluentHttpRequestMessagesChecks(IEnumerable<HttpRequestMessage> httpRequestMessages)
2323
: base(httpRequestMessages, Check.Reporter, false)
2424
{
25-
if (httpRequestMessages == null)
26-
{
27-
throw new ArgumentNullException(nameof(httpRequestMessages));
28-
}
29-
requests = httpRequestMessages;
25+
requests = httpRequestMessages ?? throw new ArgumentNullException(nameof(httpRequestMessages));
3026
}
3127

32-
public IHttpRequestMessagesCheck With(Func<HttpRequestMessage, bool> predicate, string message)
28+
[Obsolete("With is a language keyword and should be avoided, use WithFilter instead.", true)]
29+
public IHttpRequestMessagesCheck With(Func<HttpRequestMessage, bool> predicate, string message) => WithFilter(predicate, message);
30+
31+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, string condition) => WithFilter(requestFilter, null, condition);
32+
33+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, int expectedNumberOfRequests, string condition) => WithFilter(requestFilter, (int?)expectedNumberOfRequests, condition);
34+
35+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, int? expectedNumberOfRequests, string condition)
3336
{
34-
if (!string.IsNullOrEmpty(message))
37+
if (!string.IsNullOrEmpty(condition))
3538
{
36-
requestConditions.Add(message);
39+
requestConditions.Add(condition);
3740
}
3841

3942
var checkLogic = ExtensibilityHelper.BeginCheck(this)
40-
.CantBeNegated(nameof(With))
41-
.FailWhen(_ => predicate == null, "The predicate should not be null.", MessageOption.NoCheckedBlock | MessageOption.NoExpectedBlock)
42-
.Analyze((sut, _) => requests = requests.Where(predicate));
43+
.CantBeNegated(nameof(WithFilter))
44+
.FailWhen(_ => requestFilter == null, "The request filter should not be null.", MessageOption.NoCheckedBlock | MessageOption.NoExpectedBlock)
45+
.Analyze((sut, _) => requests = requests.Where(requestFilter));
4346

44-
AnalyzeNumberOfRequests(checkLogic, null);
47+
AnalyzeNumberOfRequests(checkLogic, expectedNumberOfRequests);
4548
return this;
4649
}
4750

51+
[Obsolete("Times as a seperate check is no longer supported, use the With overload with expectdNumberOfRequests.")]
4852
public IHttpRequestMessagesCheck Times(int count)
4953
{
5054
var checkLogic = ExtensibilityHelper.BeginCheck(this)

src/TestableHttpClient/HttpRequestMessageAsserter.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,40 @@ private void Assert(int? expectedCount = null)
6565
}
6666
}
6767

68+
/// <summary>
69+
/// Asserts whether requests comply with a specific filter.
70+
/// </summary>
71+
/// <param name="predicate">The filter to filter requests with before asserting.</param>
72+
/// <param name="message">The name of the conditon, used in the exception message.</param>
73+
/// <returns>The <seealso cref="IHttpRequestMessagesCheck"/> for further assertions.</returns>
74+
[Obsolete("With is a language keyword and should be avoided, use WithFilter instead.", true)]
75+
public IHttpRequestMessagesCheck With(Func<HttpRequestMessage, bool> predicate, string message) => WithFilter(predicate, message);
76+
6877
/// <summary>
6978
/// Asserts whether requests comply with a specific filter.
7079
/// </summary>
7180
/// <param name="requestFilter">The filter to filter requests with before asserting.</param>
7281
/// <param name="condition">The name of the conditon, used in the exception message.</param>
7382
/// <returns>The <seealso cref="IHttpRequestMessagesCheck"/> for further assertions.</returns>
74-
public IHttpRequestMessagesCheck With(Func<HttpRequestMessage, bool> requestFilter, string condition)
83+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, string condition) => WithFilter(requestFilter, null, condition);
84+
85+
/// <summary>
86+
/// Asserts whether requests comply with a specific filter.
87+
/// </summary>
88+
/// <param name="requestFilter">The filter to filter requests with before asserting.</param>
89+
/// <param name="condition">The name of the conditon, used in the exception message.</param>
90+
/// <returns>The <seealso cref="IHttpRequestMessagesCheck"/> for further assertions.</returns>
91+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, int expectedNumberOfRequests, string condition) => WithFilter(requestFilter, (int?)expectedNumberOfRequests, condition);
92+
93+
public IHttpRequestMessagesCheck WithFilter(Func<HttpRequestMessage, bool> requestFilter, int? expectedNumberOfRequests, string condition)
7594
{
7695
if (!string.IsNullOrEmpty(condition))
7796
{
7897
_expectedConditions.Add(condition);
7998
}
8099

81100
Requests = Requests.Where(requestFilter);
82-
Assert();
101+
Assert(expectedNumberOfRequests);
83102
return this;
84103
}
85104

@@ -88,6 +107,7 @@ public IHttpRequestMessagesCheck With(Func<HttpRequestMessage, bool> requestFilt
88107
/// </summary>
89108
/// <param name="count">The number of requests that are expected, should be a positive value.</param>
90109
/// <returns>The <seealso cref="IHttpRequestMessagesCheck"/> for further assertions.</returns>
110+
[Obsolete("Times as a seperate check is no longer supported, use the WithFilter overload with expectdNumberOfRequests.", true)]
91111
public IHttpRequestMessagesCheck Times(int count)
92112
{
93113
if (count < 0)

0 commit comments

Comments
 (0)