Skip to content

Commit 8bdc4bb

Browse files
committed
Merge pull request #236 from danhaller/fix-posts-with-substituted-urls
Remove mutation that was adding extra query params
2 parents cd58704 + 12b8c0f commit 8bdc4bb

File tree

9 files changed

+56
-17
lines changed

9 files changed

+56
-17
lines changed

src/SevenDigital.Api.Wrapper.Integration.Tests/EndpointTests/ApiSetupCredentialPassingTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public ApiWithCredentials()
2020

2121
public IFluentApi<T> Create<T>() where T : class, new()
2222
{
23-
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(_apiUrl, _credentials), new ResponseParser(new ApiResponseDetector()));
23+
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(new RouteParamsSubstitutor(_apiUrl), _credentials), new ResponseParser(new ApiResponseDetector()));
2424
}
2525
}
2626

src/SevenDigital.Api.Wrapper.Unit.Tests/Requests/RequestBuilderMethodTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void Setup()
2525
A.CallTo(() => _oAuthCredentials.ConsumerKey).Returns("testkey");
2626
A.CallTo(() => _oAuthCredentials.ConsumerSecret).Returns("testsecret");
2727

28-
_requestBuilder = new RequestBuilder(_apiUri, _oAuthCredentials);
28+
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(_apiUri), _oAuthCredentials);
2929
}
3030

3131
[TestCase]

src/SevenDigital.Api.Wrapper.Unit.Tests/Requests/RequestBuilderOAuthHeaderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public void SetUp()
1515
{
1616
var appSettingsCredentials = new StubbedConsumerCreds();
1717
var apiUri = new ApiUri();
18-
_requestBuilder = new RequestBuilder(apiUri, appSettingsCredentials);
18+
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(apiUri), appSettingsCredentials);
1919
}
2020

2121
[Test]

src/SevenDigital.Api.Wrapper.Unit.Tests/Requests/RequestBuilderTests.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class RequestBuilderTests
1818
public void Setup()
1919
{
2020
_requestBuilder = new RequestBuilder(
21-
EssentialDependencyCheck<IApiUri>.Instance,
21+
new RouteParamsSubstitutor(new ApiUri()),
2222
EssentialDependencyCheck<IOAuthCredentials>.Instance);
2323
}
2424

@@ -69,7 +69,7 @@ public void Should_use_api_uri_provided_by_IApiUri_interface()
6969

7070
var apiUri = A.Fake<IApiUri>();
7171
A.CallTo(() => apiUri.Uri).Returns(expectedApiUri);
72-
_requestBuilder = new RequestBuilder(apiUri, EssentialDependencyCheck<IOAuthCredentials>.Instance);
72+
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(apiUri), EssentialDependencyCheck<IOAuthCredentials>.Instance);
7373

7474
var requestData = new RequestData
7575
{
@@ -131,7 +131,36 @@ public void Post_data_with_requestBody_passes_post_body_to_main_request()
131131

132132
var request = _requestBuilder.BuildRequest(requestData);
133133
Assert.That(request.Body.Data, Is.EqualTo("I am a payload"));
134-
Assert.That(request.Body.ContentType, Is.EqualTo("text/plain"));
134+
Assert.That(request.Body.ContentType, Is.EqualTo("text/plain"));
135+
}
136+
137+
[Test]
138+
public void Post_data_with_requestBody_does_not_add_query_string_params()
139+
{
140+
var queryStringParameters = new Dictionary<string, string>();
141+
var requestData = new RequestData
142+
{
143+
HttpMethod = HttpMethod.Post,
144+
Payload = new RequestPayload("application/x-www-form-urlencoded", "foo=bar"),
145+
RequiresSignature = true
146+
};
147+
148+
var credentials = A.Fake<IOAuthCredentials>();
149+
A.CallTo(() => credentials.ConsumerKey).Returns("MyKey");
150+
A.CallTo(() => credentials.ConsumerSecret).Returns("MySecret");
151+
152+
var substitutor = A.Fake<IRouteParamsSubstitutor>();
153+
A.CallTo(() => substitutor.SubstituteParamsInRequest(requestData))
154+
.Returns(new ApiRequest
155+
{
156+
Parameters = queryStringParameters,
157+
AbsoluteUrl = "http://www.7digital.com"
158+
});
159+
160+
_requestBuilder = new RequestBuilder(substitutor, credentials);
161+
_requestBuilder.BuildRequest(requestData);
162+
163+
Assert.That(queryStringParameters.Count, Is.EqualTo(0), "Unexpected query string parameter");
135164
}
136165

137166
[Test]

src/SevenDigital.Api.Wrapper/Api.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public ApiFactory(IApiUri apiUri, IOAuthCredentials oauthCredentials)
2222

