33using QAToolKit . Engine . HttpTester . Models ;
44using System ;
55using System . Collections . Generic ;
6+ using System . Linq . Expressions ;
67using System . Net ;
78using System . Net . Http ;
89using 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+ }
0 commit comments