Skip to content

Commit b60302b

Browse files
feat: add auto refresh token support (#71)
1 parent 54b06c1 commit b60302b

File tree

8 files changed

+59
-41
lines changed

8 files changed

+59
-41
lines changed

APIMatic.Core.Test/AuthenticationTest.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Net.Http;
4+
using System.Threading.Tasks;
45
using APIMatic.Core.Authentication;
56
using APIMatic.Core.Test.MockTypes.Authentication;
67
using APIMatic.Core.Types.Sdk.Exceptions;
@@ -12,7 +13,7 @@ namespace APIMatic.Core.Test
1213
public class AuthenticationTest : TestBase
1314
{
1415
[Test]
15-
public void Multiple_Authentication_Success_WithFirstAuth()
16+
public async Task Multiple_Authentication_Success_WithFirstAuth()
1617
{
1718
var globalConfiguration = new GlobalConfiguration.Builder()
1819
.ServerUrls(new Dictionary<Enum, string>
@@ -28,7 +29,7 @@ public void Multiple_Authentication_Success_WithFirstAuth()
2829
.HttpConfiguration(_clientConfiguration)
2930
.Build();
3031

31-
var request = globalConfiguration.GlobalRequestBuilder()
32+
var request = await globalConfiguration.GlobalRequestBuilder()
3233
.Setup(HttpMethod.Get, "/auth")
3334
.WithOrAuth(auth => auth
3435
.AddAndGroup(innerGroup => innerGroup
@@ -45,7 +46,7 @@ public void Multiple_Authentication_Success_WithFirstAuth()
4546
}
4647

4748
[Test]
48-
public void Multiple_Authentication_Success_WithSecondAuth()
49+
public async Task Multiple_Authentication_Success_WithSecondAuth()
4950
{
5051
var basicAuthManager = new BasicAuthManager("username", "password");
5152
var globalConfiguration = new GlobalConfiguration.Builder()
@@ -62,7 +63,7 @@ public void Multiple_Authentication_Success_WithSecondAuth()
6263
.HttpConfiguration(_clientConfiguration)
6364
.Build();
6465

65-
var request = globalConfiguration.GlobalRequestBuilder()
66+
var request = await globalConfiguration.GlobalRequestBuilder()
6667
.Setup(HttpMethod.Get, "/auth")
6768
.WithOrAuth(auth => auth
6869
.AddAndGroup(innerGroup => innerGroup
@@ -95,7 +96,7 @@ public void Multiple_Authentication_OR_Validation_Failure()
9596
.HttpConfiguration(_clientConfiguration)
9697
.Build();
9798

98-
var exp = Assert.Throws<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
99+
var exp = Assert.ThrowsAsync<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
99100
.Setup(HttpMethod.Get, "/auth")
100101
.WithOrAuth(auth => auth
101102
.Add("basic")
@@ -110,7 +111,7 @@ public void Multiple_Authentication_OR_Validation_Failure()
110111
}
111112

112113
[Test]
113-
public void Multiple_Authentication_AND_Validation_Failure()
114+
public async Task Multiple_Authentication_AND_Validation_Failure()
114115
{
115116
var globalConfiguration = new GlobalConfiguration.Builder()
116117
.ServerUrls(new Dictionary<Enum, string>
@@ -126,15 +127,24 @@ public void Multiple_Authentication_AND_Validation_Failure()
126127
.HttpConfiguration(_clientConfiguration)
127128
.Build();
128129

129-
var exp = Assert.Throws<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
130+
131+
var exp = Assert.ThrowsAsync<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
130132
.Setup(HttpMethod.Get, "/auth")
131-
.WithAndAuth(auth => auth
132-
.Add("query")
133+
.WithAndAuth(auth => auth.Add("query")
133134
.Add("header"))
134135
.Build());
135136

136137
Assert.AreEqual("Following authentication credentials are required:\n" +
137138
"-> Missing required header field: TOKEN", exp.Message);
139+
140+
async void AuthCode()
141+
{
142+
await globalConfiguration.GlobalRequestBuilder()
143+
.Setup(HttpMethod.Get, "/auth")
144+
.WithAndAuth(auth => auth.Add("query")
145+
.Add("header"))
146+
.Build();
147+
}
138148
}
139149

140150
[Test]
@@ -153,7 +163,7 @@ public void Multiple_Authentication_AND_All_Missing_Validation_Failure()
153163
.HttpConfiguration(_clientConfiguration)
154164
.Build();
155165

156-
var exp = Assert.Throws<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
166+
var exp = Assert.ThrowsAsync<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
157167
.Setup(HttpMethod.Get, "/auth")
158168
.WithAndAuth(auth => auth
159169
.Add("query")
@@ -184,7 +194,7 @@ public void Multiple_Authentication_AND_with_nested_OR_Validation_Failure()
184194
.HttpConfiguration(_clientConfiguration)
185195
.Build();
186196

187-
var exp = Assert.Throws<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
197+
var exp = Assert.ThrowsAsync<AuthValidationException>(() => globalConfiguration.GlobalRequestBuilder()
188198
.Setup(HttpMethod.Get, "/auth")
189199
.WithAndAuth(auth => auth
190200
.Add("query")

APIMatic.Core.Test/GlobalConfigurationTest.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Threading.Tasks;
34
using APIMatic.Core.Http.Configuration;
45
using NUnit.Framework;
56

@@ -19,19 +20,19 @@ public void TestServerUrl()
1920
}
2021

2122
[Test]
22-
public void TestGlobalRequestQueryUrl()
23+
public async Task TestGlobalRequestQueryUrl()
2324
{
24-
var request = LazyGlobalConfiguration.Value.GlobalRequestBuilder().Build();
25+
var request = await LazyGlobalConfiguration.Value.GlobalRequestBuilder().Build();
2526
Assert.AreEqual("http://my/path:3000/v1", request.QueryUrl);
2627

27-
var request2 = LazyGlobalConfiguration.Value.GlobalRequestBuilder(MockServer.Server2).Build();
28+
var request2 = await LazyGlobalConfiguration.Value.GlobalRequestBuilder(MockServer.Server2).Build();
2829
Assert.AreEqual("https://my/path/v2", request2.QueryUrl);
2930
}
3031

3132
[Test]
32-
public void TestGlobalRequestHeaders()
33+
public async Task TestGlobalRequestHeaders()
3334
{
34-
var request = LazyGlobalConfiguration.Value.GlobalRequestBuilder().Build();
35+
var request = await LazyGlobalConfiguration.Value.GlobalRequestBuilder().Build();
3536
Assert.True(request.Headers.Count == 5);
3637
Assert.AreEqual("headVal1", request.Headers["additionalHead1"]);
3738
Assert.AreEqual("headVal2", request.Headers["additionalHead2"]);
@@ -41,10 +42,10 @@ public void TestGlobalRequestHeaders()
4142
}
4243

4344
[Test]
44-
public void TestGlobalRequest_NullUserAgent()
45+
public async Task TestGlobalRequest_NullUserAgent()
4546
{
4647
var httpClientConfiguration = new CoreHttpClientConfiguration.Builder().Build();
47-
var request = new GlobalConfiguration.Builder()
48+
var request = await new GlobalConfiguration.Builder()
4849
.HttpConfiguration(httpClientConfiguration)
4950
.UserAgent(null)
5051
.ServerUrls(new Dictionary<Enum, string>

APIMatic.Core.Test/Http/HttpClientWrapperSSLTest.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
using System.Net;
44
using System.Net.Http;
55
using System.Threading.Tasks;
6-
using APIMatic.Core.Http.Configuration;
6+
using APIMatic.Core.Http.Configuration;
77
using NUnit.Framework;
88

99
namespace APIMatic.Core.Test.Http
1010
{
1111
[TestFixture]
1212
public class HttpClientWrapperSSLTest : TestBase
1313
{
14-
private readonly string expiredSSLCertUrl = "https://expired.badssl.com/";
15-
14+
private readonly string expiredSSLCertUrl = "https://expired.badssl.com/";
15+
1616
[Test]
17-
public void TestHttpClientSSLCertificateVerification_ExceptionResponse()
18-
{
19-
var expectedValue = "The SSL connection could not be established, see inner exception.";
20-
var clientConfiguration = new CoreHttpClientConfiguration.Builder()
17+
public async Task TestHttpClientSSLCertificateVerification_ExceptionResponse()
18+
{
19+
var expectedValue = "The SSL connection could not be established, see inner exception.";
20+
var clientConfiguration = new CoreHttpClientConfiguration.Builder()
2121
.Build();
2222

2323
var config = new GlobalConfiguration.Builder()
@@ -31,20 +31,20 @@ public void TestHttpClientSSLCertificateVerification_ExceptionResponse()
3131

3232
var client = config.HttpClient;
3333

34-
var request = config.GlobalRequestBuilder()
34+
var request = await config.GlobalRequestBuilder()
3535
.Setup(HttpMethod.Get, string.Empty)
3636
.Build();
3737

3838
// Act
3939
var ex = Assert.ThrowsAsync<HttpRequestException>(() => client.ExecuteAsync(request));
4040
Assert.AreEqual(expectedValue, ex.Message);
41-
}
42-
41+
}
42+
4343
[Test]
4444
public async Task TestHttpClientSkipSSLCertificateVerification_OKResponse()
45-
{
46-
var clientConfiguration = new CoreHttpClientConfiguration.Builder()
47-
.SkipSslCertVerification(true)
45+
{
46+
var clientConfiguration = new CoreHttpClientConfiguration.Builder()
47+
.SkipSslCertVerification(true)
4848
.Build();
4949

5050
var config = new GlobalConfiguration.Builder()
@@ -58,7 +58,7 @@ public async Task TestHttpClientSkipSSLCertificateVerification_OKResponse()
5858

5959
var client = config.HttpClient;
6060

61-
var request = config.GlobalRequestBuilder()
61+
var request = await config.GlobalRequestBuilder()
6262
.Setup(HttpMethod.Get, string.Empty)
6363
.Build();
6464

APIMatic.Core.Test/Http/HttpClientWrapperTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void SetupHttpClient()
4040
[Test]
4141
public async Task HttpClient_GetCall_200Response()
4242
{
43-
var request = _config.GlobalRequestBuilder()
43+
var request = await _config.GlobalRequestBuilder()
4444
.Setup(HttpMethod.Get, "/httpclient/get/200")
4545
.Parameters(p => p
4646
.Body(b => b.Setup("Get Response")))
@@ -60,7 +60,7 @@ public async Task HttpClient_GetCall_200Response()
6060
[Test]
6161
public async Task TestHttpClientGetCall_400Response()
6262
{
63-
var request = _config.GlobalRequestBuilder()
63+
var request = await _config.GlobalRequestBuilder()
6464
.Setup(HttpMethod.Get, "/httpclient/get/400")
6565
.Parameters(p => p
6666
.Body(b => b.Setup("Get Bad Request")))
@@ -84,7 +84,7 @@ public async Task TestHttpClientGetCall_200Response()
8484
var customHeaderKey = "Custom-Headder";
8585
var customHeaderValue = "customHeader";
8686

87-
var request = _config.GlobalRequestBuilder()
87+
var request = await _config.GlobalRequestBuilder()
8888
.Setup(HttpMethod.Get, "/httpclient/get-combined-headers/200")
8989
.Build();
9090

APIMatic.Core/ApiCall.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public ApiCall<Request, Response, Context, ApiException, ReturnType, ResponseTyp
102102
public async Task<ReturnType> ExecuteAsync(CancellationToken cancellationToken = default)
103103
{
104104
requestBuilder.AcceptHeader = responseHandler.AcceptHeader;
105-
CoreRequest request = requestBuilder.Build();
105+
CoreRequest request = await requestBuilder.Build();
106106
globalConfiguration.ApiCallback?.OnBeforeHttpRequestEventHandler(request);
107107
_sdkLogger.LogRequest(request);
108108
CoreResponse response = await globalConfiguration.HttpClient.ExecuteAsync(request, cancellationToken).ConfigureAwait(false);

APIMatic.Core/Authentication/AuthGroupBuilder.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using System.Threading.Tasks;
78
using APIMatic.Core.Request;
89
using APIMatic.Core.Types.Sdk.Exceptions;
910

@@ -112,10 +113,13 @@ public override void Validate()
112113
/// Add authentication group information to the RequestBuilder.
113114
/// </summary>
114115
/// <param name="requestBuilder">The RequestBuilder object on which authentication will be applied.</param>
115-
internal override void Apply(RequestBuilder requestBuilder)
116+
public override async Task Apply(RequestBuilder requestBuilder)
116117
{
117118
Validate();
118-
validatedAuthManagers.ForEach(authManager => authManager.Apply(requestBuilder));
119+
foreach (var authManager in validatedAuthManagers)
120+
{
121+
await authManager.Apply(requestBuilder);
122+
}
119123
}
120124
}
121125
}

APIMatic.Core/Authentication/AuthManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) APIMatic. All rights reserved.
33
// </copyright>
44
using System;
5+
using System.Threading.Tasks;
56
using APIMatic.Core.Request;
67
using APIMatic.Core.Request.Parameters;
78

@@ -37,10 +38,11 @@ public virtual void Validate()
3738
/// Add authentication information to the HTTP Request.
3839
/// </summary>
3940
/// <param name="requestBuilder">The http request object on which authentication will be applied.</param>
40-
internal virtual void Apply(RequestBuilder requestBuilder)
41+
public virtual Task Apply(RequestBuilder requestBuilder)
4142
{
4243
Validate();
4344
parameters.Apply(requestBuilder);
45+
return Task.CompletedTask;
4446
}
4547
}
4648
}

APIMatic.Core/Request/RequestBuilder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Linq;
88
using System.Net.Http;
99
using System.Text;
10+
using System.Threading.Tasks;
1011
using APIMatic.Core.Authentication;
1112
using APIMatic.Core.Http.Configuration;
1213
using APIMatic.Core.Request.Parameters;
@@ -145,11 +146,11 @@ public RequestBuilder XmlBodySerializer(Func<dynamic, object> xmlSerializer)
145146
/// This applies all the configuration and build an instance of CoreRequest
146147
/// </summary>
147148
/// <returns></returns>
148-
public CoreRequest Build()
149+
public async Task<CoreRequest> Build()
149150
{
150151
parameters.Validate().Apply(this);
151152
configuration.RuntimeParameters.Validate().Apply(this);
152-
authGroup.Apply(this);
153+
await authGroup.Apply(this);
153154
CoreHelper.AppendUrlWithQueryParameters(QueryUrl, queryParameters, ArraySerialization);
154155
body = bodyParameters.Any() ? bodyParameters : body;
155156
AppendContentTypeHeader();

0 commit comments

Comments
 (0)