#nullable enable using System.Security.Claims; using Bit.Api.KeyManagement.Controllers; using Bit.Api.KeyManagement.Models.Requests; using Bit.Core; using Bit.Core.Auth.Models.Data; using Bit.Core.Entities; using Bit.Core.Exceptions; using Bit.Core.KeyManagement.Commands.Interfaces; using Bit.Core.KeyManagement.Models.Data; using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using NSubstitute.ReturnsExtensions; using Xunit; namespace Bit.Api.Test.KeyManagement.Controllers; [ControllerCustomize(typeof(AccountsKeyManagementController))] [SutProviderCustomize] [JsonDocumentCustomize] public class AccountsKeyManagementControllerTests { [Theory] [BitAutoData] public async Task RegenerateKeysAsync_FeatureFlagOff_Throws( SutProvider sutProvider, KeyRegenerationRequestModel data) { sutProvider.GetDependency().IsEnabled(Arg.Is(FeatureFlagKeys.PrivateKeyRegeneration)) .Returns(false); sutProvider.GetDependency().GetUserByPrincipalAsync(Arg.Any()).ReturnsNull(); await Assert.ThrowsAsync(() => sutProvider.Sut.RegenerateKeysAsync(data)); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .GetManyByUserAsync(Arg.Any()); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .GetManyDetailsByGranteeIdAsync(Arg.Any()); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .RegenerateKeysAsync(Arg.Any(), Arg.Any>(), Arg.Any>()); } [Theory] [BitAutoData] public async Task RegenerateKeysAsync_UserNull_Throws(SutProvider sutProvider, KeyRegenerationRequestModel data) { sutProvider.GetDependency().IsEnabled(Arg.Is(FeatureFlagKeys.PrivateKeyRegeneration)) .Returns(true); sutProvider.GetDependency().GetUserByPrincipalAsync(Arg.Any()).ReturnsNull(); await Assert.ThrowsAsync(() => sutProvider.Sut.RegenerateKeysAsync(data)); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .GetManyByUserAsync(Arg.Any()); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .GetManyDetailsByGranteeIdAsync(Arg.Any()); await sutProvider.GetDependency().ReceivedWithAnyArgs(0) .RegenerateKeysAsync(Arg.Any(), Arg.Any>(), Arg.Any>()); } [Theory] [BitAutoData] public async Task RegenerateKeysAsync_Success(SutProvider sutProvider, KeyRegenerationRequestModel data, User user, ICollection orgUsers, ICollection accessDetails) { sutProvider.GetDependency().IsEnabled(Arg.Is(FeatureFlagKeys.PrivateKeyRegeneration)) .Returns(true); sutProvider.GetDependency().GetUserByPrincipalAsync(Arg.Any()).Returns(user); sutProvider.GetDependency().GetManyByUserAsync(Arg.Is(user.Id)).Returns(orgUsers); sutProvider.GetDependency().GetManyDetailsByGranteeIdAsync(Arg.Is(user.Id)) .Returns(accessDetails); await sutProvider.Sut.RegenerateKeysAsync(data); await sutProvider.GetDependency().Received(1) .GetManyByUserAsync(Arg.Is(user.Id)); await sutProvider.GetDependency().Received(1) .GetManyDetailsByGranteeIdAsync(Arg.Is(user.Id)); await sutProvider.GetDependency().Received(1) .RegenerateKeysAsync( Arg.Is(u => u.UserId == user.Id && u.PublicKey == data.UserPublicKey && u.UserKeyEncryptedPrivateKey == data.UserKeyEncryptedUserPrivateKey), Arg.Is(orgUsers), Arg.Is(accessDetails)); } }