1
0
mirror of https://github.com/bitwarden/server.git synced 2025-01-05 19:17:36 +01:00

Add test for validation, set up fake policy definitions

This commit is contained in:
Thomas Rittson 2024-10-04 15:39:36 +10:00
parent 9d75bcbc86
commit aa4c126d69
No known key found for this signature in database
GPG Key ID: CDDDA03861C35E27
3 changed files with 97 additions and 3 deletions

View File

@ -13,6 +13,13 @@ namespace Bit.Core.Test.AdminConsole.AutoFixture;
/// </summary>
public class PolicyServicevNextBuilder : ISpecimenBuilder
{
private readonly IEnumerable<IPolicyDefinition> _policyDefinitions;
public PolicyServicevNextBuilder(IEnumerable<IPolicyDefinition> policyDefinitions)
{
_policyDefinitions = policyDefinitions;
}
public object Create(object request, ISpecimenContext context)
{
var pi = request as ParameterInfo;
@ -21,17 +28,25 @@ public class PolicyServicevNextBuilder : ISpecimenBuilder
if (pi.Member.DeclaringType != typeof(PolicyServicevNext) ||
pi.ParameterType != typeof(IEnumerable<IPolicyDefinition>))
{
return new NoSpecimen();
}
return Array.Empty<IPolicyDefinition>();
return _policyDefinitions;
}
}
public class PolicyServicevNextCustomization : ICustomization
{
private readonly IEnumerable<IPolicyDefinition> _policyDefinitions;
public PolicyServicevNextCustomization(IEnumerable<IPolicyDefinition> policyDefinitions = null)
{
_policyDefinitions = policyDefinitions ?? new List<IPolicyDefinition>();
}
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(new PolicyServicevNextBuilder());
fixture.Customizations.Add(new PolicyServicevNextBuilder(_policyDefinitions));
}
}

View File

@ -0,0 +1,27 @@
using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Enums;
using Bit.Core.AdminConsole.OrganizationFeatures.Policies;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
namespace Bit.Core.Test.AdminConsole.Services;
public class FakeSingleOrgPolicyDefinition : IPolicyDefinition
{
public PolicyType Type => PolicyType.SingleOrg;
public IEnumerable<PolicyType> RequiredPolicies => Array.Empty<PolicyType>();
public readonly Func<Policy?, Policy, Task<string?>> ValidateAsyncMock = Substitute.For<Func<Policy, Policy, Task<string>>>();
public readonly Action<Policy?, Policy> OnSaveSideEffectsAsyncMock = Substitute.For<Action<Policy, Policy>>();
public Task<string>? ValidateAsync(Policy? currentPolicy, Policy modifiedPolicy)
{
return ValidateAsyncMock(currentPolicy, modifiedPolicy);
}
public Task OnSaveSideEffectsAsync(Policy? currentPolicy, Policy modifiedPolicy)
{
OnSaveSideEffectsAsyncMock(currentPolicy, modifiedPolicy);
return Task.FromResult(0);
}
}

View File

@ -1,4 +1,7 @@
using Bit.Core.AdminConsole.Entities;
using AutoFixture;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Enums;
using Bit.Core.AdminConsole.OrganizationFeatures.Policies;
using Bit.Core.AdminConsole.Repositories;
using Bit.Core.AdminConsole.Services.Implementations;
using Bit.Core.Exceptions;
@ -7,7 +10,9 @@ using Bit.Core.Services;
using Bit.Core.Test.AdminConsole.AutoFixture;
using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes;
using AdminConsoleFixtures = Bit.Core.Test.AdminConsole.AutoFixture;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
using Xunit;
namespace Bit.Core.Test.AdminConsole.Services;
@ -69,4 +74,51 @@ public class PolicyServicevNextTests
.DidNotReceiveWithAnyArgs()
.LogPolicyEventAsync(default, default, default);
}
[Theory, BitAutoData]
public async Task SaveAsync_ThrowsOnValidationError(
[AdminConsoleFixtures.Policy(PolicyType.SingleOrg)] Policy policy, SutProvider<PolicyServicevNext> sutProvider)
{
var fakePolicyDefinition = new FakeSingleOrgPolicyDefinition();
fakePolicyDefinition.ValidateAsyncMock(null, policy).Returns("Validation error!");
sutProvider = RegisterPolicyDefinitions([fakePolicyDefinition]);
sutProvider.GetDependency<IApplicationCacheService>()
.GetOrganizationAbilityAsync(policy.OrganizationId)
.Returns(new OrganizationAbility
{
Id = policy.OrganizationId,
UsePolicies = true
});
sutProvider.GetDependency<IPolicyRepository>().GetManyByOrganizationIdAsync(policy.OrganizationId).Returns([]);
var badRequestException = await Assert.ThrowsAsync<BadRequestException>(
() => sutProvider.Sut.SaveAsync(policy,
Substitute.For<IUserService>(),
Substitute.For<IOrganizationService>(),
Guid.NewGuid()));
Assert.Contains("Validation error!", badRequestException.Message, StringComparison.OrdinalIgnoreCase);
await sutProvider.GetDependency<IPolicyRepository>()
.DidNotReceiveWithAnyArgs()
.UpsertAsync(default);
await sutProvider.GetDependency<IEventService>()
.DidNotReceiveWithAnyArgs()
.LogPolicyEventAsync(default, default, default);
}
/// <summary>
/// Returns a new SutProvider with the PolicyDefinitions registered in the Sut.
/// </summary>
private SutProvider<PolicyServicevNext> RegisterPolicyDefinitions(IEnumerable<IPolicyDefinition> policyDefinitions)
{
var fixture = new Fixture();
fixture.Customizations.Add(new PolicyServicevNextBuilder(policyDefinitions));
var sutProvider = new SutProvider<PolicyServicevNext>(fixture);
sutProvider.Create();
return sutProvider;
}
}