Skip to content

Commit ee08fca

Browse files
committed
Unit-tests refactored
1 parent cda5d00 commit ee08fca

9 files changed

Lines changed: 56 additions & 55 deletions

File tree

MockMe.API/Controllers/AccountController.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.IdentityModel.Tokens;
66
using MockMe.API.Infrastructure;
77
using MockMe.API.Services;
8+
using MockMe.Common;
89
using System;
910
using System.ComponentModel.DataAnnotations;
1011
using System.Security.Claims;
@@ -120,7 +121,7 @@ public async Task<ActionResult> RefreshToken([FromBody] RefreshTokenRequest requ
120121
}
121122

122123
[HttpPost("impersonation")]
123-
[Authorize(Roles = UserRoles.Admin)]
124+
[Authorize(Roles = Constants.Admin)]
124125
public ActionResult Impersonate([FromBody] ImpersonationRequest request)
125126
{
126127
var userName = User.Identity?.Name;
@@ -132,7 +133,7 @@ public ActionResult Impersonate([FromBody] ImpersonationRequest request)
132133
_logger.LogDebug("User [{userName}] failed to impersonate [{request.UserName}] due to the target user not found.", userName, request.UserName);
133134
return BadRequest($"The target user [{request.UserName}] is not found.");
134135
}
135-
if (impersonatedRole == UserRoles.Admin)
136+
if (impersonatedRole == Constants.Admin)
136137
{
137138
_logger.LogDebug("User [{userName}] failed to impersonate [{request.UserName}] due to the target user is an admin.", userName, request.UserName);
138139
return BadRequest("This action is not supported.");

MockMe.API/Services/UsersService.cs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Microsoft.Extensions.Logging;
2-
using MockMe.Model;
3-
using System.Collections.Generic;
2+
using MockMe.Common;
43

54
namespace MockMe.API.Services
65
{
@@ -14,8 +13,7 @@ public interface IUserService
1413
public class UserService : IUserService
1514
{
1615
readonly ILogger<UserService> _logger;
17-
readonly IDictionary<string, string> _users = Constants.USERS;
18-
16+
1917
public UserService(ILogger<UserService> logger)
2018
{
2119
_logger = logger;
@@ -31,12 +29,12 @@ public bool IsValidUserCredentials(string userName, string password)
3129
return false;
3230
}
3331

34-
return _users.TryGetValue(userName, out var p) && p == password;
32+
return Constants.USERS.TryGetValue(userName, out var p) && p == password;
3533
}
3634

3735
public bool IsAnExistingUser(string userName)
3836
{
39-
return _users.ContainsKey(userName);
37+
return Constants.USERS.ContainsKey(userName);
4038
}
4139

4240
public string GetUserRole(string userName)
@@ -48,16 +46,10 @@ public string GetUserRole(string userName)
4846

4947
if (userName == "admin")
5048
{
51-
return UserRoles.Admin;
49+
return Constants.Admin;
5250
}
5351

54-
return UserRoles.BasicUser;
52+
return Constants.BasicUser;
5553
}
5654
}
57-
58-
public static class UserRoles
59-
{
60-
public const string Admin = nameof(Admin);
61-
public const string BasicUser = nameof(BasicUser);
62-
}
6355
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
using System.Collections.Generic;
1+
using MockMe.Model;
2+
using System.Collections.Generic;
23

