Skip to content

Commit d47661f

Browse files
author
Bart Koelman
committed
Refactored IntegrationTest to enable callers to pass custom request headers
1 parent d033166 commit d47661f

File tree

2 files changed

+47
-58
lines changed

2 files changed

+47
-58
lines changed

test/JsonApiDotNetCoreExampleTests/IntegrationTests/ContentNegotiation/AcceptHeaderTests.cs

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Net;
23
using System.Net.Http;
34
using System.Net.Http.Headers;
@@ -30,10 +31,8 @@ public async Task Permits_no_Accept_headers()
3031
// Arrange
3132
const string route = "/policies";
3233

33-
var acceptHeaders = new MediaTypeWithQualityHeaderValue[0];
34-
3534
// Act
36-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, acceptHeaders);
35+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route);
3736

3837
// Assert
3938
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -65,10 +64,8 @@ public async Task Permits_no_Accept_headers_at_operations_endpoint()
6564
const string route = "/operations";
6665
const string contentType = HeaderConstants.AtomicOperationsMediaType;
6766

68-
var acceptHeaders = new MediaTypeWithQualityHeaderValue[0];
69-
7067
// Act
71-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType, acceptHeaders);
68+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType);
7269

7370
// Assert
7471
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -80,14 +77,14 @@ public async Task Permits_global_wildcard_in_Accept_headers()
8077
// Arrange
8178
const string route = "/policies";
8279

83-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
80+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
8481
{
85-
MediaTypeWithQualityHeaderValue.Parse("text/html"),
86-
MediaTypeWithQualityHeaderValue.Parse("*/*")
82+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/html"));
83+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("*/*"));
8784
};
8885

8986
// Act
90-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, acceptHeaders);
87+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, setRequestHeaders);
9188

9289
// Assert
9390
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -99,14 +96,14 @@ public async Task Permits_application_wildcard_in_Accept_headers()
9996
// Arrange
10097
const string route = "/policies";
10198

