Skip to content

Commit 81a4649

Browse files
authored
Merge pull request #57 from The-Standard-Organization/users/aosunlana/foundations-httpclient-postasync
FOUNDATIONS: POST Async with CancellationToken `IHttpExchangeService`
2 parents 73843c7 + 8b395b9 commit 81a4649

File tree

10 files changed

+451
-75
lines changed

10 files changed

+451
-75
lines changed

STX.REST.RESTFulSense.Clients.Tests.Unit/Services/Foundations/HttpExchanges/HttpExchangeServiceTests.Headers.HttpExchange.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,8 +508,18 @@ private static Filler<HttpExchangeResponseHeaders> CreateHttpExchangeResponseHea
508508
}
509509

510510
private static HttpExchangeContentHeaders CreateHttpExchangeContentHeaders(
511-
dynamic randomHeaderProperties) =>
512-
CreateHttpExchangeContentHeadersFiller(randomHeaderProperties).Create();
511+
dynamic randomHeaderProperties)
512+
{
513+
HttpExchangeContentHeaders httpExchangeContentHeaders = null;
514+
515+
if (randomHeaderProperties is not null)
516+
{
517+
httpExchangeContentHeaders =
518+
CreateHttpExchangeContentHeadersFiller(randomHeaderProperties).Create();
519+
}
520+
521+
return httpExchangeContentHeaders;
522+
}
513523

514524
private static Filler<HttpExchangeContentHeaders> CreateHttpExchangeContentHeadersFiller(
515525
dynamic randomHeaderProperties)

STX.REST.RESTFulSense.Clients.Tests.Unit/Services/Foundations/HttpExchanges/HttpExchangeServiceTests.Logic.Get.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ private async Task ShouldSendHttpRequestWhenGetAsyncIsCalledAsync(
2727
CreateRandomHttpProperties(
2828
sendUrlParameters,
2929
sendRequestHeaders,
30-
sendRequestContent: false);
30+
sendRequestContent: false,
31+
sendContentHeaders: false,
32+
httpMethod: HttpMethod.Get);
3133