3-
namespace MockMe.Model
4+
namespace MockMe.Common
45
{
56
public class Constants
67
{
7-
public static readonly IDictionary<string, string> USERS = new Dictionary<string, string>
8+
public const string Admin = "Admin";
9+
public const string BasicUser = "BasicUser";
10+
11+
public static readonly IDictionary<string, string> USERS = new Dictionary<string, string>
812
{
913
{ "admin", "password" },
1014
{ "test", "password" }

MockMe.Common/MockMe.Common.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@
1010
<PackageReference Include="System.Text.Json" Version="8.0.5" />
1111
</ItemGroup>
1212

13+
<ItemGroup>
14+
<ProjectReference Include="..\MockMe.Model\MockMe.Model.csproj" />
15+
</ItemGroup>
16+
1317
</Project>

MockMe.Repository/MockMe.Repository.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
<ItemGroup>
88
<ProjectReference Include="..\MockMe.Common\MockMe.Common.csproj" />
9-
<ProjectReference Include="..\MockMe.Model\MockMe.Model.csproj" />
109
</ItemGroup>
1110

1211
</Project>

MockMe.UnitTest/AccountControllerTests.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using MockMe.API.Controllers;
66
using MockMe.API.Infrastructure;
77
using MockMe.API.Services;
8+
using MockMe.Common;
89
using System;
910
using System.Collections.Generic;
1011
using System.Net;
@@ -61,14 +62,14 @@ public async Task ShouldReturnCorrectResponseForSuccessLogin()
6162
var loginResult = JsonSerializer.Deserialize<LoginResult>(loginResponseContent);
6263
Assert.AreEqual(credentials.UserName, loginResult.UserName);
6364
Assert.IsNull(loginResult.OriginalUserName);
64-
Assert.AreEqual(UserRoles.Admin, loginResult.Role);
65+
Assert.AreEqual(Constants.Admin, loginResult.Role);
6566
Assert.IsFalse(string.IsNullOrWhiteSpace(loginResult.AccessToken));
6667
Assert.IsFalse(string.IsNullOrWhiteSpace(loginResult.RefreshToken));
6768

6869
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
6970
var (principal, jwtSecurityToken) = jwtAuthManager.DecodeJwtToken(loginResult.AccessToken);
7071
Assert.AreEqual(credentials.UserName, principal.Identity.Name);
71-
Assert.AreEqual(UserRoles.Admin, principal.FindFirst(ClaimTypes.Role).Value);
72+
Assert.AreEqual(Constants.Admin, principal.FindFirst(ClaimTypes.Role).Value);
7273
Assert.IsNotNull(jwtSecurityToken);
7374
}
7475

@@ -101,7 +102,7 @@ public async Task ShouldCorrectlyRefreshToken()
101102
var claims = new[]
102103
{
103104
new Claim(ClaimTypes.Name,userName),
104-
new Claim(ClaimTypes.Role, UserRoles.Admin)
105+
new Claim(ClaimTypes.Role, Constants.Admin)
105106
};
106107
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
107108
var jwtResult = jwtAuthManager.GenerateTokens(userName, claims, DateTime.Now.AddMinutes(-1));
@@ -130,7 +131,7 @@ public async Task ShouldNotAllowToRefreshTokenWhenRefreshTokenIsExpired()
130131
var claims = new[]
131132
{
132133
new Claim(ClaimTypes.Name,userName),
133-
new Claim(ClaimTypes.Role, UserRoles.Admin)
134+
new Claim(ClaimTypes.Role, Constants.Admin)
134135
};
135136
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
136137
var jwtTokenConfig = _serviceProvider.GetRequiredService<JwtTokenConfig>();
@@ -156,7 +157,7 @@ public async Task ShouldAllowAdminImpersonateOthers()
156157
var claims = new[]
157158
{
158159
new Claim(ClaimTypes.Name,userName),
159-
new Claim(ClaimTypes.Role, UserRoles.Admin)
160+
new Claim(ClaimTypes.Role, Constants.Admin)
160161
};
161162
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
162163
var jwtResult = jwtAuthManager.GenerateTokens(userName, claims, DateTime.Now.AddMinutes(-1));
@@ -171,13 +172,13 @@ public async Task ShouldAllowAdminImpersonateOthers()
171172
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
172173
Assert.AreEqual(request.UserName, result.UserName);
173174
Assert.AreEqual(userName, result.OriginalUserName);
174-
Assert.AreEqual(UserRoles.BasicUser, result.Role);
175+
Assert.AreEqual(Constants.BasicUser, result.Role);
175176
Assert.IsFalse(string.IsNullOrWhiteSpace(result.AccessToken));
176177
Assert.IsFalse(string.IsNullOrWhiteSpace(result.RefreshToken));
177178

178179
var (principal, jwtSecurityToken) = jwtAuthManager.DecodeJwtToken(result.AccessToken);
179180
Assert.AreEqual(request.UserName, principal.Identity.Name);
180-
Assert.AreEqual(UserRoles.BasicUser, principal.FindFirst(ClaimTypes.Role).Value);
181+
Assert.AreEqual(Constants.BasicUser, principal.FindFirst(ClaimTypes.Role).Value);
181182
Assert.AreEqual(userName, principal.FindFirst("OriginalUserName").Value);
182183
Assert.IsNotNull(jwtSecurityToken);
183184
}
@@ -189,7 +190,7 @@ public async Task ShouldForbidNonAdminToImpersonate()
189190
var claims = new[]
190191
{
191192
new Claim(ClaimTypes.Name,userName),
192-
new Claim(ClaimTypes.Role, UserRoles.BasicUser)
193+
new Claim(ClaimTypes.Role, Constants.BasicUser)
193194
};
194195
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
195196
var jwtResult = jwtAuthManager.GenerateTokens(userName, claims, DateTime.Now.AddMinutes(-1));
@@ -210,7 +211,7 @@ public async Task ShouldAllowAdminToStopImpersonation()
210211
var claims = new[]
211212
{
212213
new Claim(ClaimTypes.Name,userName),
213-
new Claim(ClaimTypes.Role, UserRoles.BasicUser),
214+
new Claim(ClaimTypes.Role, Constants.BasicUser),
214215
new Claim("OriginalUserName", originalUserName)
215216
};
216217
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
@@ -224,13 +225,13 @@ public async Task ShouldAllowAdminToStopImpersonation()
224225
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
225226
Assert.AreEqual(originalUserName, result.UserName);
226227
Assert.IsTrue(string.IsNullOrWhiteSpace(result.OriginalUserName));
227-
Assert.AreEqual(UserRoles.Admin, result.Role);
228+
Assert.AreEqual(Constants.Admin, result.Role);
228229
Assert.IsFalse(string.IsNullOrWhiteSpace(result.AccessToken));
229230
Assert.IsFalse(string.IsNullOrWhiteSpace(result.RefreshToken));
230231

231232
var (principal, jwtSecurityToken) = jwtAuthManager.DecodeJwtToken(result.AccessToken);
232233
Assert.AreEqual(originalUserName, principal.Identity.Name);
233-
Assert.AreEqual(UserRoles.Admin, principal.FindFirst(ClaimTypes.Role).Value);
234+
Assert.AreEqual(Constants.Admin, principal.FindFirst(ClaimTypes.Role).Value);
234235
Assert.IsTrue(string.IsNullOrWhiteSpace(principal.FindFirst("OriginalUserName")?.Value));
235236
Assert.IsNotNull(jwtSecurityToken);
236237
}
@@ -242,7 +243,7 @@ public async Task ShouldReturnBadRequestIfStopImpersonationWhenNotImpersonating(
242243
var claims = new[]
243244
{
244245
new Claim(ClaimTypes.Name,userName),
245-
new Claim(ClaimTypes.Role, UserRoles.BasicUser)
246+
new Claim(ClaimTypes.Role, Constants.BasicUser)
246247
};
247248
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
248249
var jwtResult = jwtAuthManager.GenerateTokens(userName, claims, DateTime.Now.AddMinutes(-1));

MockMe.UnitTest/FileControllerTest.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Microsoft.AspNetCore.Mvc.Testing;
33
using Microsoft.VisualStudio.TestTools.UnitTesting;
44
using MockMe.API;
5-
using System;
65
using System.IO;
76
using System.Net;
87
using System.Net.Http;
@@ -19,8 +18,10 @@ public class FileControllerTest
1918
[ClassInitialize]
2019
public static void ClassInit(TestContext testContext)
2120
{
22-
Console.WriteLine(testContext.TestName);
23-
_factory = new WebApplicationFactory<Startup>().WithWebHostBuilder(builder => builder.UseSetting("https_port", "5001").UseEnvironment("Testing"));
21+
_factory = new WebApplicationFactory<Startup>()
22+
.WithWebHostBuilder(builder => builder
23+
.UseSetting("https_port", "5001")
24+
.UseEnvironment("Testing"));
2425
}
2526

2627
[TestMethod]
@@ -39,14 +40,13 @@ public async Task Should_ReturnSuccessResponse_SingleFileUpload()
3940
form.Add(new StringContent("reading"), "Courses");
4041
form.Add(new StringContent("math"), "Courses");
4142

42-
var response = await client.PostAsync("api/file/9998/upload", form);
43+
var response = await client.PostAsync("api/file/8888/upload", form);
4344
var json = await response.Content.ReadAsStringAsync();
4445

46+
Assert.IsNotNull(json);
4547
Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
4648
Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());
47-
Assert.AreEqual("/api/file/9998/101", response.Headers.Location?.AbsolutePath.ToLower());
48-
Assert.IsNotNull(json);
49-
Assert.IsTrue(response.StatusCode == HttpStatusCode.Created);
49+
Assert.AreEqual("/api/file/8888/upload", response.Headers.Location?.AbsolutePath.ToLower());
5050
}
5151

