Skip to content

Commit e8248f9

Browse files
authored
Merge pull request #20 from matthewcorven/calendar_service_sync
CalendarService async with proper return types
2 parents 9f806dc + 64482e3 commit e8248f9

File tree

8 files changed

+355
-154
lines changed

8 files changed

+355
-154
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System.Net;
2+
using GoogleApis.Blazor.Extensions;
3+
using Moq.Contrib.HttpClient;
4+
5+
namespace GoogleApis.Blazor.Test.Extensions;
6+
7+
public class HttpClientExtensionsTests
8+
{
9+
private static Mock<HttpMessageHandler> GetMockHttpMessageHandler()
10+
{
11+
var handler = new Mock<HttpMessageHandler>();
12+
handler.SetupRequest(HttpMethod.Get, "https://www.helloworld.com")
13+
.ReturnsResponse(HttpStatusCode.OK, "");
14+
return handler;
15+
}
16+
17+
[Fact]
18+
public async Task GetWithQueryStringsAsync__WhenQueryStringsParam_Null__Returns_ArgumentNullException()
19+
{
20+
var handler = GetMockHttpMessageHandler();
21+
22+
var client = handler.CreateClient();
23+
24+
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetWithQueryStringsAsync("https://www.helloworld.com"));
25+
}
26+
27+
[Fact]
28+
public async Task GetWithQueryStringsAsync__WhenQueryStringsParam_Empty__Returns_ArgumentNullException()
29+
{
30+
var handler = GetMockHttpMessageHandler();
31+
32+
var client = handler.CreateClient();
33+
34+
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetWithQueryStringsAsync("https://www.helloworld.com", Array.Empty<string>()));
35+
}
36+
37+
[Fact]
38+
public async Task GetWithQueryStringsAsync__WhenQueryStringsParam_NotEven__Returns_ArgumentOutOfRangeException()
39+
{
40+
var handler = GetMockHttpMessageHandler();
41+
42+
var client = handler.CreateClient();
43+
44+
await Assert.ThrowsAsync<ArgumentOutOfRangeException>(() => client.GetWithQueryStringsAsync("https://www.helloworld.com", new []{ "", "", ""}));
45+
}
46+
47+
[Fact]
48+
public async Task GetWithQueryStringsAsync__WhenQueryStringsParam_HasNullKey__Returns_ArgumentException()
49+
{
50+
var handler = GetMockHttpMessageHandler();
51+
52+
var client = handler.CreateClient();
53+
54+
await Assert.ThrowsAsync<ArgumentException>(() => client.GetWithQueryStringsAsync("https://www.helloworld.com", new []{ null, "something"}));
55+
}
56+
57+
[Fact]
58+
public async Task GetWithQueryStringsAsync__ReturnsExpectedResult()
59+
{
60+
var handler = new Mock<HttpMessageHandler>();
61+
handler.SetupRequest(HttpMethod.Get, "https://www.helloworld.com?fruit=apple&size=large")
62+
.ReturnsResponse(HttpStatusCode.OK, "hello_world");
63+
var client = new HttpClient(handler.Object);
64+
65+
var response = await client.GetWithQueryStringsAsync("https://www.helloworld.com", new[]
66+
{
67+
"fruit", "apple",
68+
"size", "large",
69+
});
70+
71+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
72+
var body = await response.Content.ReadAsStringAsync();
73+
Assert.Equal("hello_world", body);
74+
}
75+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13+
<PackageReference Include="Moq.Contrib.HttpClient" Version="1.3.0" />
14+
<PackageReference Include="xunit" Version="2.4.1" />
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
<PrivateAssets>all</PrivateAssets>
18+
</PackageReference>
19+
<PackageReference Include="coverlet.collector" Version="3.1.2">
20+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
21+
<PrivateAssets>all</PrivateAssets>
22+
</PackageReference>
23+
</ItemGroup>
24+
25+
<ItemGroup>
26+
<ProjectReference Include="..\GoogleApis.Blazor\GoogleApis.Blazor.csproj" />
27+
</ItemGroup>
28+
29+
</Project>

