From 60ea32bb1d28b4065fd6cfe8883b023375b29d8b Mon Sep 17 00:00:00 2001 From: Thomas Rittson Date: Wed, 11 Oct 2023 14:49:26 +1000 Subject: [PATCH] Add FeatureServiceFixtures to set feature flags in test --- .../Controllers/CollectionsControllerTests.cs | 15 +--- .../AutoFixture/FeatureServiceFixtures.cs | 73 +++++++++++++++++++ .../Services/CollectionServiceTests.cs | 4 +- 3 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 test/Core.Test/AutoFixture/FeatureServiceFixtures.cs diff --git a/test/Api.Test/Controllers/CollectionsControllerTests.cs b/test/Api.Test/Controllers/CollectionsControllerTests.cs index 9e3db4741a..5bd5bfcb4c 100644 --- a/test/Api.Test/Controllers/CollectionsControllerTests.cs +++ b/test/Api.Test/Controllers/CollectionsControllerTests.cs @@ -10,6 +10,7 @@ using Bit.Core.Models.Data; using Bit.Core.OrganizationFeatures.OrganizationCollections.Interfaces; using Bit.Core.Repositories; using Bit.Core.Services; +using Bit.Core.Test.AutoFixture; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Authorization; @@ -20,14 +21,13 @@ namespace Bit.Api.Test.Controllers; [ControllerCustomize(typeof(CollectionsController))] [SutProviderCustomize] +[FeatureServiceCustomize(FeatureFlagKeys.FlexibleCollections)] public class CollectionsControllerTests { [Theory, BitAutoData] public async Task Post_Success(Guid orgId, CollectionRequestModel collectionRequest, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); - Collection ExpectedCollection() => Arg.Is(c => c.Name == collectionRequest.Name && c.ExternalId == collectionRequest.ExternalId && c.OrganizationId == orgId); @@ -50,7 +50,6 @@ public class CollectionsControllerTests public async Task Put_Success(Guid orgId, Guid collectionId, Guid userId, CollectionRequestModel collectionRequest, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency() .ViewAssignedCollections(orgId) .Returns(true); @@ -77,7 +76,6 @@ public class CollectionsControllerTests public async Task Put_CanNotEditAssignedCollection_ThrowsNotFound(Guid orgId, Guid collectionId, Guid userId, CollectionRequestModel collectionRequest, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency() .EditAssignedCollections(orgId) .Returns(true); @@ -96,7 +94,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task GetOrganizationCollectionsWithGroups_NoManagerPermissions_ThrowsNotFound(Organization organization, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency().ViewAssignedCollections(organization.Id).Returns(false); await Assert.ThrowsAsync(() => sutProvider.Sut.GetManyWithDetails(organization.Id)); @@ -107,7 +104,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task GetOrganizationCollectionsWithGroups_AdminPermissions_GetsAllCollections(Organization organization, User user, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency().UserId.Returns(user.Id); sutProvider.GetDependency().ViewAllCollections(organization.Id).Returns(true); sutProvider.GetDependency().OrganizationAdmin(organization.Id).Returns(true); @@ -121,7 +117,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task GetOrganizationCollectionsWithGroups_MissingViewAllPermissions_GetsAssignedCollections(Organization organization, User user, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency().UserId.Returns(user.Id); sutProvider.GetDependency().ViewAssignedCollections(organization.Id).Returns(true); sutProvider.GetDependency().OrganizationManager(organization.Id).Returns(true); @@ -135,7 +130,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task GetOrganizationCollectionsWithGroups_CustomUserWithManagerPermissions_GetsAssignedCollections(Organization organization, User user, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); sutProvider.GetDependency().UserId.Returns(user.Id); sutProvider.GetDependency().ViewAssignedCollections(organization.Id).Returns(true); sutProvider.GetDependency().EditAssignedCollections(organization.Id).Returns(true); @@ -151,7 +145,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task DeleteMany_Success(Guid orgId, Collection collection1, Collection collection2, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); // Arrange var model = new CollectionBulkDeleteRequestModel { @@ -194,7 +187,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task DeleteMany_PermissionDenied_ThrowsNotFound(Guid orgId, Collection collection1, Collection collection2, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); // Arrange var model = new CollectionBulkDeleteRequestModel { @@ -236,7 +228,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task PostBulkCollectionAccess_Success(User actingUser, ICollection collections, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); // Arrange var userId = Guid.NewGuid(); var groupId = Guid.NewGuid(); @@ -283,7 +274,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task PostBulkCollectionAccess_CollectionsNotFound_Throws(User actingUser, ICollection collections, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); var userId = Guid.NewGuid(); var groupId = Guid.NewGuid(); var model = new BulkCollectionAccessRequestModel @@ -315,7 +305,6 @@ public class CollectionsControllerTests [Theory, BitAutoData] public async Task PostBulkCollectionAccess_AccessDenied_Throws(User actingUser, ICollection collections, SutProvider sutProvider) { - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); var userId = Guid.NewGuid(); var groupId = Guid.NewGuid(); var model = new BulkCollectionAccessRequestModel diff --git a/test/Core.Test/AutoFixture/FeatureServiceFixtures.cs b/test/Core.Test/AutoFixture/FeatureServiceFixtures.cs new file mode 100644 index 0000000000..c69b492a31 --- /dev/null +++ b/test/Core.Test/AutoFixture/FeatureServiceFixtures.cs @@ -0,0 +1,73 @@ +using System.Reflection; +using AutoFixture; +using AutoFixture.Kernel; +using Bit.Core.Context; +using Bit.Core.Services; +using Bit.Test.Common.AutoFixture.Attributes; +using NSubstitute; + +namespace Bit.Core.Test.AutoFixture; + +internal class FeatureServiceBuilder : ISpecimenBuilder +{ + private readonly string _enabledFeatureFlag; + + public FeatureServiceBuilder(string enabledFeatureFlag) + { + _enabledFeatureFlag = enabledFeatureFlag; + } + + public object Create(object request, ISpecimenContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (request is not ParameterInfo pi) + { + return new NoSpecimen(); + } + + if (pi.ParameterType == typeof(IFeatureService)) + { + var featureService = Substitute.For(); + featureService + .IsEnabled(_enabledFeatureFlag, Arg.Any(), Arg.Any()) + .Returns(true); + return featureService; + } + + return new NoSpecimen(); + } +} + +internal class FeatureServiceCustomization : ICustomization +{ + private readonly string _enabledFeatureFlag; + + public FeatureServiceCustomization(string enabledFeatureFlag) + { + _enabledFeatureFlag = enabledFeatureFlag; + } + + public void Customize(IFixture fixture) + { + fixture.Customizations.Add(new FeatureServiceBuilder(_enabledFeatureFlag)); + } +} + +/// +/// Arranges the IFeatureService mock to enable the specified feature flag +/// +public class FeatureServiceCustomizeAttribute : BitCustomizeAttribute +{ + private readonly string _enabledFeatureFlag; + + public FeatureServiceCustomizeAttribute(string enabledFeatureFlag) + { + _enabledFeatureFlag = enabledFeatureFlag; + } + + public override ICustomization GetCustomization() => new FeatureServiceCustomization(_enabledFeatureFlag); +} diff --git a/test/Core.Test/Services/CollectionServiceTests.cs b/test/Core.Test/Services/CollectionServiceTests.cs index ab40b574ef..97565bba4b 100644 --- a/test/Core.Test/Services/CollectionServiceTests.cs +++ b/test/Core.Test/Services/CollectionServiceTests.cs @@ -112,7 +112,9 @@ public class CollectionServiceTest { collection.Id = default; sutProvider.GetDependency().GetByIdAsync(organization.Id).Returns(organization); - sutProvider.EnableFeatureFlag(FeatureFlagKeys.FlexibleCollections); + sutProvider.GetDependency() + .IsEnabled(FeatureFlagKeys.FlexibleCollections, Arg.Any(), Arg.Any()) + .Returns(true); var ex = await Assert.ThrowsAsync(() => sutProvider.Sut.SaveAsync(collection, null, users)); Assert.Contains("At least one member or group must have can manage permission.", ex.Message);