5252
[TestMethod]
@@ -65,7 +65,7 @@ public async Task Should_Return_BadRequest_SingleFileUpload()
6565
form.Add(new StringContent("Reading"), "Courses");
6666
form.Add(new StringContent("Math"), "Courses");
6767

68-
var response = await client.PostAsync("api/file/9998/upload", form);
68+
var response = await client.PostAsync("api/file/8888/upload", form);
6969

7070
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
7171
Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());
@@ -94,13 +94,13 @@ public async Task Should_Return_SuccessResponse_MultiFileUpload()
9494
form.Add(fileContent2, "Files", Path.GetFileName(testFile2));
9595
form.Add(fileContent3, "Files", Path.GetFileName(testFile3));
9696

97-
var response = await client.PostAsync("api/file/9998/uploads", form);
97+
var response = await client.PostAsync("api/file/8888/uploads", form);
9898
var json = await response.Content.ReadAsStringAsync();
9999

100-
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
101-
Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());
102100
Assert.IsNotNull(json);
103-
Assert.IsTrue(response.StatusCode == HttpStatusCode.OK);
101+
Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
102+
Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());
103+
Assert.AreEqual("/api/file/8888/uploads", response.Headers.Location?.AbsolutePath.ToLower());
104104
}
105105

106106
[TestMethod]