GoogleApis.Blazor.Test/Usings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
global using Xunit;
2+
global using Moq;

GoogleApis.Blazor.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ VisualStudioVersion = 17.1.32421.90
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoogleApis.Blazor", "GoogleApis.Blazor\GoogleApis.Blazor.csproj", "{7460C3F8-290E-4920-AE79-857E37DA1BBD}"
77
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoogleApis.Blazor.Test", "GoogleApis.Blazor.Test\GoogleApis.Blazor.Test.csproj", "{584B3888-D256-47A3-AFE8-EAA8BA341D3A}"
9+
EndProject
810
Global
911
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1012
Debug|Any CPU = Debug|Any CPU
@@ -15,6 +17,10 @@ Global
1517
{7460C3F8-290E-4920-AE79-857E37DA1BBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
1618
{7460C3F8-290E-4920-AE79-857E37DA1BBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
1719
{7460C3F8-290E-4920-AE79-857E37DA1BBD}.Release|Any CPU.Build.0 = Release|Any CPU
20+
{584B3888-D256-47A3-AFE8-EAA8BA341D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{584B3888-D256-47A3-AFE8-EAA8BA341D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{584B3888-D256-47A3-AFE8-EAA8BA341D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
23+
{584B3888-D256-47A3-AFE8-EAA8BA341D3A}.Release|Any CPU.Build.0 = Release|Any CPU
1824
EndGlobalSection
1925
GlobalSection(SolutionProperties) = preSolution
2026
HideSolutionNode = FALSE

GoogleApis.Blazor/Auth/AuthService.cs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@
22
using Microsoft.AspNetCore.Components;
33
using Microsoft.Extensions.Configuration;
44
using Microsoft.JSInterop;
5-
using System;
6-
using System.Collections.Generic;
7-
using System.Linq;
8-
using System.Net.Http;
95
using System.Net.Http.Headers;
106
using System.Text;
117
using System.Text.Json;
12-
using System.Threading.Tasks;
138
using System.Web;
149

1510
namespace GoogleApis.Blazor.Auth
@@ -69,7 +64,7 @@ public async Task RequestAuthorizationCode(string clientId, List<Scope> scopes,
6964
/// <param name="clientSecret"></param>
7065
/// <param name="redirectUrl"></param>
7166
/// <returns></returns>
72-
public string AuthorizeCredential(string authorizationCode, string clientId, string clientSecret, string redirectUrl)
67+
public async Task<string> AuthorizeCredential(string authorizationCode, string clientId, string clientSecret, string redirectUrl)
7368
{
7469
string encodedAuthorizationCode = HttpUtility.UrlEncode(authorizationCode);
7570
string encodedRedirectUrl = HttpUtility.UrlEncode(redirectUrl);
@@ -78,9 +73,9 @@ public string AuthorizeCredential(string authorizationCode, string clientId, str
7873
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
7974
var content = new StringContent($"code={encodedAuthorizationCode}&client_id={clientId}&client_secret={clientSecret}&redirect_uri={encodedRedirectUrl}&scope=&grant_type=authorization_code", Encoding.UTF8, "application/x-www-form-urlencoded");
8075

81-
var request = client.PostAsync("https://oauth2.googleapis.com/token", content).Result;
76+
var request = await client.PostAsync("https://oauth2.googleapis.com/token", content);
8277

83-
return request.Content.ReadAsStringAsync().Result;
78+
return await request.Content.ReadAsStringAsync();
8479
}
8580

8681
/// <summary>
@@ -91,17 +86,17 @@ public string AuthorizeCredential(string authorizationCode, string clientId, str
9186
/// <param name="clientSecret"></param>
9287
/// <param name="redirectUrl"></param>
9388
/// <returns></returns>
94-
public string RefreshAccessToken(string refreshToken, string clientId, string clientSecret, string redirectUrl)
89+
public async Task<string> RefreshAccessToken(string refreshToken, string clientId, string clientSecret, string redirectUrl)
9590
{
9691
string encodedRedirectUrl = HttpUtility.UrlEncode(redirectUrl);
9792

9893
var client = HttpClientFactory.CreateClient();
9994
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
10095
var content = new StringContent($"refresh_token={refreshToken}&client_id={clientId}&client_secret={clientSecret}&redirect_uri={encodedRedirectUrl}&scope=&grant_type=refresh_token", Encoding.UTF8, "application/x-www-form-urlencoded");
10196

102-
var request = client.PostAsync("https://oauth2.googleapis.com/token", content).Result;
97+
var request = await client.PostAsync("https://oauth2.googleapis.com/token", content);
10398

104-
var result = request.Content.ReadAsStringAsync().Result;
99+
var result = await request.Content.ReadAsStringAsync();
105100

106101
var jsonResult = JsonDocument.Parse(result);
107102
string accessToken = jsonResult.RootElement.GetProperty("access_token").ToString();
@@ -114,7 +109,7 @@ public string RefreshAccessToken(string refreshToken, string clientId, string cl
114109
/// </summary>
115110
/// <param name="refreshToken"></param>
116111
/// <returns></returns>
117-
public string RefreshAccessToken(string refreshToken)
112+
public async Task<string> RefreshAccessToken(string refreshToken)
118113
{
119114
string clientId = GetClientId();
120115
string clientSecret = GetClientSecret();
@@ -124,9 +119,9 @@ public string RefreshAccessToken(string refreshToken)
124119
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
125120
var content = new StringContent($"refresh_token={refreshToken}&client_id={clientId}&client_secret={clientSecret}&redirect_uri={encodedRedirectUrl}&scope=&grant_type=refresh_token", Encoding.UTF8, "application/x-www-form-urlencoded");
126121

127-
var request = client.PostAsync("https://oauth2.googleapis.com/token", content).Result;
122+
var request = await client.PostAsync("https://oauth2.googleapis.com/token", content);
128123

129-
var result = request.Content.ReadAsStringAsync().Result;
124+
var result = await request.Content.ReadAsStringAsync();
130125

131126
var jsonResult = JsonDocument.Parse(result);
132127
string accessToken = jsonResult.RootElement.GetProperty("access_token").ToString();
@@ -198,14 +193,14 @@ public bool IsAccessTokenExpired(string contentResult)
198193
/// </summary>
199194
/// <param name="accessToken"></param>
200195
/// <returns></returns>
201-
public string GetUserMail(string accessToken)
196+
public async Task<string> GetUserMail(string accessToken)
202197
{
203198
var client = HttpClientFactory.CreateClient();
204199
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
205200
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
206-
var result = client.GetAsync("https://www.googleapis.com/userinfo/v2/me").Result;
201+
var result = await client.GetAsync("https://www.googleapis.com/userinfo/v2/me");
207202

208-
var jsonResult = JsonDocument.Parse(result.Content.ReadAsStringAsync().Result);
203+
var jsonResult = JsonDocument.Parse(await result.Content.ReadAsStringAsync());
209204
string email = jsonResult.RootElement.GetProperty("email").ToString();
210205

211206
return email;
@@ -232,12 +227,12 @@ public string GetValueFromCredential(string credential, CredentialValueType cred
232227
/// </summary>
233228
/// <param name="accessToken"></param>
234229
/// <returns></returns>
235-
public string GetAccessTokenDetails(string accessToken)
230+
public async Task<string> GetAccessTokenDetails(string accessToken)
236231
{
237232
var client = HttpClientFactory.CreateClient();
238-
var result = client.GetAsync($"https://oauth2.googleapis.com/tokeninfo?access_token={accessToken}").Result;
239-
240-
return result.Content.ReadAsStringAsync().Result;
233+
var result = await client.GetAsync($"https://oauth2.googleapis.com/tokeninfo?access_token={accessToken}");
234+
if (result.StatusCode != System.Net.HttpStatusCode.OK) return null;
235+
return await result.Content.ReadAsStringAsync();
241236
}
242237

243238
}

0 commit comments

Comments
 (0)