2323
public IFluentApi<T> Create<T>() where T : class, new()
2424
{
25-
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(_apiUri, _oauthCredentials), new ResponseParser(new ApiResponseDetector()));
25+
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(new RouteParamsSubstitutor(_apiUri), _oauthCredentials), new ResponseParser(new ApiResponseDetector()));
2626
}
2727
}
2828
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SevenDigital.Api.Wrapper.Requests
2+
{
3+
public interface IRouteParamsSubstitutor
4+
{
5+
ApiRequest SubstituteParamsInRequest(RequestData requestData);
6+
}
7+
}

src/SevenDigital.Api.Wrapper/Requests/RequestBuilder.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ public class RequestBuilder : IRequestBuilder
1212
private const string FormUrlEncoded = "application/x-www-form-urlencoded";
1313

1414
private readonly IOAuthCredentials _oAuthCredentials;
15-
private readonly RouteParamsSubstitutor _routeParamsSubstitutor;
15+
private readonly IRouteParamsSubstitutor _routeParamsSubstitutor;
1616

17-
public RequestBuilder(IApiUri apiUri, IOAuthCredentials oAuthCredentials)
17+
public RequestBuilder(IRouteParamsSubstitutor routeParamsSubstitutor, IOAuthCredentials oAuthCredentials)
1818
{
1919
_oAuthCredentials = oAuthCredentials;
20-
_routeParamsSubstitutor = new RouteParamsSubstitutor(apiUri);
20+
_routeParamsSubstitutor = routeParamsSubstitutor;
2121
}
2222

2323
public Request BuildRequest(RequestData requestData)
@@ -67,7 +67,7 @@ private string GetAuthorizationHeader(RequestData requestData, string fullUrl, A
6767
return "oauth_consumer_key=" + _oAuthCredentials.ConsumerKey;
6868
}
6969

70-
private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictionary<string, string> parameters, RequestPayload requestBody)
70+
private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictionary<string, string> queryStringParameters, RequestPayload requestBody)
7171
{
7272
var httpMethod = requestData.HttpMethod.ToString().ToUpperInvariant();
7373

@@ -87,24 +87,26 @@ private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictio
8787
oauthRequest.TokenSecret = requestData.OAuthTokenSecret;
8888
}
8989

90-
if (ShouldReadParamsFromBody(parameters, requestBody))
90+
var headerParameters = queryStringParameters.ToDictionary(x => x.Key, x => x.Value);
91+
92+
if (ShouldReadParamsFromBody(queryStringParameters, requestBody))
9193
{
9294
var bodyParams = HttpUtility.ParseQueryString(requestBody.Data);
9395
var keys = bodyParams.AllKeys.Where(x => !string.IsNullOrEmpty(x));
9496
foreach (var key in keys)
9597
{
96-
parameters.Add(key, bodyParams[key]);
98+
headerParameters.Add(key, bodyParams[key]);
9799
}
98100
}
99101

100-
return oauthRequest.GetAuthorizationHeader(parameters);
102+
return oauthRequest.GetAuthorizationHeader(headerParameters);
101103
}
102104

103-
private static bool ShouldReadParamsFromBody(IDictionary<string, string> parameters, RequestPayload requestBody)
105+
private static bool ShouldReadParamsFromBody(IDictionary<string, string> queryStringParameters, RequestPayload requestBody)
104106
{
105107
return (requestBody.ContentType == FormUrlEncoded) &&
106108
!string.IsNullOrEmpty(requestBody.Data) &&
107-
(parameters.Count == 0);
109+
(queryStringParameters.Count == 0);
108110
}
109111
}
110112
}

src/SevenDigital.Api.Wrapper/Requests/RouteParamsSubstitutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace SevenDigital.Api.Wrapper.Requests
77
{
8-
public class RouteParamsSubstitutor
8+
public class RouteParamsSubstitutor : IRouteParamsSubstitutor
99
{
1010
private readonly IBaseUriProvider _defaultBaseUriProvider;
1111

src/SevenDigital.Api.Wrapper/SevenDigital.Api.Wrapper.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
<Compile Include="Requests\BaseUriFromString.cs" />
7171
<Compile Include="Requests\IBaseUriProvider.cs" />
7272
<Compile Include="Requests\IRequestBuilder.cs" />
73+
<Compile Include="Requests\IRouteParamsSubstitutor.cs" />
7374
<Compile Include="Requests\RequestBuilder.cs" />
7475
<Compile Include="Requests\RequestPayload.cs" />
7576
<Compile Include="Requests\RouteParamsSubstitutor.cs" />

0 commit comments

Comments
 (0)