MockMe.UnitTest/JwtAuthManagerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Microsoft.IdentityModel.Tokens;
44
using Microsoft.VisualStudio.TestTools.UnitTesting;
55
using MockMe.API.Infrastructure;
6-
using MockMe.API.Services;
6+
using MockMe.Common;
77
using System;
88
using System.Security.Claims;
99

@@ -40,7 +40,7 @@ public void ShouldRotateRefreshToken()
4040
var claims = new[]
4141
{
4242
new Claim(ClaimTypes.Name,userName),
43-
new Claim(ClaimTypes.Role, UserRoles.Admin)
43+
new Claim(ClaimTypes.Role, Constants.Admin)
4444
};
4545

4646
var tokens1 = jwtAuthManager.GenerateTokens(userName, claims, now.AddMinutes(-20));
@@ -63,14 +63,14 @@ public void ShouldThrowExceptionWhenRefreshTokenUsingAnExpiredToken()
6363
var claims = new[]
6464
{
6565
new Claim(ClaimTypes.Name,userName),
66-
new Claim(ClaimTypes.Role, UserRoles.Admin)
66+
new Claim(ClaimTypes.Role, Constants.Admin)
6767
};
6868

6969
var jwtAuthResult1 = jwtAuthManager.GenerateTokens(userName, claims, now.AddMinutes(-jwtTokenConfig.AccessTokenExpiration - 1).AddSeconds(1));
7070
jwtAuthManager.Refresh(jwtAuthResult1.RefreshToken.TokenString, jwtAuthResult1.AccessToken, now);
7171

7272
var jwtAuthResult2 = jwtAuthManager.GenerateTokens(userName, claims, now.AddMinutes(-jwtTokenConfig.AccessTokenExpiration - 1));
73-
Assert.ThrowsException<SecurityTokenExpiredException>(() => jwtAuthManager.Refresh(jwtAuthResult2.RefreshToken.TokenString, jwtAuthResult2.AccessToken, now));
73+
Assert.ThrowsExactly<SecurityTokenExpiredException>(() => jwtAuthManager.Refresh(jwtAuthResult2.RefreshToken.TokenString, jwtAuthResult2.AccessToken, now));
7474
}
7575

