1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-07 02:52:50 -05:00

Merge branch 'main' into jmccannon/ac/pm-16811-scim-invite-optimization

# Conflicts:
#	src/Core/AdminConsole/Services/Implementations/OrganizationService.cs
#	test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepositoryTests.cs
This commit is contained in:
jrmccannon
2025-03-05 15:24:13 -06:00
272 changed files with 16059 additions and 1921 deletions

View File

@ -306,4 +306,81 @@ public class OrganizationDomainRepositoryTests
var expectedDomain = domains.FirstOrDefault(domain => domain.DomainName == organizationDomain.DomainName);
Assert.Null(expectedDomain);
}
[DatabaseTheory, DatabaseData]
public async Task GetVerifiedDomainsByOrganizationIdsAsync_ShouldVerifiedDomainsMatchesOrganizationIds(
IOrganizationRepository organizationRepository,
IOrganizationDomainRepository organizationDomainRepository)
{
// Arrange
var guid1 = Guid.NewGuid();
var guid2 = Guid.NewGuid();
var organization1 = await organizationRepository.CreateAsync(new Organization
{
Name = $"Test Org {guid1}",
BillingEmail = $"test+{guid1}@example.com",
Plan = "Test",
PrivateKey = "privatekey",
});
var organization1Domain1 = new OrganizationDomain
{
OrganizationId = organization1.Id,
DomainName = $"domain1+{guid1}@example.com",
Txt = "btw+12345"
};
const int arbitraryNextIteration = 1;
organization1Domain1.SetNextRunDate(arbitraryNextIteration);
organization1Domain1.SetVerifiedDate();
await organizationDomainRepository.CreateAsync(organization1Domain1);
var organization1Domain2 = new OrganizationDomain
{
OrganizationId = organization1.Id,
DomainName = $"domain2+{guid1}@example.com",
Txt = "btw+12345"
};
organization1Domain2.SetNextRunDate(arbitraryNextIteration);
await organizationDomainRepository.CreateAsync(organization1Domain2);
var organization2 = await organizationRepository.CreateAsync(new Organization
{
Name = $"Test Org {guid2}",
BillingEmail = $"test+{guid2}@example.com",
Plan = "Test",
PrivateKey = "privatekey",
});
var organization2Domain1 = new OrganizationDomain
{
OrganizationId = organization2.Id,
DomainName = $"domain+{guid2}@example.com",
Txt = "btw+12345"
};
organization2Domain1.SetVerifiedDate();
organization2Domain1.SetNextRunDate(arbitraryNextIteration);
await organizationDomainRepository.CreateAsync(organization2Domain1);
// Act
var domains = await organizationDomainRepository.GetVerifiedDomainsByOrganizationIdsAsync(new[] { organization1.Id });
// Assert
var expectedDomain = domains.FirstOrDefault(domain => domain.DomainName == organization1Domain1.DomainName);
Assert.NotNull(expectedDomain);
var unverifiedDomain = domains.FirstOrDefault(domain => domain.DomainName == organization1Domain2.DomainName);
var otherOrganizationDomain = domains.FirstOrDefault(domain => domain.DomainName == organization2Domain1.DomainName);
Assert.Null(otherOrganizationDomain);
Assert.Null(unverifiedDomain);
}
}

View File

@ -359,6 +359,75 @@ public class OrganizationUserRepositoryTests
Assert.Equal(orgUser1.Id, responseModel.Single().Id);
}
[DatabaseTheory, DatabaseData]
public async Task CreateManyAsync_NoId_Works(IOrganizationRepository organizationRepository,
IUserRepository userRepository,
IOrganizationUserRepository organizationUserRepository)
{
// Arrange
var user1 = await userRepository.CreateTestUserAsync("user1");
var user2 = await userRepository.CreateTestUserAsync("user2");
var user3 = await userRepository.CreateTestUserAsync("user3");
List<User> users = [user1, user2, user3];
var org = await organizationRepository.CreateAsync(new Organization
{
Name = $"test-{Guid.NewGuid()}",
BillingEmail = "billing@example.com", // TODO: EF does not enforce this being NOT NULL
Plan = "Test", // TODO: EF does not enforce this being NOT NULl
});
var orgUsers = users.Select(u => new OrganizationUser
{
OrganizationId = org.Id,
UserId = u.Id,
Status = OrganizationUserStatusType.Confirmed,
Type = OrganizationUserType.Owner
});
var createdOrgUserIds = await organizationUserRepository.CreateManyAsync(orgUsers);
var readOrgUsers = await organizationUserRepository.GetManyByOrganizationAsync(org.Id, null);
var readOrgUserIds = readOrgUsers.Select(ou => ou.Id);
Assert.Equal(createdOrgUserIds.ToHashSet(), readOrgUserIds.ToHashSet());
}
[DatabaseTheory, DatabaseData]
public async Task CreateManyAsync_WithId_Works(IOrganizationRepository organizationRepository,
IUserRepository userRepository,
IOrganizationUserRepository organizationUserRepository)
{
// Arrange
var user1 = await userRepository.CreateTestUserAsync("user1");
var user2 = await userRepository.CreateTestUserAsync("user2");
var user3 = await userRepository.CreateTestUserAsync("user3");
List<User> users = [user1, user2, user3];
var org = await organizationRepository.CreateAsync(new Organization
{
Name = $"test-{Guid.NewGuid()}",
BillingEmail = "billing@example.com", // TODO: EF does not enforce this being NOT NULL
Plan = "Test", // TODO: EF does not enforce this being NOT NULl
});
var orgUsers = users.Select(u => new OrganizationUser
{
Id = CoreHelpers.GenerateComb(), // generate ID ahead of time
OrganizationId = org.Id,
UserId = u.Id,
Status = OrganizationUserStatusType.Confirmed,
Type = OrganizationUserType.Owner
});
var createdOrgUserIds = await organizationUserRepository.CreateManyAsync(orgUsers);
var readOrgUsers = await organizationUserRepository.GetManyByOrganizationAsync(org.Id, null);
var readOrgUserIds = readOrgUsers.Select(ou => ou.Id);
Assert.Equal(createdOrgUserIds.ToHashSet(), readOrgUserIds.ToHashSet());
}
[DatabaseTheory, DatabaseData]
public async Task CreateManyAsync_WithCollectionAndGroup_SaveSuccessfully(
IOrganizationUserRepository organizationUserRepository,