1
0
mirror of https://github.com/bitwarden/server.git synced 2025-04-07 05:58:13 -05:00

First test of new command.

This commit is contained in:
jrmccannon 2025-02-21 12:04:11 -06:00
parent 6ec850e384
commit e10b7cc78f
No known key found for this signature in database
GPG Key ID: CF03F3DB01CE96A6
4 changed files with 118 additions and 4 deletions

View File

@ -73,6 +73,11 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
.Select(email => OrganizationUserInviteDto.Create(email, invite, request.Organization.OrganizationId))
);
if (invitesToSend.Any() is false)
{
return new Success<IEnumerable<OrganizationUser>>([]);
}
// Validate we can add those seats
var validationResult = await inviteUsersValidation.ValidateAsync(new InviteUserOrganizationValidationRequest
{

View File

@ -50,9 +50,13 @@ public class PasswordManagerSubscriptionUpdate
organizationDto.Plan.PasswordManager);
}
public static PasswordManagerSubscriptionUpdate Create(InviteUserOrganizationValidationRequest refined)
public static PasswordManagerSubscriptionUpdate Create(InviteUserOrganizationValidationRequest validationRequest)
{
return new PasswordManagerSubscriptionUpdate(refined.Organization.Seats, refined.Organization.MaxAutoScaleSeats,
refined.OccupiedPmSeats, refined.Invites.Length, refined.Organization.Plan.PasswordManager);
return new PasswordManagerSubscriptionUpdate(
validationRequest.Organization.Seats,
validationRequest.Organization.MaxAutoScaleSeats,
validationRequest.OccupiedPmSeats,
validationRequest.Invites.Length,
validationRequest.Organization.Plan.PasswordManager);
}
}

View File

@ -1,4 +1,5 @@
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
using Bit.Core.AdminConsole.Models.Business;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
using Bit.Core.Models.StaticStore;
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
@ -33,6 +34,17 @@ public class SecretsManagerSubscriptionUpdate
SecretsManagerPlan = plan;
}
public static SecretsManagerSubscriptionUpdate Create(OrganizationDto organizationDto, int occupiedSeats, int seatsToAdd, int passwordManagerSeatTotal)
{
return new SecretsManagerSubscriptionUpdate(organizationDto.UseSecretsManager,
organizationDto.SmSeats,
organizationDto.SmMaxAutoScaleSeats,
occupiedSeats,
seatsToAdd,
passwordManagerSeatTotal,
organizationDto.Plan.SecretsManager);
}
public static SecretsManagerSubscriptionUpdate Create(InviteUserOrganizationValidationRequest refined, PasswordManagerSubscriptionUpdate passwordManagerSubscriptionUpdate)
{
return new SecretsManagerSubscriptionUpdate(refined.Organization.UseSecretsManager,

View File

@ -0,0 +1,93 @@
using System.Net.Mail;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Models.Business;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
using Bit.Core.Entities;
using Bit.Core.Enums;
using Bit.Core.Models.Commands;
using Bit.Core.Models.Data;
using Bit.Core.Models.StaticStore;
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes;
using Microsoft.Extensions.Time.Testing;
using NSubstitute;
using Xunit;
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
[SutProviderCustomize]
public class InviteOrganizationUserCommandTests
{
[Theory]
[BitAutoData]
public async Task InviteScimOrganizationUserAsync_WhenEmailAlreadyExists_ThenNoInviteIsSentAndNoSeatsAreAdjusted(
MailAddress address,
Organization organization,
OrganizationUser user,
FakeTimeProvider timeProvider,
string externalId,
SutProvider<InviteOrganizationUsersCommand> sutProvider)
{
// Arrange
user.Email = address.Address;
var organizationDto = OrganizationDto.FromOrganization(organization);
var request = InviteScimOrganizationUserRequest.Create(
OrganizationUserSingleEmailInvite.Create(
user.Email,
[],
OrganizationUserType.User,
new Permissions(),
false),
organizationDto,
timeProvider.GetUtcNow(),
externalId
);
sutProvider.GetDependency<IOrganizationUserRepository>()
.SelectKnownEmailsAsync(organization.Id, Arg.Any<IEnumerable<string>>(), false)
.Returns([user.Email]);
var validationRequest = new InviteUserOrganizationValidationRequest
{
Invites = [],
Organization = organizationDto,
PerformedBy = Guid.Empty,
PerformedAt = request.PerformedAt,
OccupiedPmSeats = 0,
OccupiedSmSeats = 0,
PasswordManagerSubscriptionUpdate = PasswordManagerSubscriptionUpdate.Create(organizationDto, 0, 0),
SecretsManagerSubscriptionUpdate = SecretsManagerSubscriptionUpdate.Create(organizationDto, 0, 0, 0)
};
sutProvider.GetDependency<IInviteUsersValidation>()
.ValidateAsync(Arg.Any<InviteUserOrganizationValidationRequest>())
.Returns(new Valid<InviteUserOrganizationValidationRequest>(validationRequest));
// Act
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
// Assert
Assert.IsType<Success<OrganizationUser>>(result);
sutProvider.GetDependency<IPaymentService>()
.DidNotReceiveWithAnyArgs()
.AdjustSeatsAsync(Arg.Any<Organization>(), Arg.Any<Plan>(), Arg.Any<int>());
sutProvider.GetDependency<ISendOrganizationInvitesCommand>()
.DidNotReceiveWithAnyArgs()
.SendInvitesAsync(Arg.Any<SendInvitesRequest>());
sutProvider.GetDependency<IUpdateSecretsManagerSubscriptionCommand>()
.DidNotReceiveWithAnyArgs()
.UpdateSubscriptionAsync(Arg.Any<Core.Models.Business.SecretsManagerSubscriptionUpdate>());
}
}