Skip to content

Commit 6fd7e48

Browse files
authored
Asserter updates
1 parent 28f430c commit 6fd7e48

File tree

6 files changed

+77
-37
lines changed

6 files changed

+77
-37
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>0.3.3</Version>
3+
<Version>0.3.4</Version>
44
</PropertyGroup>
55
</Project>

src/QAToolKit.Engine.HttpTester.Test/Exceptions/QAToolKitEngineHttpTesterExceptionTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using QAToolKit.Engine.HttpTester.Exceptions;
22
using System;
3-
using System.Runtime.Serialization;
43
using Xunit;
54

65
namespace QAToolKit.Engine.HttpTester.Test.Exceptions

src/QAToolKit.Engine.HttpTester.Test/HttpTestAsserterTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
using System.Linq;
66
using System.Net;
77
using System.Net.Http;
8-
using System.Net.Http.Headers;
9-
using System.Runtime.InteropServices;
108
using System.Threading.Tasks;
119
using Xunit;
1210

1311
namespace QAToolKit.Engine.HttpTester.Test
14-
{
12+
{
1513
public class HttpTestAsserterTests
1614
{
1715
[Fact]
@@ -120,7 +118,7 @@ public async Task HttpTestAsserterHeaderMissing_Fails()
120118
var httpDuration = client.HttpDuration;
121119
Assert.Throws<ArgumentNullException>(() => asserter
122120
.ResponseContentContains("scott")
123-
.RequestDurationEquals(duration, (x) => x < 2000)
121+
.RequestDurationEquals(duration, (x) => x < Convert.ToInt64("2000"), "x < 2000")
124122
.RequestDurationEquals(httpDuration, (x) => x < 1800)
125123
.ResponseStatusCodeEquals(HttpStatusCode.OK)
126124
.ResponseContentTypeEquals("application/json")

src/QAToolKit.Engine.HttpTester/Exceptions/QAToolKitEngineHttpTesterException.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Runtime.Serialization;
32

43
namespace QAToolKit.Engine.HttpTester.Exceptions
54
{

src/QAToolKit.Engine.HttpTester/HttpTestAsserter.cs

Lines changed: 70 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using QAToolKit.Engine.HttpTester.Models;
44
using System;
55
using System.Collections.Generic;
6+
using System.Linq.Expressions;
67
using System.Net;
78
using System.Net.Http;
89
using System.Net.Http.Headers;
@@ -24,7 +25,8 @@ public class HttpTestAsserter : IHttpTestAsserter
2425
/// <param name="httpResponseMessage"></param>
2526
public HttpTestAsserter(HttpResponseMessage httpResponseMessage)
2627
{
27-
_httpResponseMessage = httpResponseMessage ?? throw new ArgumentNullException($"{nameof(httpResponseMessage)} is null.");
28+
_httpResponseMessage = httpResponseMessage ??
29+
throw new ArgumentNullException($"{nameof(httpResponseMessage)} is null.");
2830
_assertResults = new List<AssertResult>();
2931
}
3032

@@ -40,8 +42,8 @@ public IEnumerable<AssertResult> AssertAll()
4042
/// <summary>
4143
/// HTTP body contains a string (ignores case)
4244
/// </summary>
43-
/// <param name="keyword"></param>
44-
/// <param name="caseInsensitive"></param>
45+
/// <param name="keyword">Check if the HTTP response body contains a keyword.</param>
46+
/// <param name="caseInsensitive">Use case sensitive string comparison.</param>
4547
/// <returns></returns>
4648
public IHttpTestAsserter ResponseContentContains(string keyword, bool caseInsensitive = true)
4749
{
@@ -52,20 +54,27 @@ public IHttpTestAsserter ResponseContentContains(string keyword, bool caseInsens
5254

5355
var bodyString = _httpResponseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
5456

55-
_assertResults.Add(new AssertResult()
57+
var assertResult = new AssertResult()
5658
{
57-
Name = nameof(ResponseContentContains),
58-
Message = $"Body contains '{keyword}'.",
59-
IsTrue = caseInsensitive ? StringHelper.ContainsCaseInsensitive(bodyString, keyword) : bodyString.Contains(keyword)
60-
});
59+
Name = nameof(ResponseContentContains)
60+
};
61+
62+
assertResult.IsTrue = caseInsensitive
63+
? StringHelper.ContainsCaseInsensitive(bodyString, keyword)
64+
: bodyString.Contains(keyword);
65+
assertResult.Message = assertResult.IsTrue
66+
? $"Response body contains keyword '{keyword}'."
67+
: $"Response body does not contain keyword '{keyword}'.";
68+
69+
_assertResults.Add(assertResult);
6170

6271
return this;
6372
}
64-
73+
6574
/// <summary>
6675
/// Check if the response contains specified Content Type
6776
/// </summary>
68-
/// <param name="contentType"></param>
77+
/// <param name="contentType">Check if the response content type equals the parameter.</param>
6978
/// <returns></returns>
7079
/// <exception cref="ArgumentNullException"></exception>
7180
public IHttpTestAsserter ResponseContentTypeEquals(string contentType)
@@ -75,12 +84,12 @@ public IHttpTestAsserter ResponseContentTypeEquals(string contentType)
7584
throw new ArgumentNullException($"{nameof(contentType)} is null.");
7685
}
7786

78-
var bodyString = _httpResponseMessage.Content.Headers.ContentType;
79-
87+
var responseContentType = _httpResponseMessage.Content.Headers.ContentType.MediaType;
88+
8089
_assertResults.Add(new AssertResult()
8190
{
8291
Name = nameof(ResponseContentTypeEquals),
83-
Message = $"Response content-type equals '{contentType}'.",
92+
Message = $"Expected content-type = '{contentType}', actual = '{responseContentType}'.",
8493
IsTrue = _httpResponseMessage.Content.Headers.ContentType.MediaType == contentType
8594
});
8695

@@ -90,26 +99,52 @@ public IHttpTestAsserter ResponseContentTypeEquals(string contentType)
9099
/// <summary>
91100
/// Verify request duration
92101
/// </summary>
93-
/// <param name="duration"></param>
94-
/// <param name="predicateFunction"></param>
102+
/// <param name="duration">Actual duration of the HTTP request execution</param>
103+
/// <param name="predicateFunction">It's a function that validates the duration</param>
104+
/// <param name="predicateFunctionExpression">String predicateFunctionExpression for the report. If set it will be used in the assert result message.</param>
95105
/// <returns></returns>
96-
public IHttpTestAsserter RequestDurationEquals(long duration, Func<long, bool> predicateFunction)
106+
public IHttpTestAsserter RequestDurationEquals(long duration, Expression<Func<long, bool>> predicateFunction, string predicateFunctionExpression = null)
97107
{
98-
var isTrue = predicateFunction.Invoke(duration);
99-
_assertResults.Add(new AssertResult()
108+
var isTrue = predicateFunction.Compile()(duration);
109+
110+
var assertResult = new AssertResult()
100111
{
101112
Name = nameof(RequestDurationEquals),
102-
Message = $"Duration is '{duration}'.",
103113
IsTrue = isTrue
104-
});
114+
};
115+
116+
if (isTrue)
117+
{
118+
if (string.IsNullOrEmpty(predicateFunctionExpression))
119+
{
120+
assertResult.Message = $"Duration is '{duration}ms' and is valid.";
121+
}
122+
else
123+
{
124+
assertResult.Message = $"Duration is '{duration}ms' and is valid with predicateFunctionExpression '{predicateFunctionExpression}'.";
125+
}
126+
}
127+
else
128+
{
129+
if (string.IsNullOrEmpty(predicateFunctionExpression))
130+
{
131+
assertResult.Message = $"Duration is '{duration}ms' and is invalid.";
132+
}
133+
else
134+
{
135+
assertResult.Message = $"Duration is '{duration}ms' and is invalid with predicateFunctionExpression '{predicateFunctionExpression}'.";
136+
}
137+
}
138+
139+
_assertResults.Add(assertResult);
105140

106141
return this;
107142
}
108143

109144
/// <summary>
110145
/// HTTP response contains a header
111146
/// </summary>
112-
/// <param name="headerName"></param>
147+
/// <param name="headerName">Check if the HTTP response contains the header with the name.</param>
113148
/// <returns></returns>
114149
public IHttpTestAsserter ResponseHasHttpHeader(string headerName)
115150
{
@@ -118,27 +153,33 @@ public IHttpTestAsserter ResponseHasHttpHeader(string headerName)
118153
throw new ArgumentNullException($"{nameof(headerName)} is null.");
119154
}
120155

121-
_assertResults.Add(new AssertResult()
156+
var assertResult = new AssertResult
122157
{
123158
Name = nameof(ResponseHasHttpHeader),
124-
Message = $"Contains header '{headerName}'.",
125159
IsTrue = _httpResponseMessage.Headers.TryGetValues(headerName, out var values)
126-
});
160+
};
161+
162+
assertResult.Message = assertResult.IsTrue
163+
? $"Response message contains header '{headerName}'."
164+
: $"Response message does not contain header '{headerName}'.";
165+
166+
_assertResults.Add(assertResult);
127167

128168
return this;
129169
}
130170

131171
/// <summary>
132172
/// Verify if response code equals
133173
/// </summary>
134-
/// <param name="httpStatusCode"></param>
174+
/// <param name="httpStatusCode">Check if the HTTP response status code equals to this parameter.</param>
135175
/// <returns></returns>
136176
public IHttpTestAsserter ResponseStatusCodeEquals(HttpStatusCode httpStatusCode)
137177
{
138178
_assertResults.Add(new AssertResult()
139179
{
140180
Name = nameof(ResponseStatusCodeEquals),
141-
Message = $"Expected status code is '{httpStatusCode}' return code is '{_httpResponseMessage.StatusCode}'.",
181+
Message =
182+
$"Expected status code = '{httpStatusCode}', actual = '{_httpResponseMessage.StatusCode}'.",
142183
IsTrue = _httpResponseMessage.StatusCode == httpStatusCode
143184
});
144185

@@ -154,7 +195,7 @@ public IHttpTestAsserter ResponseStatusCodeIsSuccess()
154195
_assertResults.Add(new AssertResult()
155196
{
156197
Name = nameof(ResponseStatusCodeIsSuccess),
157-
Message = $"Expected status code is '2xx' return code is '{_httpResponseMessage.StatusCode}'.",
198+
Message = $"Expected status code = '2xx', actual = '{_httpResponseMessage.StatusCode}'.",
158199
IsTrue = _httpResponseMessage.IsSuccessStatusCode
159200
});
160201

@@ -172,11 +213,11 @@ public IHttpTestAsserter ResponseBodyIsEmpty()
172213
_assertResults.Add(new AssertResult()
173214
{
174215
Name = nameof(ResponseBodyIsEmpty),
175-
Message = $"Expected empty body, returned body is '{bodyString}'.",
216+
Message = $"Expected empty response body, actual = '{bodyString}'.",
176217
IsTrue = string.IsNullOrEmpty(bodyString)
177218
});
178219

179220
return this;
180221
}
181222
}
182-
}
223+
}

src/QAToolKit.Engine.HttpTester/Interfaces/IHttpTestAsserter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using QAToolKit.Engine.HttpTester.Models;
22
using System;
33
using System.Collections.Generic;
4+
using System.Linq.Expressions;
45
using System.Net;
56
using System.Net.Http.Headers;
67

@@ -18,13 +19,15 @@ public interface IHttpTestAsserter
1819
/// <param name="caseInsensitive"></param>
1920
/// <returns></returns>
2021
IHttpTestAsserter ResponseContentContains(string keyword, bool caseInsensitive = true);
22+
2123
/// <summary>
2224
/// Verify request duration
2325
/// </summary>
2426
/// <param name="duration"></param>
2527
/// <param name="predicateFunction"></param>
28+
/// <param name="predicateFunctionExpression"></param>
2629
/// <returns></returns>
27-
IHttpTestAsserter RequestDurationEquals(long duration, Func<long, bool> predicateFunction);
30+
IHttpTestAsserter RequestDurationEquals(long duration, Expression<Func<long, bool>> predicateFunction, string predicateFunctionExpression = null);
2831
/// <summary>
2932
/// Verify if response code equals
3033
/// </summary>

0 commit comments

Comments
 (0)