3234
HttpExchange inputHttpExchange =
3335
CreateRandomHttpExchangeRequest(
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// ----------------------------------------------------------------------------------
2+
// Copyright (c) The Standard Organization: A coalition of the Good-Hearted Engineers
3+
// ----------------------------------------------------------------------------------
4+
5+
using System.Net.Http;
6+
using System.Threading.Tasks;
7+
using FluentAssertions;
8+
using Moq;
9+
using STX.REST.RESTFulSense.Clients.Models.Services.HttpExchanges;
10+
using Xunit;
11+
12+
namespace STX.REST.RESTFulSense.Clients.Tests.Unit.Services.Foundations.HttpExchanges
13+
{
14+
public partial class HttpExchangeServiceTests
15+
{
16+
[Theory]
17+
[InlineData(false, false, false, false)]
18+
[InlineData(false, false, true, false)]
19+
[InlineData(false, false, true, true)]
20+
[InlineData(false, true, false, false)]
21+
[InlineData(false, true, true, false)]
22+
[InlineData(false, true, true, true)]
23+
[InlineData(true, false, false, false)]
24+
[InlineData(true, false, true, false)]
25+
[InlineData(true, false, true, true)]
26+
[InlineData(true, true, false, false)]
27+
[InlineData(true, true, true, false)]
28+
[InlineData(true, true, true, true)]
29+
private async Task ShouldSendHttpRequestWhenPostAsyncIsCalledAsync(
30+
bool sendUrlParameters,
31+
bool sendRequestHeaders,
32+
bool sendRequestContent,
33+
bool sendRequestContentHeaders)
34+
{
35+
// given
36+
dynamic randomProperties =
37+
CreateRandomHttpProperties(
38+
sendUrlParameters,
39+
sendRequestHeaders,
40+
sendRequestContent,
41+
sendRequestContentHeaders,
42+
httpMethod: HttpMethod.Post);
43+
44+
HttpExchange inputHttpExchange =
45+
CreateRandomHttpExchangeRequest(
46+
randomProperties);
47+
48+
HttpRequestMessage inputHttpRequestMessage =
49+
CreateHttpRequestMessage(randomProperties);
50+
51+
HttpRequestMessage expectedHttpRequestMessage =
52+
inputHttpRequestMessage;
53+
54+
HttpExchange expectedHttpExchange =
55+
CreateHttpExchangeResponse(
56+
httpExchange: inputHttpExchange,
57+
randomProperties: randomProperties);
58+
59+
HttpResponseMessage randomHttpResponseMessage =
60+
CreateHttpResponseMessage(randomProperties);
61+
62+
HttpResponseMessage returnedHttpResponseMessage =
63+
randomHttpResponseMessage;
64+
65+
this.httpBroker
66+
.Setup(broker =>
67+
broker.SendRequestAsync(
68+
It.IsAny<HttpRequestMessage>(),
69+
default))
70+
.ReturnsAsync(returnedHttpResponseMessage);
71+
72+
// when
73+
HttpExchange actualHttpExchange =
74+
await this.httpExchangeService.PostAsync(
75+
inputHttpExchange);
76+
77+
// then
78+
actualHttpExchange.Should().BeEquivalentTo(
79+
expectedHttpExchange,
80+
options =>
81+
options.Excluding(httpExchange =>
82+
httpExchange.Response.Content.StreamContent));
83+
84+
byte[] actualStreamContent =
85+
await ConvertStreamToByteArray(
86+
actualHttpExchange.Response.Content.StreamContent);
87+
88+
byte[] expectedStreamContent =
89+
await ConvertStreamToByteArray(
90+
expectedHttpExchange.Response.Content.StreamContent);
91+
92+
actualStreamContent.Should().BeEquivalentTo(
93+
expectedStreamContent);
94+
95+
this.httpBroker.Verify(
96+
broker =>
97+
broker.SendRequestAsync(
98+
It.Is<HttpRequestMessage>(actualHttpRequestMessage =>
99+
SameHttpRequestMessageAs(
100+
actualHttpRequestMessage,
101+
expectedHttpRequestMessage)
102+
.Compile()
103+
.Invoke(actualHttpRequestMessage)),
104+
default),
105+
Times.Once);
106+
107+
this.httpBroker.VerifyNoOtherCalls();
108+
}
109+
}
110+
}

STX.REST.RESTFulSense.Clients.Tests.Unit/Services/Foundations/HttpExchanges/HttpExchangeServiceTests.Validations.Get.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private async Task ShouldThrowHttpExchangeValidationExceptionOnGetIfHttpExchange
8989
int invalidHttpVersionPolicy)
9090
{
9191
// given
92-
var httpExchange = new HttpExchange()
92+
var httpExchange = new HttpExchange
9393
{
9494
Request = new HttpExchangeRequest
9595
{
@@ -101,7 +101,7 @@ private async Task ShouldThrowHttpExchangeValidationExceptionOnGetIfHttpExchange
101101
}
102102
};
103103

104-
var invalidHttpExchangeRequestException =
104+
var invalidHttpExchangeRequestException =
105105
new InvalidHttpExchangeRequestException(
106106
message: "Invalid request, fix errors and try again.");
107107

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// ----------------------------------------------------------------------------------
2+
// Copyright (c) The Standard Organization: A coalition of the Good-Hearted Engineers
3+
// ----------------------------------------------------------------------------------
4+
5+
using System.Threading.Tasks;
6+
using FluentAssertions;
7+
using STX.REST.RESTFulSense.Clients.Models.Services.HttpExchanges;
8+
using STX.REST.RESTFulSense.Clients.Models.Services.HttpExchanges.Exceptions;
9+
using Xunit;
10+
11+
namespace STX.REST.RESTFulSense.Clients.Tests.Unit.Services.Foundations.HttpExchanges
12+
{
13+
public partial class HttpExchangeServiceTests
14+
{
15+
[Fact]
16+
private async Task ShouldThrowHttpExchangeValidationExceptionOnPostIfHttpExchangeIsInvalidAsync()
17+
{
18+
// given
19+
HttpExchange nullHttpExchange = null;
20+
21+
var invalidHttpExchangeException =
22+
new InvalidHttpExchangeException(
23+
message: "Invalid HttpExchange error occurred, fix errors and try again.");
24+
25+
invalidHttpExchangeException.UpsertDataList(
26+
key: nameof(HttpExchange),
27+
value: "Value is required");
28+
29+
var expectedHttpExchangeValidationException =
30+
new HttpExchangeValidationException(
31+
message: "HttpExchange validation errors occurred, fix errors and try again.",
32+
innerException: invalidHttpExchangeException);
33+
34+
// when
35+
ValueTask<HttpExchange> getAsyncTask = httpExchangeService.GetAsync(nullHttpExchange);
36+
37+
HttpExchangeValidationException actualHttpExchangeValidationException =
38+
await Assert.ThrowsAsync<HttpExchangeValidationException>(
39+
getAsyncTask.AsTask);
40+
41+
// then
42+
actualHttpExchangeValidationException.Should().BeEquivalentTo(
43+
expectedHttpExchangeValidationException);
44+
45+
this.httpBroker.VerifyNoOtherCalls();
46+
}
47+
48+
[Fact]
49+
public async Task ShouldThrowHttpExchangeValidationExceptionOnPostIfHttpExchangeRequestIsNullAsync()
50+
{
51+
// given
52+
var httpExchange = new HttpExchange();
53+
54+
var nullHttpExchangeRequestException =
55+
new NullHttpExchangeRequestException(
56+
message: "Null HttpExchangeRequest error occurred, fix errors and try again.");
57+
58+
var expectedHttpExchangeValidationException =
59+
new HttpExchangeValidationException(
60+
message: "HttpExchange validation errors occurred, fix errors and try again.",
61+
innerException: nullHttpExchangeRequestException);
62+
63+
// when
64+
ValueTask<HttpExchange> postAsyncTask = this.httpExchangeService.PostAsync(httpExchange);
65+
66+
HttpExchangeValidationException actualHttpExchangeValidationException =
67+
await Assert.ThrowsAsync<HttpExchangeValidationException>(postAsyncTask.AsTask);
68+
69+
// then
70+
actualHttpExchangeValidationException.Should().BeEquivalentTo(
71+
expectedHttpExchangeValidationException);
72+
73+
this.httpBroker.VerifyNoOtherCalls();
74+
}
75+
76+
[Theory]
77+
[InlineData(null, null, "GET", "0.1", InvalidVersionPolicy)]
78+
[InlineData("", "", "GET", "0.1", InvalidVersionPolicy)]
79+
[InlineData(" ", " ", "GET", "0.1", InvalidVersionPolicy)]
80+
private async Task ShouldThrowHttpExchangeValidationExceptionOnPostIfHttpExchangeRequestIsInvalidAsync(
81+
string invalidBaseAddress,
82+
string invalidRelativeUrl,
83+
string invalidHttpMethod,
84+
string invalidHttpVersion,
85+
int invalidHttpVersionPolicy)
86+
{
87+
// given
88+
var httpExchange = new HttpExchange
89+
{
90+
Request = new HttpExchangeRequest
91+
{
92+
BaseAddress = invalidBaseAddress,
93+
RelativeUrl = invalidRelativeUrl,
94+
HttpMethod = invalidHttpMethod,
95+
Version = invalidHttpVersion,
96+
VersionPolicy = invalidHttpVersionPolicy
97+
}
98+
};
99+
100+
var invalidHttpExchangeRequestException =
101+
new InvalidHttpExchangeRequestException(
102+
message: "Invalid request, fix errors and try again.");
103+
104+
invalidHttpExchangeRequestException.UpsertDataList(
105+
key: nameof(HttpExchangeRequest.BaseAddress),
106+
value: "Value is required");
107+
108+
invalidHttpExchangeRequestException.UpsertDataList(
109+
key: nameof(HttpExchangeRequest.RelativeUrl),
110+
value: "Value is required");
111+
112+
invalidHttpExchangeRequestException.UpsertDataList(
113+
key: nameof(HttpExchangeRequest.HttpMethod),
114+
value: "HttpMethod is invalid");
115+
116+
invalidHttpExchangeRequestException.UpsertDataList(
117+
key: nameof(HttpExchangeRequest.Version),
118+
value: "HttpVersion is invalid");
119+
120+
invalidHttpExchangeRequestException.UpsertDataList(
121+
key: nameof(HttpExchangeRequest.VersionPolicy),
122+
value: "HttpVersionPolicy is invalid");
123+
124+
var expectedHttpExchangeValidationException =
125+
new HttpExchangeValidationException(
126+
message: "HttpExchange validation errors occurred, fix errors and try again.",
127+
innerException: invalidHttpExchangeRequestException);
128+
129+
// when
130+
ValueTask<HttpExchange> postAsyncTask = httpExchangeService.PostAsync(httpExchange);
131+
132+
HttpExchangeValidationException actualHttpExchangeValidationException =
133+
await Assert.ThrowsAsync<HttpExchangeValidationException>(postAsyncTask.AsTask);
134+
135+
// then
136+
actualHttpExchangeValidationException.Should().BeEquivalentTo(
137+
expectedHttpExchangeValidationException);
138+
139+
this.httpBroker.VerifyNoOtherCalls();
140+
}
141+
}
142+
}

STX.REST.RESTFulSense.Clients.Tests.Unit/Services/Foundations/HttpExchanges/HttpExchangeServiceTests.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private static IDictionary<string, object> CreateRandomUrlParameters()
162162
Key = GetRandomString(),
163163
Value = value
164164
})
165-
.DistinctBy(x=>x.Key)
165+
.DistinctBy(x => x.Key)
166166
.ToDictionary(
167167
key => key.Key,
168168
value => value.Value);
@@ -243,19 +243,26 @@ private static HttpStatusCode GetRandomHttpStatusCode()
243243
private static long CreateRandomLongToValue(long from) =>
244244
new LongRange(min: from, max: 10).GetValue();
245245

