From 4c82da39079427db54f0ccf9df63e78054e09995 Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Wed, 15 Apr 2026 14:40:45 -0500 Subject: [PATCH 1/2] This wraps the delete method in a retry loop in order to protect the delete calls when cleaning up test data. --- .../AdminConsole/OrganizationTestHelpers.cs | 41 ++++++++++++++++++- .../CollectionRepositoryCreateTests.cs | 4 +- .../CollectionRepositoryReplaceTests.cs | 6 +-- .../CreateDefaultCollectionsSharedTests.cs | 2 +- .../OrganizationRepositoryTests.cs | 14 +++---- ...onfirmedAcceptedDetailsByUserAsyncTests.cs | 14 +++---- .../OrganizationUserRepositoryTests.cs | 6 +-- ...ManyConfirmedAcceptedByUserIdAsyncTests.cs | 14 +++---- ...PolicyDetailsByOrganizationIdAsyncTests.cs | 22 +++++----- ...PolicyDetailsByUserIdAndPolicyTypeTests.cs | 20 ++++----- ...olicyDetailsByUserIdsAndPolicyTypeTests.cs | 14 +++---- .../Repositories/CipherRepositoryTests.cs | 3 +- .../CollectionCipherRepositoryTests.cs | 3 +- 13 files changed, 101 insertions(+), 62 deletions(-) diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs b/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs index ac918fd453c1..bb52b14f6e02 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs @@ -4,6 +4,8 @@ using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Repositories; +using Bit.Core.Utilities; +using Microsoft.Data.SqlClient; namespace Bit.Infrastructure.IntegrationTest.AdminConsole; @@ -16,7 +18,7 @@ public static class OrganizationTestHelpers { public static Task CreateTestUserAsync(this IUserRepository userRepository, string identifier = "test") { - var id = Guid.NewGuid(); + var id = CoreHelpers.GenerateComb(); return userRepository.CreateAsync(new User { Id = id, @@ -34,7 +36,7 @@ public static Task CreateTestOrganizationAsync(this IOrganizationR int? seatCount = null, string identifier = "test") { - var id = Guid.NewGuid(); + var id = CoreHelpers.GenerateComb(); return organizationRepository.CreateAsync(new Organization { Name = $"{identifier}-{id}", @@ -181,6 +183,41 @@ public static Task CreateTestCollectionAsync( Name = $"{identifier} {Guid.NewGuid()}" }); + /// + /// Deletes an organization with retry logic for SQL Server deadlocks (error 1205). + /// Use this instead of in test cleanup + /// to avoid deadlocks when tests run in parallel. + /// + public static async Task SafeDeleteAsync(this IOrganizationRepository repo, Organization org, int maxRetries = 3) + { + for (var attempt = 0; ; attempt++) + { + try + { + await repo.DeleteAsync(org); + return; + } + catch (Exception ex) when (attempt < maxRetries && IsDeadlock(ex)) + { + await Task.Delay(Random.Shared.Next(50, 200)); + } + } + } + + private static bool IsDeadlock(Exception ex) + { + var current = ex; + while (current != null) + { + if (current is SqlException { Number: 1205 }) + { + return true; + } + current = current.InnerException; + } + return false; + } + public static Task CreateTestOrganizationInviteLinkAsync( this IOrganizationInviteLinkRepository repository, Organization organization, diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs index 8a51f201dc73..d8b35ab96197 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs @@ -65,7 +65,7 @@ await collectionRepository.CreateAsync(collection, // Clean up data await userRepository.DeleteAsync(user1); await userRepository.DeleteAsync(user2); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await groupRepository.DeleteManyAsync([group1.Id, group2.Id]); await organizationUserRepository.DeleteManyAsync([orgUser1.Id, orgUser2.Id]); } @@ -100,6 +100,6 @@ public async Task CreateAsync_WithNoAccess_Works( Assert.Empty(actualAccess.Users); // Clean up - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs index 2f9931077ffb..e6997f571754 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs @@ -92,7 +92,7 @@ await collectionRepository.ReplaceAsync(collection, await userRepository.DeleteAsync(user1); await userRepository.DeleteAsync(user2); await userRepository.DeleteAsync(user3); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } /// @@ -144,7 +144,7 @@ await collectionRepository.CreateAsync(collection, // Clean up await userRepository.DeleteAsync(user); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } [Theory, DatabaseData] @@ -209,6 +209,6 @@ await collectionRepository.CreateAsync(collection, // Clean up data await userRepository.DeleteAsync(user1); await userRepository.DeleteAsync(user2); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs index 0fb4a5b446e1..6fb9f189379c 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs @@ -147,7 +147,7 @@ private static async Task CleanupAsync(IOrganizationRepository organizationRepos Organization organization, IEnumerable organizationUsers) { - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync( organizationUsers diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs index 9734fa440239..beb22d78e112 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs @@ -38,8 +38,8 @@ public async Task GetManyByIdsAsync_ExistingOrganizations_ReturnsOrganizations(I Assert.Contains(result, org => org.Id == organization2.Id); // Clean up - await organizationRepository.DeleteAsync(organization1); - await organizationRepository.DeleteAsync(organization2); + await organizationRepository.SafeDeleteAsync(organization1); + await organizationRepository.SafeDeleteAsync(organization2); } [Theory, DatabaseData] @@ -214,7 +214,7 @@ public async Task IncrementSeatCountAsync_GivenOrganizationHasNotChangedSeatCoun Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); // Annul - await sutRepository.DeleteAsync(organization); + await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -239,7 +239,7 @@ public async Task IncrementSeatCountAsync_GivenOrganizationHasChangedSeatCountBe Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); // Annul - await sutRepository.DeleteAsync(organization); + await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -262,7 +262,7 @@ public async Task GetOrganizationsForSubscriptionSyncAsync_GivenOrganizationHasC Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); // Annul - await sutRepository.DeleteAsync(organization); + await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -283,7 +283,7 @@ public async Task UpdateSuccessfulOrganizationSyncStatusAsync_GivenOrganizationH Assert.Null(result.FirstOrDefault(x => x.Id == organization.Id)); // Annul - await sutRepository.DeleteAsync(organization); + await sutRepository.SafeDeleteAsync(organization); } [DatabaseTheory, DatabaseData] @@ -402,7 +402,7 @@ public async Task GetAbilityAsync_WithExistingOrganization_ReturnsCorrectAbility Assert.Equal(organization.UseMyItems, result.UseMyItems); // Clean up - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } [Theory, DatabaseData] diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs index b41ea081042f..dfdcff99a051 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs @@ -28,7 +28,7 @@ public async Task ReturnsDetails_WhenUserIsConfirmed( Assert.Equal(OrganizationUserStatusType.Confirmed, result.Status); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -54,7 +54,7 @@ public async Task ReturnsDetails_WhenUserIsAccepted( Assert.Equal(OrganizationUserStatusType.Accepted, result.Status); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -82,8 +82,8 @@ public async Task ReturnsDetailsAcrossMultipleOrganizations_WhenUserIsConfirmedO Assert.Contains(results, r => r.OrganizationId == acceptedOrg.Id && r.Status == OrganizationUserStatusType.Accepted); // Annul - await organizationRepository.DeleteAsync(confirmedOrg); - await organizationRepository.DeleteAsync(acceptedOrg); + await organizationRepository.SafeDeleteAsync(confirmedOrg); + await organizationRepository.SafeDeleteAsync(acceptedOrg); await userRepository.DeleteAsync(user); } @@ -105,7 +105,7 @@ public async Task DoesNotReturnDetails_WhenUserIsInvited( Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -127,7 +127,7 @@ public async Task DoesNotReturnDetails_WhenUserIsRevoked( Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -151,7 +151,7 @@ public async Task DoesNotReturnDetails_ForOtherUsers( Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([targetUser, otherUser]); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs index 369451ad7638..18c897e4aa26 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs @@ -1395,7 +1395,7 @@ public async Task ConfirmOrganizationUserAsync_WhenUserIsAccepted_ReturnsTrue(IO Assert.Equal(key, updatedUser.Key); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -1428,7 +1428,7 @@ public async Task ConfirmOrganizationUserAsync_WhenUserIsAlreadyConfirmed_Return Assert.Equal(OrganizationUserStatusType.Confirmed, unchangedUser.Status); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -1462,7 +1462,7 @@ public async Task ConfirmOrganizationUserAsync_IsIdempotent_WhenCalledMultipleTi Assert.Equal(OrganizationUserStatusType.Confirmed, finalUser.Status); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs index 00ed72d2fb2c..590e1e14eb3e 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs @@ -35,7 +35,7 @@ public async Task ReturnsPolicies_WhenUserIsConfirmed( Assert.Contains(results, p => p.Id == policy.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -64,7 +64,7 @@ public async Task ReturnsPolicies_WhenUserIsAccepted( Assert.Contains(results, p => p.Id == policy.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -104,8 +104,8 @@ public async Task ReturnsPoliciesAcrossMultipleOrganizations_WhenUserIsConfirmed Assert.Contains(results, p => p.Id == acceptedPolicy.Id); // Annul - await organizationRepository.DeleteAsync(confirmedOrg); - await organizationRepository.DeleteAsync(acceptedOrg); + await organizationRepository.SafeDeleteAsync(confirmedOrg); + await organizationRepository.SafeDeleteAsync(acceptedOrg); await userRepository.DeleteAsync(user); } @@ -141,7 +141,7 @@ await organizationUserRepository.CreateAsync(new OrganizationUser Assert.DoesNotContain(results, p => p.Id == policy.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -170,7 +170,7 @@ public async Task DoesNotReturnPolicies_WhenUserIsRevoked( Assert.DoesNotContain(results, p => p.Id == policy.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } @@ -201,7 +201,7 @@ public async Task DoesNotReturnPolicies_ForOtherUsers( Assert.DoesNotContain(results, p => p.Id == policy.Id); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([targetUser, otherUser]); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs index e1352f5c8b34..f272b60a5951 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs @@ -41,7 +41,7 @@ public async Task ShouldContainProviderData( Assert.True(results.Single().IsProvider); // Annul - await organizationRepository.DeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); await userRepository.DeleteAsync(user); async Task ArrangeProvider() @@ -92,8 +92,8 @@ public async Task ShouldNotReturnOtherOrganizations_WhenUserIsNotConnected( Assert.DoesNotContain(results, result => result.OrganizationId == notConnectedOrg.Id); // Annul - await organizationRepository.DeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.DeleteAsync(notConnectedOrg); + await organizationRepository.SafeDeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); + await organizationRepository.SafeDeleteAsync(notConnectedOrg); await userRepository.DeleteAsync(user); } @@ -126,7 +126,7 @@ public async Task ShouldOnlyReturnInputPolicyType( Assert.DoesNotContain(results, result => result.PolicyType == notInputPolicyType); // Annul - await organizationRepository.DeleteAsync(new Organization { Id = orgUser.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization { Id = orgUser.OrganizationId }); await userRepository.DeleteAsync(user); } @@ -158,9 +158,9 @@ public async Task WhenDirectlyConnectedUserHasUserId_ShouldReturnOtherConnectedO AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId); // Annul - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); await userRepository.DeleteAsync(user); } @@ -188,9 +188,9 @@ public async Task WhenDirectlyConnectedUserHasEmail_ShouldReturnOtherConnectedOr AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId); // Annul - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); - await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); + await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); await userRepository.DeleteAsync(user); } @@ -227,7 +227,7 @@ public async Task ShouldReturnUserIds( && result.OrganizationId == orgUser2.OrganizationId); // Annul - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user1, user2]); } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs index f6c6b696ec21..fe3dc80b983a 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs @@ -59,7 +59,7 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithConfirmedUser_R Assert.False(result.IsProvider); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -99,7 +99,7 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithAcceptedUser_Re Assert.False(result.IsProvider); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -137,7 +137,7 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithInvitedUser_Ret Assert.False(result.IsProvider); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -188,8 +188,8 @@ await policyRepository.CreateAsync(new Policy Assert.Equal(PolicyType.SingleOrg, result2.PolicyType); // Cleanup - await organizationRepository.DeleteAsync(org1); - await organizationRepository.DeleteAsync(org2); + await organizationRepository.SafeDeleteAsync(org1); + await organizationRepository.SafeDeleteAsync(org2); await userRepository.DeleteAsync(user); } @@ -238,7 +238,7 @@ await policyRepository.CreateAsync(new Policy Assert.Equal(PolicyType.TwoFactorAuthentication, result.PolicyType); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -272,7 +272,7 @@ await policyRepository.CreateAsync(new Policy Assert.Empty(results); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -321,7 +321,7 @@ await policyRepository.CreateAsync(new Policy Assert.Empty(results); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -370,7 +370,7 @@ await policyRepository.CreateAsync(new Policy Assert.Empty(results); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } @@ -436,7 +436,7 @@ await providerOrganizationRepository.CreateAsync(new ProviderOrganization Assert.Equal(org.Id, result.OrganizationId); // Cleanup - await organizationRepository.DeleteAsync(org); + await organizationRepository.SafeDeleteAsync(org); await userRepository.DeleteAsync(user); } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs index 9576967a2511..1292d526573a 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs @@ -63,7 +63,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenTwoUsersForAnEnter Assert.Equal(policy.Data, result2.PolicyData); Assert.Equal(OrganizationUserStatusType.Confirmed, result2.OrganizationUserStatus); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user1, user2]); } @@ -115,7 +115,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenTwoUsersForEnterpr Assert.Equal(PolicyType.MasterPassword, result2.PolicyType); Assert.Equal(OrganizationUserStatusType.Invited, result2.OrganizationUserStatus); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user1, user2]); } @@ -179,7 +179,7 @@ await providerOrganizationRepository.CreateAsync(new ProviderOrganization Assert.Equal(user.Id, result.UserId); Assert.Equal(organization.Id, result.OrganizationId); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user]); } @@ -213,7 +213,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrgWithT Assert.Single(resultsList); Assert.All(resultsList, r => Assert.Equal(PolicyType.TwoFactorAuthentication, r.PolicyType)); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user]); } @@ -246,7 +246,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrg_When // Assert Assert.Empty(results); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user]); } @@ -290,7 +290,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrgWithP // Assert Assert.Empty(results); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user]); } @@ -334,7 +334,7 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenOrganization_WhenN // Assert Assert.Empty(results); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteManyAsync([user]); } diff --git a/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs b/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs index d9eff1cbd47b..fb5707080c14 100644 --- a/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs @@ -13,6 +13,7 @@ using Bit.Core.Vault.Enums; using Bit.Core.Vault.Models.Data; using Bit.Core.Vault.Repositories; +using Bit.Infrastructure.IntegrationTest.AdminConsole; using Xunit; using CipherType = Bit.Core.Vault.Enums.CipherType; @@ -630,7 +631,7 @@ await collectionCipherRepository.UpdateCollectionsForAdminAsync(cipher.Id, organ // Annul await cipherRepository.DeleteAsync(cipher); await organizationUserRepository.DeleteAsync(orgUser); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); await userRepository.DeleteAsync(user); } diff --git a/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs b/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs index 1579e5c329f6..0bc71beec430 100644 --- a/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs @@ -6,6 +6,7 @@ using Bit.Core.Vault.Entities; using Bit.Core.Vault.Enums; using Bit.Core.Vault.Repositories; +using Bit.Infrastructure.IntegrationTest.AdminConsole; using Xunit; namespace Bit.Infrastructure.IntegrationTest.Vault.Repositories; @@ -79,6 +80,6 @@ await collectionCipherRepository.AddCollectionsForManyCiphersAsync( await cipherRepository.DeleteAsync(defaultCipher); await collectionRepository.DeleteAsync(sharedCollection); await collectionRepository.DeleteAsync(defaultUserCollection); - await organizationRepository.DeleteAsync(organization); + await organizationRepository.SafeDeleteAsync(organization); } } From 050e2fbeeb5dcbea27974f539c5f1107809b80cc Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Fri, 17 Apr 2026 10:38:33 -0500 Subject: [PATCH 2/2] Removing database test clean up as these databases should be ephemeral --- .../AdminConsole/OrganizationTestHelpers.cs | 37 ------------------- .../CollectionRepositoryCreateTests.cs | 10 ----- .../CollectionRepositoryReplaceTests.cs | 15 -------- .../CreateDefaultCollectionsSharedTests.cs | 20 ---------- .../OrganizationRepositoryTests.cs | 19 ---------- ...onfirmedAcceptedDetailsByUserAsyncTests.cs | 25 ------------- .../OrganizationUserRepositoryTests.cs | 12 ------ ...ManyConfirmedAcceptedByUserIdAsyncTests.cs | 25 ------------- ...PolicyDetailsByOrganizationIdAsyncTests.cs | 29 --------------- ...PolicyDetailsByUserIdAndPolicyTypeTests.cs | 29 --------------- ...olicyDetailsByUserIdsAndPolicyTypeTests.cs | 20 ---------- .../Repositories/CipherRepositoryTests.cs | 7 ---- .../CollectionCipherRepositoryTests.cs | 8 ---- 13 files changed, 256 deletions(-) diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs b/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs index bb52b14f6e02..bf53b1d98687 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/OrganizationTestHelpers.cs @@ -5,8 +5,6 @@ using Bit.Core.Enums; using Bit.Core.Repositories; using Bit.Core.Utilities; -using Microsoft.Data.SqlClient; - namespace Bit.Infrastructure.IntegrationTest.AdminConsole; /// @@ -183,41 +181,6 @@ public static Task CreateTestCollectionAsync( Name = $"{identifier} {Guid.NewGuid()}" }); - /// - /// Deletes an organization with retry logic for SQL Server deadlocks (error 1205). - /// Use this instead of in test cleanup - /// to avoid deadlocks when tests run in parallel. - /// - public static async Task SafeDeleteAsync(this IOrganizationRepository repo, Organization org, int maxRetries = 3) - { - for (var attempt = 0; ; attempt++) - { - try - { - await repo.DeleteAsync(org); - return; - } - catch (Exception ex) when (attempt < maxRetries && IsDeadlock(ex)) - { - await Task.Delay(Random.Shared.Next(50, 200)); - } - } - } - - private static bool IsDeadlock(Exception ex) - { - var current = ex; - while (current != null) - { - if (current is SqlException { Number: 1205 }) - { - return true; - } - current = current.InnerException; - } - return false; - } - public static Task CreateTestOrganizationInviteLinkAsync( this IOrganizationInviteLinkRepository repository, Organization organization, diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs index d8b35ab96197..958b2614ec52 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryCreateTests.cs @@ -61,13 +61,6 @@ await collectionRepository.CreateAsync(collection, Assert.Equal(2, users.Length); Assert.Single(users, u => u.Id == orgUser1.Id && u.Manage && !u.HidePasswords && u.ReadOnly); Assert.Single(users, u => u.Id == orgUser2.Id && !u.Manage && u.HidePasswords && !u.ReadOnly); - - // Clean up data - await userRepository.DeleteAsync(user1); - await userRepository.DeleteAsync(user2); - await organizationRepository.SafeDeleteAsync(organization); - await groupRepository.DeleteManyAsync([group1.Id, group2.Id]); - await organizationUserRepository.DeleteManyAsync([orgUser1.Id, orgUser2.Id]); } /// @@ -98,8 +91,5 @@ public async Task CreateAsync_WithNoAccess_Works( Assert.Empty(actualAccess.Groups); Assert.Empty(actualAccess.Users); - - // Clean up - await organizationRepository.SafeDeleteAsync(organization); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs index e6997f571754..6988f6ec6fc8 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CollectionRepositoryReplaceTests.cs @@ -87,12 +87,6 @@ await collectionRepository.ReplaceAsync(collection, Assert.Equal(2, users.Length); Assert.Single(users, u => u.Id == orgUser2.Id && !u.Manage && !u.HidePasswords && u.ReadOnly); Assert.Single(users, u => u.Id == orgUser3.Id && u.Manage && !u.HidePasswords && u.ReadOnly); - - // Clean up data - await userRepository.DeleteAsync(user1); - await userRepository.DeleteAsync(user2); - await userRepository.DeleteAsync(user3); - await organizationRepository.SafeDeleteAsync(organization); } /// @@ -141,10 +135,6 @@ await collectionRepository.CreateAsync(collection, Assert.Empty(actualAccess.Groups); Assert.Empty(actualAccess.Users); - - // Clean up - await userRepository.DeleteAsync(user); - await organizationRepository.SafeDeleteAsync(organization); } [Theory, DatabaseData] @@ -205,10 +195,5 @@ await collectionRepository.CreateAsync(collection, Assert.Equal(2, users.Length); Assert.Single(users, u => u.Id == orgUser1.Id && u.Manage && !u.HidePasswords && u.ReadOnly); Assert.Single(users, u => u.Id == orgUser2.Id && !u.Manage && u.HidePasswords && !u.ReadOnly); - - // Clean up data - await userRepository.DeleteAsync(user1); - await userRepository.DeleteAsync(user2); - await organizationRepository.SafeDeleteAsync(organization); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs index 6fb9f189379c..5e68bad1efbd 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsSharedTests.cs @@ -35,8 +35,6 @@ public static async Task CreatesDefaultCollections_Success( // Assert await AssertAllUsersHaveOneDefaultCollectionAsync(collectionRepository, resultOrganizationUsers, organization.Id); - - await CleanupAsync(organizationRepository, userRepository, organization, resultOrganizationUsers); } public static async Task CreatesForNewUsersOnly_AndIgnoresExistingUsers( @@ -72,8 +70,6 @@ await CreateUserForOrgAsync(userRepository, organizationUserRepository, organiza // Assert await AssertAllUsersHaveOneDefaultCollectionAsync(collectionRepository, affectedOrgUsers, organization.Id); - - await CleanupAsync(organizationRepository, userRepository, organization, affectedOrgUsers); } public static async Task IgnoresAllExistingUsers( @@ -101,8 +97,6 @@ public static async Task IgnoresAllExistingUsers( // Assert - Original collections should remain unchanged, still only one per user await AssertAllUsersHaveOneDefaultCollectionAsync(collectionRepository, resultOrganizationUsers, organization.Id); - - await CleanupAsync(organizationRepository, userRepository, organization, resultOrganizationUsers); } private static async Task CreateUsersWithExistingDefaultCollectionsAsync( @@ -141,18 +135,4 @@ private static async Task CreateUserForOrgAsync(IUserRepositor return orgUser; } - - private static async Task CleanupAsync(IOrganizationRepository organizationRepository, - IUserRepository userRepository, - Organization organization, - IEnumerable organizationUsers) - { - await organizationRepository.SafeDeleteAsync(organization); - - await userRepository.DeleteManyAsync( - organizationUsers - .Where(organizationUser => organizationUser.UserId != null) - .Select(organizationUser => new User() { Id = organizationUser.UserId.Value }) - ); - } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs index beb22d78e112..f0a9138dde59 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationRepositoryTests.cs @@ -36,10 +36,6 @@ public async Task GetManyByIdsAsync_ExistingOrganizations_ReturnsOrganizations(I Assert.Equal(2, result.Count); Assert.Contains(result, org => org.Id == organization1.Id); Assert.Contains(result, org => org.Id == organization2.Id); - - // Clean up - await organizationRepository.SafeDeleteAsync(organization1); - await organizationRepository.SafeDeleteAsync(organization2); } [Theory, DatabaseData] @@ -212,9 +208,6 @@ public async Task IncrementSeatCountAsync_GivenOrganizationHasNotChangedSeatCoun Assert.Equal(organization.Id, updateResult.Id); Assert.True(updateResult.SyncSeats); Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); - - // Annul - await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -237,9 +230,6 @@ public async Task IncrementSeatCountAsync_GivenOrganizationHasChangedSeatCountBe Assert.Equal(organization.Id, updateResult.Id); Assert.True(updateResult.SyncSeats); Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); - - // Annul - await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -260,9 +250,6 @@ public async Task GetOrganizationsForSubscriptionSyncAsync_GivenOrganizationHasC Assert.Equal(organization.Id, updateResult.Id); Assert.True(updateResult.SyncSeats); Assert.Equal(requestDate.ToString("yyyy-MM-dd HH:mm:ss"), updateResult.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss")); - - // Annul - await sutRepository.SafeDeleteAsync(organization); } [DatabaseData, Theory] @@ -281,9 +268,6 @@ public async Task UpdateSuccessfulOrganizationSyncStatusAsync_GivenOrganizationH // Assert var result = (await sutRepository.GetOrganizationsForSubscriptionSyncAsync()).ToArray(); Assert.Null(result.FirstOrDefault(x => x.Id == organization.Id)); - - // Annul - await sutRepository.SafeDeleteAsync(organization); } [DatabaseTheory, DatabaseData] @@ -400,9 +384,6 @@ public async Task GetAbilityAsync_WithExistingOrganization_ReturnsCorrectAbility Assert.Equal(organization.UseDisableSmAdsForUsers, result.UseDisableSmAdsForUsers); Assert.Equal(organization.UsePhishingBlocker, result.UsePhishingBlocker); Assert.Equal(organization.UseMyItems, result.UseMyItems); - - // Clean up - await organizationRepository.SafeDeleteAsync(organization); } [Theory, DatabaseData] diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs index dfdcff99a051..1be872e5f527 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/GetManyConfirmedAcceptedDetailsByUserAsyncTests.cs @@ -26,10 +26,6 @@ public async Task ReturnsDetails_WhenUserIsConfirmed( Assert.Equal(organization.Id, result.OrganizationId); Assert.Equal(user.Id, result.UserId); Assert.Equal(OrganizationUserStatusType.Confirmed, result.Status); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -52,10 +48,6 @@ public async Task ReturnsDetails_WhenUserIsAccepted( Assert.Equal(organization.Id, result.OrganizationId); Assert.Equal(user.Id, result.UserId); Assert.Equal(OrganizationUserStatusType.Accepted, result.Status); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -80,11 +72,6 @@ public async Task ReturnsDetailsAcrossMultipleOrganizations_WhenUserIsConfirmedO Assert.Equal(2, results.Count); Assert.Contains(results, r => r.OrganizationId == confirmedOrg.Id && r.Status == OrganizationUserStatusType.Confirmed); Assert.Contains(results, r => r.OrganizationId == acceptedOrg.Id && r.Status == OrganizationUserStatusType.Accepted); - - // Annul - await organizationRepository.SafeDeleteAsync(confirmedOrg); - await organizationRepository.SafeDeleteAsync(acceptedOrg); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -103,10 +90,6 @@ public async Task DoesNotReturnDetails_WhenUserIsInvited( // Assert Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -125,10 +108,6 @@ public async Task DoesNotReturnDetails_WhenUserIsRevoked( // Assert Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -149,9 +128,5 @@ public async Task DoesNotReturnDetails_ForOtherUsers( // Assert Assert.DoesNotContain(results, r => r.OrganizationId == organization.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([targetUser, otherUser]); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs index 18c897e4aa26..3619ae6507e2 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/OrganizationUserRepository/OrganizationUserRepositoryTests.cs @@ -1393,10 +1393,6 @@ public async Task ConfirmOrganizationUserAsync_WhenUserIsAccepted_ReturnsTrue(IO Assert.NotNull(updatedUser); Assert.Equal(OrganizationUserStatusType.Confirmed, updatedUser.Status); Assert.Equal(key, updatedUser.Key); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -1426,10 +1422,6 @@ public async Task ConfirmOrganizationUserAsync_WhenUserIsAlreadyConfirmed_Return var unchangedUser = await organizationUserRepository.GetByIdAsync(orgUser.Id); Assert.NotNull(unchangedUser); Assert.Equal(OrganizationUserStatusType.Confirmed, unchangedUser.Status); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -1460,10 +1452,6 @@ public async Task ConfirmOrganizationUserAsync_IsIdempotent_WhenCalledMultipleTi var finalUser = await organizationUserRepository.GetByIdAsync(orgUser.Id); Assert.NotNull(finalUser); Assert.Equal(OrganizationUserStatusType.Confirmed, finalUser.Status); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs index 590e1e14eb3e..83c063e59be7 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetManyConfirmedAcceptedByUserIdAsyncTests.cs @@ -33,10 +33,6 @@ public async Task ReturnsPolicies_WhenUserIsConfirmed( // Assert Assert.Contains(results, p => p.Id == policy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -62,10 +58,6 @@ public async Task ReturnsPolicies_WhenUserIsAccepted( // Assert Assert.Contains(results, p => p.Id == policy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -102,11 +94,6 @@ public async Task ReturnsPoliciesAcrossMultipleOrganizations_WhenUserIsConfirmed // Assert Assert.Contains(results, p => p.Id == confirmedPolicy.Id); Assert.Contains(results, p => p.Id == acceptedPolicy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(confirmedOrg); - await organizationRepository.SafeDeleteAsync(acceptedOrg); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -139,10 +126,6 @@ await organizationUserRepository.CreateAsync(new OrganizationUser // Assert Assert.DoesNotContain(results, p => p.Id == policy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -168,10 +151,6 @@ public async Task DoesNotReturnPolicies_WhenUserIsRevoked( // Assert Assert.DoesNotContain(results, p => p.Id == policy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } [Theory, DatabaseData] @@ -199,9 +178,5 @@ public async Task DoesNotReturnPolicies_ForOtherUsers( // Assert Assert.DoesNotContain(results, p => p.Id == policy.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([targetUser, otherUser]); } } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs index f272b60a5951..437c91bde730 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByOrganizationIdAsyncTests.cs @@ -40,10 +40,6 @@ public async Task ShouldContainProviderData( Assert.True(results.Single().IsProvider); - // Annul - await organizationRepository.SafeDeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); - await userRepository.DeleteAsync(user); - async Task ArrangeProvider() { var provider = await providerRepository.CreateAsync(new Provider @@ -90,11 +86,6 @@ public async Task ShouldNotReturnOtherOrganizations_WhenUserIsNotConnected( Assert.Contains(results, result => result.OrganizationUserId == userOrgConnectedDirectly.Id && result.OrganizationId == userOrgConnectedDirectly.OrganizationId); Assert.DoesNotContain(results, result => result.OrganizationId == notConnectedOrg.Id); - - // Annul - await organizationRepository.SafeDeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.SafeDeleteAsync(notConnectedOrg); - await userRepository.DeleteAsync(user); } [DatabaseTheory, DatabaseData] @@ -124,10 +115,6 @@ public async Task ShouldOnlyReturnInputPolicyType( && result.PolicyType == inputPolicyType); Assert.DoesNotContain(results, result => result.PolicyType == notInputPolicyType); - - // Annul - await organizationRepository.SafeDeleteAsync(new Organization { Id = orgUser.OrganizationId }); - await userRepository.DeleteAsync(user); } @@ -156,12 +143,6 @@ public async Task WhenDirectlyConnectedUserHasUserId_ShouldReturnOtherConnectedO Assert.Equal(expectedCount, results.Count); AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId); - - // Annul - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); - await userRepository.DeleteAsync(user); } [DatabaseTheory, DatabaseData] @@ -186,12 +167,6 @@ public async Task WhenDirectlyConnectedUserHasEmail_ShouldReturnOtherConnectedOr // Assert AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId); - - // Annul - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId }); - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId }); - await organizationRepository.SafeDeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId }); - await userRepository.DeleteAsync(user); } [DatabaseTheory, DatabaseData] @@ -225,10 +200,6 @@ public async Task ShouldReturnUserIds( Assert.Contains(results, result => result.OrganizationUserId == orgUser2.Id && result.UserId == orgUser2.UserId && result.OrganizationId == orgUser2.OrganizationId); - - // Annul - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user1, user2]); } diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs index fe3dc80b983a..60b8bd83addc 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdAndPolicyTypeTests.cs @@ -58,9 +58,6 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithConfirmedUser_R Assert.Equal(customPermissions, result.OrganizationUserPermissionsData); Assert.False(result.IsProvider); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -98,9 +95,6 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithAcceptedUser_Re Assert.Equal(OrganizationUserStatusType.Accepted, result.OrganizationUserStatus); Assert.False(result.IsProvider); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -136,9 +130,6 @@ public async Task GetPolicyDetailsByUserIdAndPolicyTypeAsync_WithInvitedUser_Ret Assert.Equal(OrganizationUserStatusType.Invited, result.OrganizationUserStatus); Assert.False(result.IsProvider); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -186,11 +177,6 @@ await policyRepository.CreateAsync(new Policy var result2 = resultsList.First(r => r.OrganizationId == org2.Id); Assert.Equal(orgUser2.Id, result2.OrganizationUserId); Assert.Equal(PolicyType.SingleOrg, result2.PolicyType); - - // Cleanup - await organizationRepository.SafeDeleteAsync(org1); - await organizationRepository.SafeDeleteAsync(org2); - await userRepository.DeleteAsync(user); } [Theory] @@ -237,9 +223,6 @@ await policyRepository.CreateAsync(new Policy var result = Assert.Single(resultsList); Assert.Equal(PolicyType.TwoFactorAuthentication, result.PolicyType); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -271,9 +254,6 @@ await policyRepository.CreateAsync(new Policy // Assert Assert.Empty(results); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -320,9 +300,6 @@ await policyRepository.CreateAsync(new Policy // Assert Assert.Empty(results); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -369,9 +346,6 @@ await policyRepository.CreateAsync(new Policy // Assert Assert.Empty(results); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } [Theory] @@ -435,9 +409,6 @@ await providerOrganizationRepository.CreateAsync(new ProviderOrganization Assert.True(result.IsProvider); Assert.Equal(org.Id, result.OrganizationId); - // Cleanup - await organizationRepository.SafeDeleteAsync(org); - await userRepository.DeleteAsync(user); } private static async Task CreateEnterpriseOrgAsync(IOrganizationRepository orgRepo) diff --git a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs index 1292d526573a..a18c9f46a9f4 100644 --- a/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs +++ b/test/Infrastructure.IntegrationTest/AdminConsole/Repositories/PolicyRepository/GetPolicyDetailsByUserIdsAndPolicyTypeTests.cs @@ -62,9 +62,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenTwoUsersForAnEnter Assert.Equal(PolicyType.TwoFactorAuthentication, result2.PolicyType); Assert.Equal(policy.Data, result2.PolicyData); Assert.Equal(OrganizationUserStatusType.Confirmed, result2.OrganizationUserStatus); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user1, user2]); } [Theory] @@ -114,9 +111,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenTwoUsersForEnterpr Assert.Equal(organization.Id, result2.OrganizationId); Assert.Equal(PolicyType.MasterPassword, result2.PolicyType); Assert.Equal(OrganizationUserStatusType.Invited, result2.OrganizationUserStatus); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user1, user2]); } [Theory] @@ -178,9 +172,6 @@ await providerOrganizationRepository.CreateAsync(new ProviderOrganization Assert.True(result.IsProvider); Assert.Equal(user.Id, result.UserId); Assert.Equal(organization.Id, result.OrganizationId); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user]); } [Theory] @@ -212,9 +203,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrgWithT var resultsList = results.ToList(); Assert.Single(resultsList); Assert.All(resultsList, r => Assert.Equal(PolicyType.TwoFactorAuthentication, r.PolicyType)); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user]); } [Theory] @@ -246,8 +234,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrg_When // Assert Assert.Empty(results); - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user]); } [Theory] @@ -289,9 +275,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenEnterpriseOrgWithP // Assert Assert.Empty(results); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user]); } [Theory] @@ -333,9 +316,6 @@ public async Task GetPolicyDetailsByUserIdsAndPolicyType_GivenOrganization_WhenN // Assert Assert.Empty(results); - - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteManyAsync([user]); } [Theory] diff --git a/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs b/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs index fb5707080c14..a33caa6ea3f1 100644 --- a/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/Vault/Repositories/CipherRepositoryTests.cs @@ -13,7 +13,6 @@ using Bit.Core.Vault.Enums; using Bit.Core.Vault.Models.Data; using Bit.Core.Vault.Repositories; -using Bit.Infrastructure.IntegrationTest.AdminConsole; using Xunit; using CipherType = Bit.Core.Vault.Enums.CipherType; @@ -627,12 +626,6 @@ await collectionCipherRepository.UpdateCollectionsForAdminAsync(cipher.Id, organ var deletableCipher = ciphers.SingleOrDefault(x => x.Id == cipher.Id); Assert.NotNull(deletableCipher); Assert.True(deletableCipher.Manage); - - // Annul - await cipherRepository.DeleteAsync(cipher); - await organizationUserRepository.DeleteAsync(orgUser); - await organizationRepository.SafeDeleteAsync(organization); - await userRepository.DeleteAsync(user); } private async Task<(User user, Organization org, OrganizationUser orgUser)> CreateTestUserAndOrganization( diff --git a/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs b/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs index 0bc71beec430..c1bcde6f02bc 100644 --- a/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/Vault/Repositories/CollectionCipherRepositoryTests.cs @@ -6,7 +6,6 @@ using Bit.Core.Vault.Entities; using Bit.Core.Vault.Enums; using Bit.Core.Vault.Repositories; -using Bit.Infrastructure.IntegrationTest.AdminConsole; using Xunit; namespace Bit.Infrastructure.IntegrationTest.Vault.Repositories; @@ -74,12 +73,5 @@ await collectionCipherRepository.AddCollectionsForManyCiphersAsync( Assert.Single(result); Assert.Equal(sharedCollection.Id, result.First().CollectionId); Assert.DoesNotContain(result, cc => cc.CollectionId == defaultUserCollection.Id); - - // Cleanup - await cipherRepository.DeleteAsync(sharedCipher); - await cipherRepository.DeleteAsync(defaultCipher); - await collectionRepository.DeleteAsync(sharedCollection); - await collectionRepository.DeleteAsync(defaultUserCollection); - await organizationRepository.SafeDeleteAsync(organization); } }