using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.OrganizationFeatures.Groups.Interfaces; using Bit.Core.Repositories; using Bit.Scim.Context; using Bit.Scim.Groups; using Bit.Scim.Models; using Bit.Scim.Utilities; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.Helpers; using NSubstitute; using Xunit; namespace Bit.Scim.Test.Groups; [SutProviderCustomize] public class PostGroupCommandTests { [Theory] [BitAutoData] public async Task PostGroup_Success(SutProvider sutProvider, string displayName, string externalId, Organization organization, ICollection groups) { var scimGroupRequestModel = new ScimGroupRequestModel { DisplayName = displayName, ExternalId = externalId, Members = new List(), Schemas = new List { ScimConstants.Scim2SchemaUser } }; var expectedResult = new Group { OrganizationId = organization.Id, Name = displayName, ExternalId = externalId, }; sutProvider.GetDependency() .GetManyByOrganizationIdAsync(organization.Id) .Returns(groups); var group = await sutProvider.Sut.PostGroupAsync(organization, scimGroupRequestModel); await sutProvider.GetDependency().Received(1).CreateGroupAsync(group, organization, EventSystemUser.SCIM, null); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs().UpdateUsersAsync(default, default); AssertHelper.AssertPropertyEqual(expectedResult, group, "Id", "CreationDate", "RevisionDate"); } [Theory] [BitAutoData] public async Task PostGroup_WithMembers_Success(SutProvider sutProvider, string displayName, string externalId, Organization organization, ICollection groups, IEnumerable membersUserIds) { var scimGroupRequestModel = new ScimGroupRequestModel { DisplayName = displayName, ExternalId = externalId, Members = membersUserIds.Select(uid => new ScimGroupRequestModel.GroupMembersModel { Value = uid.ToString() }).ToList(), Schemas = new List { ScimConstants.Scim2SchemaUser } }; var expectedResult = new Group { OrganizationId = organization.Id, Name = displayName, ExternalId = externalId }; sutProvider.GetDependency() .GetManyByOrganizationIdAsync(organization.Id) .Returns(groups); sutProvider.GetDependency() .RequestScimProvider .Returns(Core.Enums.ScimProviderType.Okta); var group = await sutProvider.Sut.PostGroupAsync(organization, scimGroupRequestModel); await sutProvider.GetDependency().Received(1).CreateGroupAsync(group, organization, EventSystemUser.SCIM, null); await sutProvider.GetDependency().Received(1).UpdateUsersAsync(Arg.Any(), Arg.Is>(arg => arg.All(id => membersUserIds.Contains(id)))); AssertHelper.AssertPropertyEqual(expectedResult, group, "Id", "CreationDate", "RevisionDate"); } [Theory] [BitAutoData((string)null)] [BitAutoData("")] [BitAutoData(" ")] public async Task PostGroup_NullDisplayName_Throws(string displayName, SutProvider sutProvider, Organization organization) { var scimGroupRequestModel = new ScimGroupRequestModel { DisplayName = displayName, ExternalId = Guid.NewGuid().ToString(), Members = new List(), Schemas = new List { ScimConstants.Scim2SchemaUser } }; await Assert.ThrowsAsync(async () => await sutProvider.Sut.PostGroupAsync(organization, scimGroupRequestModel)); } [Theory] [BitAutoData] public async Task PostGroup_ExistingExternalId_Throws(string displayName, SutProvider sutProvider, Organization organization, ICollection groups) { var scimGroupRequestModel = new ScimGroupRequestModel { DisplayName = displayName, ExternalId = groups.First().ExternalId, Members = new List(), Schemas = new List { ScimConstants.Scim2SchemaUser } }; sutProvider.GetDependency() .GetManyByOrganizationIdAsync(organization.Id) .Returns(groups); await Assert.ThrowsAsync(async () => await sutProvider.Sut.PostGroupAsync(organization, scimGroupRequestModel)); } }