Skip to content

Commit be7bdb6

Browse files
committed
Added Retry Handler and removed old enums
1 parent 221d753 commit be7bdb6

15 files changed

Lines changed: 143 additions & 257 deletions

File tree

‎SpotifyAPI.Web.Examples.ASP/Startup.cs‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Microsoft.Extensions.Configuration;
55
using Microsoft.Extensions.DependencyInjection;
66
using Microsoft.Extensions.Hosting;
7-
using SpotifyAPI.Web.Enums;
87

98
namespace SpotifyAPI.Web.Examples.ASP
109
{
@@ -26,8 +25,8 @@ public void ConfigureServices(IServiceCollection services)
2625
.AddCookie()
2726
.AddSpotify(options =>
2827
{
29-
var scopes = Scope.UserLibraryRead | Scope.UserModifyPlaybackState;
30-
options.Scope.Add(scopes.GetStringAttribute(","));
28+
// var scopes = Scope.UserLibraryRead | Scope.UserModifyPlaybackState;
29+
// options.Scope.Add(scopes.GetStringAttribute(","));
3130

3231
options.SaveTokens = true;
3332
options.ClientId = Configuration["client_id"];
@@ -65,4 +64,4 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
6564
});
6665
}
6766
}
68-
}
67+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using System;
2+
using System.Net;
3+
using System.Net.Http;
4+
using System.Threading.Tasks;
5+
using Moq;
6+
using NUnit.Framework;
7+
using SpotifyAPI.Web.Http;
8+
9+
namespace SpotifyAPI.Web.Tests
10+
{
11+
[TestFixture]
12+
public class APIConnectorTest
13+
{
14+
[Test]
15+
public async Task RetryHandler_IsUsed()
16+
{
17+
var apiResponse = new Mock<IAPIResponse<string>>();
18+
apiResponse.SetupGet(a => a.Body).Returns("Hello World");
19+
20+
var response = new Mock<IResponse>();
21+
response.SetupGet(r => r.ContentType).Returns("application/json");
22+
response.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.OK);
23+
response.SetupGet(r => r.Body).Returns("\"Hello World\"");
24+
25+
var authenticator = new Mock<IAuthenticator>();
26+
var serializer = new Mock<IJSONSerializer>();
27+
serializer.Setup(s => s.DeserializeResponse<string>(It.IsAny<IResponse>())).Returns(apiResponse.Object);
28+
29+
var httpClient = new Mock<IHTTPClient>();
30+
var retryHandler = new Mock<IRetryHandler>();
31+
retryHandler.Setup(r =>
32+
r.HandleRetry(
33+
It.IsAny<IRequest>(),
34+
It.IsAny<IResponse>(),
35+
It.IsAny<Func<IRequest, Task<IResponse>>>()
36+
)
37+
).Returns(Task.FromResult(response.Object));
38+
39+
var apiConnector = new APIConnector(
40+
new Uri("https://spotify.com"),
41+
authenticator.Object,
42+
serializer.Object,
43+
httpClient.Object,
44+
retryHandler.Object
45+
);
46+
await apiConnector.SendAPIRequest<string>(new Uri("/me", UriKind.Relative), HttpMethod.Get);
47+
48+
authenticator.Verify(a => a.Apply(It.IsAny<IRequest>()), Times.Once);
49+
httpClient.Verify(h => h.DoRequest(It.IsAny<IRequest>()), Times.Once);
50+
serializer.Verify(s => s.DeserializeResponse<string>(response.Object), Times.Once);
51+
}
52+
53+
[Test]
54+
public async Task RetryHandler_CanRetry()
55+
{
56+
var apiResponse = new Mock<IAPIResponse<string>>();
57+
apiResponse.SetupGet(a => a.Body).Returns("Hello World");
58+
59+
var response = new Mock<IResponse>();
60+
response.SetupGet(r => r.ContentType).Returns("application/json");
61+
response.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.OK);
62+
response.SetupGet(r => r.Body).Returns("\"Hello World\"");
63+
64+
var authenticator = new Mock<IAuthenticator>();
65+
var serializer = new Mock<IJSONSerializer>();
66+
serializer.Setup(s => s.DeserializeResponse<string>(It.IsAny<IResponse>())).Returns(apiResponse.Object);
67+
68+
var httpClient = new Mock<IHTTPClient>();
69+
httpClient.Setup(h => h.DoRequest(It.IsAny<IRequest>())).Returns(Task.FromResult(response.Object));
70+
71+
var retryHandler = new Mock<IRetryHandler>();
72+
retryHandler.Setup(r =>
73+
r.HandleRetry(
74+
It.IsAny<IRequest>(),
75+
It.IsAny<IResponse>(),
76+
It.IsAny<Func<IRequest, Task<IResponse>>>()
77+
)
78+
).Returns((IRequest request, IResponse response, Func<IRequest, Task<IResponse>> retry) => retry(request));
79+
80+
var apiConnector = new APIConnector(
81+
new Uri("https://spotify.com"),
82+
authenticator.Object,
83+
serializer.Object,
84+
httpClient.Object,
85+
retryHandler.Object
86+
);
87+
await apiConnector.SendAPIRequest<string>(new Uri("/me", UriKind.Relative), HttpMethod.Get);
88+
89+
serializer.Verify(s => s.SerializeRequest(It.IsAny<IRequest>()), Times.Once);
90+
authenticator.Verify(a => a.Apply(It.IsAny<IRequest>()), Times.Exactly(2));
91+
httpClient.Verify(h => h.DoRequest(It.IsAny<IRequest>()), Times.Exactly(2));
92+
serializer.Verify(s => s.DeserializeResponse<string>(response.Object), Times.Once);
93+
}
94+
}
95+
}