246-
private static dynamic CreateRandomHttpContent()
246+
private static dynamic CreateRandomHttpContent(bool createContentHeaders)
247247
{
248+
dynamic contentHeaders = null;
249+
250+
if (createContentHeaders)
251+
contentHeaders = CreateRandomHttpContentHeader();
252+
248253
return new
249254
{
250-
Headers = CreateRandomHttpContentHeader(),
255+
Headers = contentHeaders,
251256
StreamContent = CreateRandomStream()
252257
};
253258
}
254259

255260
private static dynamic CreateRandomHttpProperties(
256261
bool sendUrlParameters,
257262
bool sendRequestHeaders,
258-
bool sendRequestContent)
263+
bool sendRequestContent,
264+
bool sendContentHeaders,
265+
HttpMethod httpMethod)
259266
{
260267
Uri randomUri = CreateRandomUri();
261268

@@ -272,7 +279,7 @@ private static dynamic CreateRandomHttpProperties(
272279

273280
dynamic requestContent = default;
274281
if (sendRequestContent)
275-
requestContent = CreateRandomHttpContent();
282+
requestContent = CreateRandomHttpContent(sendContentHeaders);
276283

277284
return new
278285
{
@@ -282,7 +289,7 @@ private static dynamic CreateRandomHttpProperties(
282289
RelativeUrl = randomUri.PathAndQuery,
283290
Url = randomUri,
284291
UrlParameters = randomUrlParameters,
285-
HttpMethod = HttpMethod.Get,
292+
HttpMethod = httpMethod,
286293
Version = GetRandomHttpVersion(),
287294
VersionPolicy = GetRandomHttpVersionPolicy(),
288295
StatusCode = randomStatusCode,
@@ -295,7 +302,7 @@ private static dynamic CreateRandomHttpProperties(
295302
RequestHeaders = requestHeaders,
296303
ResponseHeaders = CreateRandomHttpResponseHeader(),
297304
RequestContent = requestContent,
298-
ResponseContent = CreateRandomHttpContent()
305+
ResponseContent = CreateRandomHttpContent(true)
299306
};
300307
}
301308

@@ -308,7 +315,7 @@ private static HttpExchange CreateRandomHttpExchangeRequest(
308315
{
309316
BaseAddress = randomProperties.BaseAddress,
310317
RelativeUrl = randomProperties.RelativeUrl,
311-
HttpMethod = HttpMethod.Get.Method,
318+
HttpMethod = randomProperties.HttpMethod.Method,
312319
Version = randomProperties.Version.ToString(),
313320
UrlParameters = randomProperties.UrlParameters,
314321

STX.REST.RESTFulSense.Clients/Models/Services/HttpExchanges/Exceptions/HttpExchangeServiceException.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Copyright (c) The Standard Organization: A coalition of the Good-Hearted Engineers
33
// ----------------------------------------------------------------------------------
44

5-
using System;
65
using Xeptions;
76

87
namespace STX.REST.RESTFulSense.Clients.Models.Services.HttpExchanges.Exceptions

0 commit comments

Comments
 (0)