Skip to content

Commit bf83ca9

Browse files
committed
More test coverage
1 parent f0a604c commit bf83ca9

File tree

3 files changed

+86
-17
lines changed

3 files changed

+86
-17
lines changed

src/Identity/Extensions.Core/src/UserManager.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,11 +1140,7 @@ public virtual async Task<IList<UserLoginInfo>> GetLoginsAsync(TUser user)
11401140
/// </returns>
11411141
public virtual Task<IdentityResult> AddClaimAsync(TUser user, Claim claim)
11421142
{
1143-
ThrowIfDisposed();
1144-
GetClaimStore();
1145-
ArgumentNullThrowHelper.ThrowIfNull(claim);
1146-
ArgumentNullThrowHelper.ThrowIfNull(user);
1147-
return AddClaimsAsync(user, new Claim[] { claim });
1143+
return AddClaimsAsync(user, [claim]);
11481144
}
11491145

11501146
/// <summary>
@@ -1162,8 +1158,8 @@ public virtual async Task<IdentityResult> AddClaimsAsync(TUser user, IEnumerable
11621158
{
11631159
ThrowIfDisposed();
11641160
var claimStore = GetClaimStore();
1165-
ArgumentNullThrowHelper.ThrowIfNull(claims);
11661161
ArgumentNullThrowHelper.ThrowIfNull(user);
1162+
ArgumentNullThrowHelper.ThrowIfNull(claims);
11671163

11681164
await claimStore.AddClaimsAsync(user, claims, CancellationToken).ConfigureAwait(false);
11691165
return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.AddClaims).ConfigureAwait(false);
@@ -1191,9 +1187,9 @@ public virtual async Task<IdentityResult> ReplaceClaimAsync(TUser user, Claim cl
11911187
{
11921188
ThrowIfDisposed();
11931189
var claimStore = GetClaimStore();
1190+
ArgumentNullThrowHelper.ThrowIfNull(user);
11941191
ArgumentNullThrowHelper.ThrowIfNull(claim);
11951192
ArgumentNullThrowHelper.ThrowIfNull(newClaim);
1196-
ArgumentNullThrowHelper.ThrowIfNull(user);
11971193

11981194
await claimStore.ReplaceClaimAsync(user, claim, newClaim, CancellationToken).ConfigureAwait(false);
11991195
return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.ReplaceClaim).ConfigureAwait(false);
@@ -1216,11 +1212,7 @@ public virtual async Task<IdentityResult> ReplaceClaimAsync(TUser user, Claim cl
12161212
/// </returns>
12171213
public virtual Task<IdentityResult> RemoveClaimAsync(TUser user, Claim claim)
12181214
{
1219-
ThrowIfDisposed();
1220-
GetClaimStore();
1221-
ArgumentNullThrowHelper.ThrowIfNull(user);
1222-
ArgumentNullThrowHelper.ThrowIfNull(claim);
1223-
return RemoveClaimsAsync(user, new Claim[] { claim });
1215+
return RemoveClaimsAsync(user, [claim]);
12241216
}
12251217

12261218
/// <summary>

src/Identity/test/Identity.Test/SignInManagerTest.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,39 @@ public async Task RememberClientStoresUserId()
869869
]));
870870
}
871871

872+
[Fact]
873+
public async Task ForgetTwoFactorClient()
874+
{
875+
// Setup
876+
var testMeterFactory = new TestMeterFactory();
877+
using var forgetTwoFactorClient = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.forget_two_factor_client");
878+
879+
var user = new PocoUser { UserName = "Foo" };
880+
var manager = SetupUserManager(user, meterFactory: testMeterFactory);
881+
var context = new DefaultHttpContext();
882+
var auth = MockAuth(context);
883+
var helper = SetupSignInManager(manager.Object, context);
884+
auth.Setup(a => a.SignOutAsync(
885+
context,
886+
IdentityConstants.TwoFactorRememberMeScheme,
887+
It.IsAny<AuthenticationProperties>())).Returns(Task.FromException(new InvalidOperationException())).Verifiable();
888+
889+
// Act
890+
await Assert.ThrowsAsync<InvalidOperationException>(() => helper.ForgetTwoFactorClientAsync());
891+
892+
// Assert
893+
manager.Verify();
894+
auth.Verify();
895+
896+
Assert.Collection(forgetTwoFactorClient.GetMeasurementSnapshot(),
897+
m => MetricsHelpers.AssertContainsTags(m.Tags,
898+
[
899+
KeyValuePair.Create<string, object>("aspnetcore.identity.user_type", "Microsoft.AspNetCore.Identity.Test.PocoUser"),
900+
KeyValuePair.Create<string, object>("aspnetcore.identity.authentication_scheme", "Identity.TwoFactorRememberMe"),
901+
KeyValuePair.Create<string, object>("error.type", "System.InvalidOperationException"),
902+
]));
903+
}
904+
872905
[Theory]
873906
[InlineData(true)]
874907
[InlineData(false)]

src/Identity/test/Identity.Test/UserManagerTest.cs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,58 @@ public async Task CreateCallsUpdateEmailStore()
124124
}
125125

