mirror of
https://github.com/bitwarden/server.git
synced 2025-07-02 08:32:50 -05:00
Merge branch 'main' into jmccannon/ac/pm-16811-scim-invite-optimization
# Conflicts: # src/Core/Constants.cs
This commit is contained in:
@ -0,0 +1,147 @@
|
||||
using Bit.Core.AdminConsole.Entities;
|
||||
using Bit.Core.AdminConsole.OrganizationFeatures.Organizations;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Repositories;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Test.Common.AutoFixture;
|
||||
using Bit.Test.Common.AutoFixture.Attributes;
|
||||
using NSubstitute;
|
||||
using Xunit;
|
||||
|
||||
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.Organizations;
|
||||
|
||||
[SutProviderCustomize]
|
||||
public class OrganizationEnableCommandTests
|
||||
{
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WhenOrganizationDoesNotExist_DoesNothing(
|
||||
Guid organizationId,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organizationId)
|
||||
.Returns((Organization)null);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organizationId);
|
||||
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.DidNotReceive()
|
||||
.ReplaceAsync(Arg.Any<Organization>());
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.DidNotReceive()
|
||||
.UpsertOrganizationAbilityAsync(Arg.Any<Organization>());
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WhenOrganizationAlreadyEnabled_DoesNothing(
|
||||
Organization organization,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
organization.Enabled = true;
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organization.Id)
|
||||
.Returns(organization);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organization.Id);
|
||||
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.DidNotReceive()
|
||||
.ReplaceAsync(Arg.Any<Organization>());
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.DidNotReceive()
|
||||
.UpsertOrganizationAbilityAsync(Arg.Any<Organization>());
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WhenOrganizationDisabled_EnablesAndSaves(
|
||||
Organization organization,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
organization.Enabled = false;
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organization.Id)
|
||||
.Returns(organization);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organization.Id);
|
||||
|
||||
Assert.True(organization.Enabled);
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.Received(1)
|
||||
.ReplaceAsync(organization);
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.Received(1)
|
||||
.UpsertOrganizationAbilityAsync(organization);
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WithExpiration_WhenOrganizationHasNoGateway_DoesNothing(
|
||||
Organization organization,
|
||||
DateTime expirationDate,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
organization.Enabled = false;
|
||||
organization.Gateway = null;
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organization.Id)
|
||||
.Returns(organization);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organization.Id, expirationDate);
|
||||
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.DidNotReceive()
|
||||
.ReplaceAsync(Arg.Any<Organization>());
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.DidNotReceive()
|
||||
.UpsertOrganizationAbilityAsync(Arg.Any<Organization>());
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WithExpiration_WhenValid_EnablesAndSetsExpiration(
|
||||
Organization organization,
|
||||
DateTime expirationDate,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
organization.Enabled = false;
|
||||
organization.Gateway = GatewayType.Stripe;
|
||||
organization.RevisionDate = DateTime.UtcNow.AddDays(-1);
|
||||
var originalRevisionDate = organization.RevisionDate;
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organization.Id)
|
||||
.Returns(organization);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organization.Id, expirationDate);
|
||||
|
||||
Assert.True(organization.Enabled);
|
||||
Assert.Equal(expirationDate, organization.ExpirationDate);
|
||||
Assert.True(organization.RevisionDate > originalRevisionDate);
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.Received(1)
|
||||
.ReplaceAsync(organization);
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.Received(1)
|
||||
.UpsertOrganizationAbilityAsync(organization);
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task EnableAsync_WithoutExpiration_DoesNotUpdateRevisionDate(
|
||||
Organization organization,
|
||||
SutProvider<OrganizationEnableCommand> sutProvider)
|
||||
{
|
||||
organization.Enabled = false;
|
||||
var originalRevisionDate = organization.RevisionDate;
|
||||
sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.GetByIdAsync(organization.Id)
|
||||
.Returns(organization);
|
||||
|
||||
await sutProvider.Sut.EnableAsync(organization.Id);
|
||||
|
||||
Assert.True(organization.Enabled);
|
||||
Assert.Equal(originalRevisionDate, organization.RevisionDate);
|
||||
await sutProvider.GetDependency<IOrganizationRepository>()
|
||||
.Received(1)
|
||||
.ReplaceAsync(organization);
|
||||
await sutProvider.GetDependency<IApplicationCacheService>()
|
||||
.Received(1)
|
||||
.UpsertOrganizationAbilityAsync(organization);
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
using Bit.Core.AdminConsole.Models.Data.Organizations.Policies;
|
||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Implementations;
|
||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyRequirements;
|
||||
using Bit.Core.AdminConsole.Repositories;
|
||||
using Bit.Test.Common.AutoFixture.Attributes;
|
||||
using NSubstitute;
|
||||
using Xunit;
|
||||
|
||||
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.Policies;
|
||||
|
||||
[SutProviderCustomize]
|
||||
public class PolicyRequirementQueryTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests that the query correctly registers, retrieves and instantiates arbitrary IPolicyRequirements
|
||||
/// according to their provided CreateRequirement delegate.
|
||||
/// </summary>
|
||||
[Theory, BitAutoData]
|
||||
public async Task GetAsync_Works(Guid userId, Guid organizationId)
|
||||
{
|
||||
var policyRepository = Substitute.For<IPolicyRepository>();
|
||||
var factories = new List<RequirementFactory<IPolicyRequirement>>
|
||||
{
|
||||
// In prod this cast is handled when the CreateRequirement delegate is registered in DI
|
||||
(RequirementFactory<TestPolicyRequirement>)TestPolicyRequirement.Create
|
||||
};
|
||||
|
||||
var sut = new PolicyRequirementQuery(policyRepository, factories);
|
||||
policyRepository.GetPolicyDetailsByUserId(userId).Returns([
|
||||
new PolicyDetails
|
||||
{
|
||||
OrganizationId = organizationId
|
||||
}
|
||||
]);
|
||||
|
||||
var requirement = await sut.GetAsync<TestPolicyRequirement>(userId);
|
||||
Assert.Equal(organizationId, requirement.OrganizationId);
|
||||
}
|
||||
|
||||
[Theory, BitAutoData]
|
||||
public async Task GetAsync_ThrowsIfNoRequirementRegistered(Guid userId)
|
||||
{
|
||||
var policyRepository = Substitute.For<IPolicyRepository>();
|
||||
var sut = new PolicyRequirementQuery(policyRepository, []);
|
||||
|
||||
var exception = await Assert.ThrowsAsync<NotImplementedException>(()
|
||||
=> sut.GetAsync<TestPolicyRequirement>(userId));
|
||||
Assert.Contains("No Policy Requirement found", exception.Message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Intentionally simplified PolicyRequirement that just holds the Policy.OrganizationId for us to assert against.
|
||||
/// </summary>
|
||||
private class TestPolicyRequirement : IPolicyRequirement
|
||||
{
|
||||
public Guid OrganizationId { get; init; }
|
||||
public static TestPolicyRequirement Create(IEnumerable<PolicyDetails> policyDetails)
|
||||
=> new() { OrganizationId = policyDetails.Single().OrganizationId };
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user