mirror of
https://github.com/bitwarden/server.git
synced 2025-06-07 19:50:32 -05:00
Clean up
This commit is contained in:
parent
68a333c293
commit
79a0073a2c
@ -26,7 +26,6 @@ using Microsoft.AspNetCore.Identity;
|
|||||||
using Microsoft.Extensions.Caching.Distributed;
|
using Microsoft.Extensions.Caching.Distributed;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using NSubstitute;
|
using NSubstitute;
|
||||||
using NSubstitute.ReceivedExtensions;
|
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Bit.Core.Test.Services;
|
namespace Bit.Core.Test.Services;
|
||||||
@ -167,9 +166,13 @@ public class UserServiceTests
|
|||||||
[Theory]
|
[Theory]
|
||||||
[BitAutoData(DeviceType.UnknownBrowser, "Unknown Browser")]
|
[BitAutoData(DeviceType.UnknownBrowser, "Unknown Browser")]
|
||||||
[BitAutoData(DeviceType.Android, "Android")]
|
[BitAutoData(DeviceType.Android, "Android")]
|
||||||
public async Task SendNewDeviceVerificationEmailAsync_DeviceMatches(DeviceType deviceType, string deviceTypeName, SutProvider<UserService> sutProvider, User user)
|
public async Task SendNewDeviceVerificationEmailAsync_DeviceMatches(DeviceType deviceType, string deviceTypeName,
|
||||||
|
User user)
|
||||||
{
|
{
|
||||||
// WithFakeTokenProvider(sutProvider, user);
|
var sutProvider = new SutProvider<UserService>()
|
||||||
|
.WithFakeTokenProvider(user)
|
||||||
|
.Create();
|
||||||
|
|
||||||
var context = sutProvider.GetDependency<ICurrentContext>();
|
var context = sutProvider.GetDependency<ICurrentContext>();
|
||||||
context.DeviceType = deviceType;
|
context.DeviceType = deviceType;
|
||||||
context.IpAddress = "1.1.1.1";
|
context.IpAddress = "1.1.1.1";
|
||||||
@ -182,9 +185,12 @@ public class UserServiceTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Theory, BitAutoData]
|
[Theory, BitAutoData]
|
||||||
public async Task SendNewDeviceVerificationEmailAsync_NullDeviceTypeShouldSendUnkownBrowserType(SutProvider<UserService> sutProvider, User user)
|
public async Task SendNewDeviceVerificationEmailAsync_NullDeviceTypeShouldSendUnkownBrowserType(User user)
|
||||||
{
|
{
|
||||||
// WithFakeTokenProvider(sutProvider, user);
|
var sutProvider = new SutProvider<UserService>()
|
||||||
|
.WithFakeTokenProvider(user)
|
||||||
|
.Create();
|
||||||
|
|
||||||
var context = sutProvider.GetDependency<ICurrentContext>();
|
var context = sutProvider.GetDependency<ICurrentContext>();
|
||||||
context.DeviceType = null;
|
context.DeviceType = null;
|
||||||
context.IpAddress = "1.1.1.1";
|
context.IpAddress = "1.1.1.1";
|
||||||
@ -259,29 +265,21 @@ public class UserServiceTests
|
|||||||
// Arrange
|
// Arrange
|
||||||
SetupUserAndDevice(user, shouldHavePassword);
|
SetupUserAndDevice(user, shouldHavePassword);
|
||||||
|
|
||||||
|
var sutProvider = new SutProvider<UserService>()
|
||||||
|
.WithUserPasswordStore()
|
||||||
|
.WithFakeTokenProvider(user)
|
||||||
|
.Create()
|
||||||
|
.FixPasswordHasherBug();
|
||||||
|
|
||||||
// Setup the fake password verification
|
// Setup the fake password verification
|
||||||
var substitutedUserPasswordStore = Substitute.For<IUserPasswordStore<User>>();
|
sutProvider.GetDependency<IUserPasswordStore<User>>()
|
||||||
substitutedUserPasswordStore
|
|
||||||
.GetPasswordHashAsync(user, Arg.Any<CancellationToken>())
|
.GetPasswordHashAsync(user, Arg.Any<CancellationToken>())
|
||||||
.Returns(Task.FromResult("hashed_test_password"));
|
.Returns(Task.FromResult("hashed_test_password"));
|
||||||
|
|
||||||
var sutProvider = new SutProvider<UserService>()
|
|
||||||
// IUserPasswordStore must be registered under the IUserStore parameter
|
|
||||||
.SetDependency<IUserStore<User>>(substitutedUserPasswordStore)
|
|
||||||
.WithFakeTokenProvider(user)
|
|
||||||
.Create();
|
|
||||||
|
|
||||||
sutProvider.GetDependency<IPasswordHasher<User>>()
|
sutProvider.GetDependency<IPasswordHasher<User>>()
|
||||||
.VerifyHashedPassword(user, "hashed_test_password", "test_password")
|
.VerifyHashedPassword(user, "hashed_test_password", "test_password")
|
||||||
.Returns(PasswordVerificationResult.Success);
|
.Returns(PasswordVerificationResult.Success);
|
||||||
|
|
||||||
// HACK: reassign public property on base class after it's overwritten by autofixture
|
|
||||||
sutProvider.Sut.PasswordHasher = sutProvider.GetDependency<IPasswordHasher<User>>();
|
|
||||||
|
|
||||||
// DEBUG: check the public property on the base class matches the mock in SutProvider.
|
|
||||||
// If you remove the HACK above, this will fail (and so will the rest of the test).
|
|
||||||
Assert.Equal(sutProvider.Sut.PasswordHasher, sutProvider.GetDependency<IPasswordHasher<User>>());
|
|
||||||
|
|
||||||
var actualIsVerified = await sutProvider.Sut.VerifySecretAsync(user, secret);
|
var actualIsVerified = await sutProvider.Sut.VerifySecretAsync(user, secret);
|
||||||
|
|
||||||
Assert.Equal(expectedIsVerified, actualIsVerified);
|
Assert.Equal(expectedIsVerified, actualIsVerified);
|
||||||
@ -493,25 +491,28 @@ public class UserServiceTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Theory, BitAutoData]
|
[Theory, BitAutoData]
|
||||||
public async Task ResendNewDeviceVerificationEmail_SendsToken_Success(
|
public async Task ResendNewDeviceVerificationEmail_SendsToken_Success(User user)
|
||||||
SutProvider<UserService> sutProvider, User user)
|
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var testPassword = "test_password";
|
var testPassword = "test_password";
|
||||||
SetupUserAndDevice(user, true);
|
SetupUserAndDevice(user, true);
|
||||||
|
|
||||||
|
var sutProvider = new SutProvider<UserService>()
|
||||||
|
.WithUserPasswordStore()
|
||||||
|
.WithFakeTokenProvider(user)
|
||||||
|
.Create()
|
||||||
|
.FixPasswordHasherBug();
|
||||||
|
|
||||||
// Setup the fake password verification
|
// Setup the fake password verification
|
||||||
var substitutedUserPasswordStore = Substitute.For<IUserPasswordStore<User>>();
|
sutProvider
|
||||||
substitutedUserPasswordStore
|
.GetDependency<IUserPasswordStore<User>>()
|
||||||
.GetPasswordHashAsync(user, Arg.Any<CancellationToken>())
|
.GetPasswordHashAsync(user, Arg.Any<CancellationToken>())
|
||||||
.Returns((ci) =>
|
.Returns((ci) =>
|
||||||
{
|
{
|
||||||
return Task.FromResult("hashed_test_password");
|
return Task.FromResult("hashed_test_password");
|
||||||
});
|
});
|
||||||
|
|
||||||
sutProvider.SetDependency<IUserStore<User>>(substitutedUserPasswordStore, "store");
|
sutProvider.GetDependency<IPasswordHasher<User>>()
|
||||||
|
|
||||||
sutProvider.GetDependency<IPasswordHasher<User>>("passwordHasher")
|
|
||||||
.VerifyHashedPassword(user, "hashed_test_password", testPassword)
|
.VerifyHashedPassword(user, "hashed_test_password", testPassword)
|
||||||
.Returns((ci) =>
|
.Returns((ci) =>
|
||||||
{
|
{
|
||||||
@ -526,10 +527,7 @@ public class UserServiceTests
|
|||||||
context.DeviceType = DeviceType.Android;
|
context.DeviceType = DeviceType.Android;
|
||||||
context.IpAddress = "1.1.1.1";
|
context.IpAddress = "1.1.1.1";
|
||||||
|
|
||||||
// HACK: SutProvider is being weird about not injecting the IPasswordHasher that I configured
|
await sutProvider.Sut.ResendNewDeviceVerificationEmail(user.Email, testPassword);
|
||||||
var sut = sutProvider.Sut;
|
|
||||||
|
|
||||||
await sut.ResendNewDeviceVerificationEmail(user.Email, testPassword);
|
|
||||||
|
|
||||||
await sutProvider.GetDependency<IMailService>()
|
await sutProvider.GetDependency<IMailService>()
|
||||||
.Received(1)
|
.Received(1)
|
||||||
@ -721,4 +719,30 @@ public static class UserServiceSutProviderExtensions
|
|||||||
|
|
||||||
return sutProvider;
|
return sutProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static SutProvider<UserService> WithUserPasswordStore(this SutProvider<UserService> sutProvider)
|
||||||
|
{
|
||||||
|
var substitutedUserPasswordStore = Substitute.For<IUserPasswordStore<User>>();
|
||||||
|
|
||||||
|
// IUserPasswordStore must be registered under the IUserStore parameter to be properly injected
|
||||||
|
sutProvider.SetDependency<IUserStore<User>>(substitutedUserPasswordStore);
|
||||||
|
|
||||||
|
// also store it under its own type for retrieval and configuration
|
||||||
|
sutProvider.SetDependency(substitutedUserPasswordStore);
|
||||||
|
|
||||||
|
return sutProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is a hack: when autofixture initializes the sut in sutProvider, it overwrites the public
|
||||||
|
/// PasswordHasher property with a new substitute, so it loses the configured sutProvider mock.
|
||||||
|
/// This doesn't usually happen because our dependencies are not usually public.
|
||||||
|
/// Call this AFTER SutProvider.Create().
|
||||||
|
/// </summary>
|
||||||
|
public static SutProvider<UserService> FixPasswordHasherBug(this SutProvider<UserService> sutProvider)
|
||||||
|
{
|
||||||
|
// Get the configured sutProvider mock and assign it back to the public property in the base class
|
||||||
|
sutProvider.Sut.PasswordHasher = sutProvider.GetDependency<IPasswordHasher<User>>();
|
||||||
|
return sutProvider;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user