102-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
99+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
103100
{
104-
MediaTypeWithQualityHeaderValue.Parse("text/html;q=0.8"),
105-
MediaTypeWithQualityHeaderValue.Parse("application/*;q=0.2")
101+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/html;q=0.8"));
102+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/*;q=0.2"));
106103
};
107104

108105
// Act
109-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, acceptHeaders);
106+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, setRequestHeaders);
110107

111108
// Assert
112109
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -118,17 +115,17 @@ public async Task Permits_JsonApi_without_parameters_in_Accept_headers()
118115
// Arrange
119116
const string route = "/policies";
120117

121-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
118+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
122119
{
123-
MediaTypeWithQualityHeaderValue.Parse("text/html"),
124-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"),
125-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; ext=other"),
126-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"),
127-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; q=0.3")
120+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/html"));
121+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"));
122+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; ext=other"));
123+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"));
124+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; q=0.3"));
128125
};
129126

130127
// Act
131-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, acceptHeaders);
128+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecuteGetAsync<Document>(route, setRequestHeaders);
132129

133130
// Assert
134131
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -160,17 +157,17 @@ public async Task Permits_JsonApi_with_AtomicOperations_extension_in_Accept_head
160157
const string route = "/operations";
161158
const string contentType = HeaderConstants.AtomicOperationsMediaType;
162159

163-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
160+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
164161
{
165-
MediaTypeWithQualityHeaderValue.Parse("text/html"),
166-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"),
167-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType),
168-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"),
169-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + ";ext=\"https://jsonapi.org/ext/atomic\"; q=0.2")
162+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/html"));
163+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"));
164+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType));
165+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"));
166+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + ";ext=\"https://jsonapi.org/ext/atomic\"; q=0.2"));
170167
};
171168

172169
// Act
173-
(HttpResponseMessage httpResponse, _) = await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType, acceptHeaders);
170+
(HttpResponseMessage httpResponse, _) = await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType, setRequestHeaders);
174171

175172
// Assert
176173
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
@@ -182,17 +179,17 @@ public async Task Denies_JsonApi_with_parameters_in_Accept_headers()
182179
// Arrange
183180
const string route = "/policies";
184181

185-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
182+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
186183
{
187-
MediaTypeWithQualityHeaderValue.Parse("text/html"),
188-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"),
189-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; ext=other"),
190-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"),
191-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.AtomicOperationsMediaType)
184+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/html"));
185+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; profile=some"));
186+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; ext=other"));
187+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType + "; unknown=unexpected"));
188+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.AtomicOperationsMediaType));
192189
};
193190

194191
// Act
195-
(HttpResponseMessage httpResponse, ErrorDocument responseDocument) = await _testContext.ExecuteGetAsync<ErrorDocument>(route, acceptHeaders);
192+
(HttpResponseMessage httpResponse, ErrorDocument responseDocument) = await _testContext.ExecuteGetAsync<ErrorDocument>(route, setRequestHeaders);
196193

197194
// Assert
198195
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotAcceptable);
@@ -231,14 +228,14 @@ public async Task Denies_JsonApi_in_Accept_headers_at_operations_endpoint()
231228
const string route = "/operations";
232229
const string contentType = HeaderConstants.AtomicOperationsMediaType;
233230

234-
MediaTypeWithQualityHeaderValue[] acceptHeaders =
231+
Action<HttpRequestHeaders> setRequestHeaders = headers =>
235232
{
236-
MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType)
233+
headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(HeaderConstants.MediaType));
237234
};
238235

239236
// Act
240237
(HttpResponseMessage httpResponse, ErrorDocument responseDocument) =
241-
await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType, acceptHeaders);
238+
await _testContext.ExecutePostAsync<ErrorDocument>(route, requestBody, contentType, setRequestHeaders);
242239

243240
// Assert
244241
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotAcceptable);

test/TestBuildingBlocks/IntegrationTest.cs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Net.Http;
43
using System.Net.Http.Headers;
54
using System.Threading.Tasks;
@@ -16,38 +15,37 @@ public abstract class IntegrationTest
1615
private static readonly IntegrationTestConfiguration IntegrationTestConfiguration = new IntegrationTestConfiguration();
1716

1817
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteGetAsync<TResponseDocument>(string requestUrl,
19-
IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders = null)
18+
Action<HttpRequestHeaders> setRequestHeaders = null)
2019
{
21-
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Get, requestUrl, null, null, acceptHeaders);
20+
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Get, requestUrl, null, null, setRequestHeaders);
2221
}
2322

2423
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAsync<TResponseDocument>(string requestUrl,
25-
object requestBody, string contentType = HeaderConstants.MediaType, IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders = null)
24+
object requestBody, string contentType = HeaderConstants.MediaType, Action<HttpRequestHeaders> setRequestHeaders = null)
2625
{
27-
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Post, requestUrl, requestBody, contentType, acceptHeaders);
26+
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
2827
}
2928

3029
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAtomicAsync<TResponseDocument>(string requestUrl,
31-
object requestBody, string contentType = HeaderConstants.AtomicOperationsMediaType,
32-
IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders = null)
30+
object requestBody, string contentType = HeaderConstants.AtomicOperationsMediaType, Action<HttpRequestHeaders> setRequestHeaders = null)
3331
{
34-
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Post, requestUrl, requestBody, contentType, acceptHeaders);
32+
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
3533
}
3634

3735
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePatchAsync<TResponseDocument>(string requestUrl,
38-
object requestBody, string contentType = HeaderConstants.MediaType, IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders = null)
36+
object requestBody, string contentType = HeaderConstants.MediaType, Action<HttpRequestHeaders> setRequestHeaders = null)
3937
{
40-
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Patch, requestUrl, requestBody, contentType, acceptHeaders);
38+
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Patch, requestUrl, requestBody, contentType, setRequestHeaders);
4139
}
4240

4341
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteDeleteAsync<TResponseDocument>(string requestUrl,
44-
object requestBody = null, string contentType = HeaderConstants.MediaType, IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders = null)
42+
object requestBody = null, string contentType = HeaderConstants.MediaType, Action<HttpRequestHeaders> setRequestHeaders = null)
4543
{
46-
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Delete, requestUrl, requestBody, contentType, acceptHeaders);
44+
return await ExecuteRequestAsync<TResponseDocument>(HttpMethod.Delete, requestUrl, requestBody, contentType, setRequestHeaders);
4745
}
4846

4947
private async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteRequestAsync<TResponseDocument>(HttpMethod method,
50-
string requestUrl, object requestBody, string contentType, IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaders)
48+
string requestUrl, object requestBody, string contentType, Action<HttpRequestHeaders> setRequestHeaders)
5149
{
5250
using var request = new HttpRequestMessage(method, requestUrl);
5351
string requestText = SerializeRequest(requestBody);
@@ -63,13 +61,7 @@ public abstract class IntegrationTest
6361
}
6462
}
6563

66-
if (acceptHeaders != null)
67-
{
68-
foreach (MediaTypeWithQualityHeaderValue acceptHeader in acceptHeaders)
69-
{
70-
request.Headers.Accept.Add(acceptHeader);
71-
}
72-
}
64+
setRequestHeaders?.Invoke(request.Headers);
7365

7466
using HttpClient client = CreateClient();
7567
HttpResponseMessage responseMessage = await client.SendAsync(request);

0 commit comments

Comments
 (0)