using Bit.Api.Billing.Controllers; using Bit.Api.Billing.Models.Responses; using Bit.Core.AdminConsole.Entities; using Bit.Core.Billing.Models; using Bit.Core.Billing.Services; using Bit.Core.Context; using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Http.HttpResults; using NSubstitute; using Xunit; using static Bit.Api.Test.Billing.Utilities; namespace Bit.Api.Test.Billing.Controllers; [ControllerCustomize(typeof(OrganizationBillingController))] [SutProviderCustomize] public class OrganizationBillingControllerTests { [Theory, BitAutoData] public async Task GetMetadataAsync_Unauthorized_ReturnsUnauthorized( Guid organizationId, SutProvider sutProvider) { sutProvider.GetDependency().AccessMembersTab(organizationId).Returns(false); var result = await sutProvider.Sut.GetMetadataAsync(organizationId); AssertUnauthorized(result); } [Theory, BitAutoData] public async Task GetMetadataAsync_MetadataNull_NotFound( Guid organizationId, SutProvider sutProvider) { sutProvider.GetDependency().AccessMembersTab(organizationId).Returns(true); sutProvider.GetDependency().GetMetadata(organizationId).Returns((OrganizationMetadata)null); var result = await sutProvider.Sut.GetMetadataAsync(organizationId); AssertNotFound(result); } [Theory, BitAutoData] public async Task GetMetadataAsync_OK( Guid organizationId, SutProvider sutProvider) { sutProvider.GetDependency().AccessMembersTab(organizationId).Returns(true); sutProvider.GetDependency().GetMetadata(organizationId) .Returns(new OrganizationMetadata(true, true)); var result = await sutProvider.Sut.GetMetadataAsync(organizationId); Assert.IsType>(result); var organizationMetadataResponse = ((Ok)result).Value; Assert.True(organizationMetadataResponse.IsEligibleForSelfHost); Assert.True(organizationMetadataResponse.IsOnSecretsManagerStandalone); } [Theory, BitAutoData] public async Task GetHistoryAsync_Unauthorized_ReturnsUnauthorized( Guid organizationId, SutProvider sutProvider) { sutProvider.GetDependency().ViewBillingHistory(organizationId).Returns(false); var result = await sutProvider.Sut.GetHistoryAsync(organizationId); AssertUnauthorized(result); } [Theory, BitAutoData] public async Task GetHistoryAsync_OrganizationNotFound_ReturnsNotFound( Guid organizationId, SutProvider sutProvider) { sutProvider.GetDependency().ViewBillingHistory(organizationId).Returns(true); sutProvider.GetDependency().GetByIdAsync(organizationId).Returns((Organization)null); var result = await sutProvider.Sut.GetHistoryAsync(organizationId); AssertNotFound(result); } [Theory] [BitAutoData] public async Task GetHistoryAsync_OK( Guid organizationId, Organization organization, SutProvider sutProvider) { // Arrange sutProvider.GetDependency().ViewBillingHistory(organizationId).Returns(true); sutProvider.GetDependency().GetByIdAsync(organizationId).Returns(organization); // Manually create a BillingHistoryInfo object to avoid requiring AutoFixture to create HttpResponseHeaders var billingInfo = new BillingHistoryInfo(); sutProvider.GetDependency().GetBillingHistoryAsync(organization).Returns(billingInfo); // Act var result = await sutProvider.Sut.GetHistoryAsync(organizationId); // Assert var okResult = Assert.IsType>(result); Assert.Equal(billingInfo, okResult.Value); } }