‎SpotifyAPI.Web.Tests/UtilTest.cs‎

Lines changed: 0 additions & 18 deletions
This file was deleted.

‎SpotifyAPI.Web/Clients/SpotifyClientConfig.cs‎

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class SpotifyClientConfig
99
public IAuthenticator Authenticator { get; }
1010
public IJSONSerializer JSONSerializer { get; }
1111
public IHTTPClient HTTPClient { get; }
12+
public IRetryHandler RetryHandler { get; }
1213

1314
/// <summary>
1415
/// This config spefies the internal parts of the SpotifyClient.
@@ -19,17 +20,20 @@ public class SpotifyClientConfig
1920
/// <param name="authenticator"></param>
2021
/// <param name="jsonSerializer"></param>
2122
/// <param name="httpClient"></param>
23+
/// <param name="retryHandler"></param>
2224
public SpotifyClientConfig(
2325
Uri baseAddress,
2426
IAuthenticator authenticator,
2527
IJSONSerializer jsonSerializer,
26-
IHTTPClient httpClient
28+
IHTTPClient httpClient,
29+
IRetryHandler retryHandler
2730
)
2831
{
2932
BaseAddress = baseAddress;
3033
Authenticator = authenticator;
3134
JSONSerializer = jsonSerializer;
3235
HTTPClient = httpClient;
36+
RetryHandler = retryHandler;
3337
}
3438

3539
internal IAPIConnector CreateAPIConnector()
@@ -40,7 +44,7 @@ internal IAPIConnector CreateAPIConnector()
4044
Ensure.PropertyNotNull(JSONSerializer, nameof(JSONSerializer));
4145
Ensure.PropertyNotNull(HTTPClient, nameof(HTTPClient));
4246

43-
return new APIConnector(BaseAddress, Authenticator, JSONSerializer, HTTPClient);
47+
return new APIConnector(BaseAddress, Authenticator, JSONSerializer, HTTPClient, RetryHandler);
4448
}
4549

4650
public SpotifyClientConfig WithToken(string token, string tokenType = "Bearer")
@@ -50,11 +54,14 @@ public SpotifyClientConfig WithToken(string token, string tokenType = "Bearer")
5054
return WithAuthenticator(new TokenHeaderAuthenticator(token, tokenType));
5155
}
5256

53-
public SpotifyClientConfig WithAuthenticator(IAuthenticator authenticator)
57+
public SpotifyClientConfig WithRetryHandler(IRetryHandler retryHandler)
5458
{
55-
Ensure.ArgumentNotNull(authenticator, nameof(authenticator));
59+
return new SpotifyClientConfig(BaseAddress, Authenticator, JSONSerializer, HTTPClient, retryHandler);
60+
}
5661

57-
return new SpotifyClientConfig(BaseAddress, Authenticator, JSONSerializer, HTTPClient);
62+
public SpotifyClientConfig WithAuthenticator(IAuthenticator authenticator)
63+
{
64+
return new SpotifyClientConfig(BaseAddress, authenticator, JSONSerializer, HTTPClient, RetryHandler);
5865
}
5966

6067
public static SpotifyClientConfig CreateDefault(string token, string tokenType = "Bearer")
@@ -79,7 +86,8 @@ public static SpotifyClientConfig CreateDefault(IAuthenticator authenticator)
7986
SpotifyUrls.API_V1,
8087
authenticator,
8188
new NewtonsoftJSONSerializer(),
82-
new NetHttpClient()
89+
new NetHttpClient(),
90+
null
8391
);
8492
}
8593
}

‎SpotifyAPI.Web/Enums/AlbumType.cs‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎SpotifyAPI.Web/Enums/FollowType.cs‎

Lines changed: 0 additions & 14 deletions
This file was deleted.

‎SpotifyAPI.Web/Enums/RepeatState.cs‎

Lines changed: 0 additions & 17 deletions
This file was deleted.

‎SpotifyAPI.Web/Enums/Scope.cs‎

Lines changed: 0 additions & 68 deletions
This file was deleted.

‎SpotifyAPI.Web/Enums/SearchType.cs‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎SpotifyAPI.Web/Enums/TimeRangeType.cs‎

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)