126126
[Fact]
127-
public async Task DeleteCallsStore()
127+
public async Task DeleteCallsStore_Success()
128128
{
129129
// Setup
130+
var testMeterFactory = new TestMeterFactory();
131+
using var deleteUser = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.delete_user");
132+
130133
var store = new Mock<IUserStore<PocoUser>>();
131134
var user = new PocoUser { UserName = "Foo" };
132135
store.Setup(s => s.DeleteAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable();
133-
var userManager = MockHelpers.TestUserManager(store.Object);
136+
var userManager = MockHelpers.TestUserManager(store.Object, meterFactory: testMeterFactory);
134137

135138
// Act
136139
var result = await userManager.DeleteAsync(user);
137140

138141
// Assert
139142
Assert.True(result.Succeeded);
140143
store.VerifyAll();
144+
145+
Assert.Collection(deleteUser.GetMeasurementSnapshot(),
146+
m => MetricsHelpers.AssertContainsTags(m.Tags,
147+
[
148+
KeyValuePair.Create<string, object>("aspnetcore.identity.user_type", "Microsoft.AspNetCore.Identity.Test.PocoUser"),
149+
KeyValuePair.Create<string, object>("aspnetcore.identity.result", "success")
150+
]));
151+
}
152+
153+
[Fact]
154+
public async Task DeleteCallsStore_Failure()
155+
{
156+
// Setup
157+
var testMeterFactory = new TestMeterFactory();
158+
using var deleteUser = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.delete_user");
159+
160+
var store = new Mock<IUserStore<PocoUser>>();
161+
var user = new PocoUser { UserName = "Foo" };
162+
store.Setup(s => s.DeleteAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Failed(new IdentityErrorDescriber().ConcurrencyFailure())).Verifiable();
163+
var userManager = MockHelpers.TestUserManager(store.Object, meterFactory: testMeterFactory);
164+
165+
// Act
166+
var result = await userManager.DeleteAsync(user);
167+
168+
// Assert
169+
Assert.False(result.Succeeded);
170+
store.VerifyAll();
171+
172+
Assert.Collection(deleteUser.GetMeasurementSnapshot(),
173+
m => MetricsHelpers.AssertContainsTags(m.Tags,
174+
[
175+
KeyValuePair.Create<string, object>("aspnetcore.identity.user_type", "Microsoft.AspNetCore.Identity.Test.PocoUser"),
176+
KeyValuePair.Create<string, object>("aspnetcore.identity.result", "failure"),
177+
KeyValuePair.Create<string, object>("aspnetcore.identity.result_error_code", "ConcurrencyFailure")
178+
]));
141179
}
142180

143181
[Fact]
@@ -591,6 +629,7 @@ public async Task CheckPasswordWillRehashPasswordWhenNeeded()
591629
var testMeterFactory = new TestMeterFactory();
592630
using var updateUser = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.update_user");
593631
using var checkPassword = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.check_password");
632+
using var verifyPassword = new MetricCollector<long>(testMeterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.verify_password");
594633

595634
var store = new Mock<IUserPasswordStore<PocoUser>>();
596635
var hasher = new Mock<IPasswordHasher<PocoUser>>();
@@ -628,6 +667,11 @@ public async Task CheckPasswordWillRehashPasswordWhenNeeded()
628667
[
629668
KeyValuePair.Create<string, object>("aspnetcore.identity.user.password_result", "success_rehash_needed")
630669
]));
670+
Assert.Collection(verifyPassword.GetMeasurementSnapshot(),
671+
m => MetricsHelpers.AssertContainsTags(m.Tags,
672+
[
673+
KeyValuePair.Create<string, object>("aspnetcore.identity.user.password_result", "success_rehash_needed")
674+
]));
631675
}
632676

633677
[Fact]
@@ -1245,9 +1289,9 @@ public async Task ManagerPublicNullChecks()
12451289
async () => await manager.CreateAsync(new PocoUser(), null));
12461290
await Assert.ThrowsAsync<ArgumentNullException>("user", async () => await manager.UpdateAsync(null));
12471291
await Assert.ThrowsAsync<ArgumentNullException>("user", async () => await manager.DeleteAsync(null));
1248-
await Assert.ThrowsAsync<ArgumentNullException>("claim", async () => await manager.AddClaimAsync(null, null));
1249-
await Assert.ThrowsAsync<ArgumentNullException>("claim", async () => await manager.ReplaceClaimAsync(null, null, null));
1250-
await Assert.ThrowsAsync<ArgumentNullException>("claims", async () => await manager.AddClaimsAsync(null, null));
1292+
await Assert.ThrowsAsync<ArgumentNullException>("user", async () => await manager.AddClaimAsync(null, null));
1293+
await Assert.ThrowsAsync<ArgumentNullException>("user", async () => await manager.ReplaceClaimAsync(null, null, null));
1294+
await Assert.ThrowsAsync<ArgumentNullException>("user", async () => await manager.AddClaimsAsync(null, null));
12511295
await Assert.ThrowsAsync<ArgumentNullException>("userName", async () => await manager.FindByNameAsync(null));
12521296
await Assert.ThrowsAsync<ArgumentNullException>("login", async () => await manager.AddLoginAsync(null, null));
12531297
await Assert.ThrowsAsync<ArgumentNullException>("loginProvider",

0 commit comments

Comments
 (0)