7676
[TestMethod]
@@ -83,19 +83,19 @@ public void ShouldThrowExceptionWhenRefreshTokenIsForged()
8383
var claims1 = new[]
8484
{
8585
new Claim(ClaimTypes.Name,"admin"),
86-
new Claim(ClaimTypes.Role, UserRoles.Admin)
86+
new Claim(ClaimTypes.Role, Constants.Admin)
8787
};
8888
var tokens1 = jwtAuthManager.GenerateTokens("admin", claims1, now.AddMinutes(-jwtTokenConfig.AccessTokenExpiration));
8989

9090
var claims2 = new[]
9191
{
9292
new Claim(ClaimTypes.Name,"test1"),
93-
new Claim(ClaimTypes.Role, UserRoles.Admin)
93+
new Claim(ClaimTypes.Role, Constants.Admin)
9494
};
9595
var tokens2 = jwtAuthManager.GenerateTokens("test1", claims2, now.AddMinutes(-jwtTokenConfig.AccessTokenExpiration));
9696

9797
// forge a token: try to use the refresh token for "test1", but use the access token for "admin"
98-
var e = Assert.ThrowsException<SecurityTokenException>(() => jwtAuthManager.Refresh(tokens2.RefreshToken.TokenString, tokens1.AccessToken, now));
98+
var e = Assert.ThrowsExactly<SecurityTokenException>(() => jwtAuthManager.Refresh(tokens2.RefreshToken.TokenString, tokens1.AccessToken, now));
9999
Assert.AreEqual("Invalid token", e.Message);
100100
}
101101

MockMe.UnitTest/TradeControllerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Microsoft.VisualStudio.TestTools.UnitTesting;
66
using MockMe.API.Controllers;
77
using MockMe.API.Infrastructure;
8-
using MockMe.API.Services;
8+
using MockMe.Common;
99
using System;
1010
using System.Net;
1111
using System.Net.Http;
@@ -68,7 +68,7 @@ public async Task ShouldReturn401ForInvalidToken()
6868
const string invalidTokenString = @"eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiIsImV4cCI6MTcwNzAzMTE5MiwiaXNzIjoiaHR0cHM6Ly9teXdlYmFwaS5jb20iLCJhdWQiOiJodHRwczovL215d2ViYXBpLmNvbSJ9.sx_togy1FnalWpAnxN6vKKGeuG37DkwMoJCpoZbZ3T";
6969

7070
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
71-
Assert.ThrowsException<SecurityTokenSignatureKeyNotFoundException>(() => jwtAuthManager.DecodeJwtToken(invalidTokenString));
71+
Assert.ThrowsExactly<SecurityTokenSignatureKeyNotFoundException>(() => jwtAuthManager.DecodeJwtToken(invalidTokenString));
7272

7373
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, invalidTokenString);
7474
var response = await _httpClient.GetAsync("api/trade/countries");
@@ -82,15 +82,15 @@ public async Task ShouldReturn401ForExpiredToken()
8282
var claims = new[]
8383
{
8484
new Claim(ClaimTypes.Name,userName),
85-
new Claim(ClaimTypes.Role, UserRoles.Admin)
85+
new Claim(ClaimTypes.Role, Constants.Admin)
8686
};
8787
var jwtAuthManager = _serviceProvider.GetRequiredService<IJwtAuthManager>();
8888
var jwtTokenConfig = _serviceProvider.GetRequiredService<JwtTokenConfig>();
8989

9090
// expired token
9191
var jwtResult = jwtAuthManager.GenerateTokens(userName, claims, DateTime.Now.AddMinutes(-jwtTokenConfig.AccessTokenExpiration - 1));
9292
var invalidTokenString = jwtResult.AccessToken;
93-
Assert.ThrowsException<SecurityTokenExpiredException>(() => jwtAuthManager.DecodeJwtToken(invalidTokenString));
93+
Assert.ThrowsExactly<SecurityTokenExpiredException>(() => jwtAuthManager.DecodeJwtToken(invalidTokenString));
9494
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, invalidTokenString);
9595
var response = await _httpClient.GetAsync("api/trade/countries");
9696
Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode);

0 commit comments

Comments
 (0)