using Bit.Api.AdminConsole.Controllers;
using Bit.Api.AdminConsole.Models.Request;
using Bit.Core.Context;
using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes;
using NSubstitute;
using Xunit;

namespace Bit.Api.Test.AdminConsole.Controllers;

[ControllerCustomize(typeof(OrganizationAuthRequestsController))]
[SutProviderCustomize]
public class OrganizationAuthRequestsControllerTests
{

    [Theory]
    [BitAutoData]
    public async Task ValidateAdminRequest_UserDoesNotHaveManageResetPasswordPermissions_ThrowsUnauthorized(
        SutProvider<OrganizationAuthRequestsController> sutProvider,
        Guid organizationId
    )
    {
        sutProvider.GetDependency<ICurrentContext>().ManageResetPassword(organizationId).Returns(false);

        await Assert.ThrowsAsync<UnauthorizedAccessException>(() =>
            sutProvider.Sut.ValidateAdminRequest(organizationId));
    }

    [Theory]
    [BitAutoData]
    public async Task ValidateAdminRequest_UserHasManageResetPasswordPermissions_DoesNotThrow(
        SutProvider<OrganizationAuthRequestsController> sutProvider,
        Guid organizationId
    )
    {
        sutProvider.GetDependency<ICurrentContext>().ManageResetPassword(organizationId).Returns(true);
        await sutProvider.Sut.ValidateAdminRequest(organizationId);
    }

    [Theory]
    [BitAutoData]
    public async Task UpdateManyAuthRequests_ValidInput_DoesNotThrow(
        SutProvider<OrganizationAuthRequestsController> sutProvider,
        IEnumerable<OrganizationAuthRequestUpdateManyRequestModel> request,
        Guid organizationId
    )
    {
        sutProvider.GetDependency<ICurrentContext>().ManageResetPassword(organizationId).Returns(true);
        await sutProvider.Sut.UpdateManyAuthRequests(organizationId, request);
    }

    [Theory]
    [BitAutoData]
    public async Task UpdateManyAuthRequests_NotPermissioned_ThrowsUnauthorized(
        SutProvider<OrganizationAuthRequestsController> sutProvider,
        IEnumerable<OrganizationAuthRequestUpdateManyRequestModel> request,
        Guid organizationId
    )
    {
        sutProvider.GetDependency<ICurrentContext>().ManageResetPassword(organizationId).Returns(false);
        await Assert.ThrowsAsync<UnauthorizedAccessException>(() =>
            sutProvider.Sut.UpdateManyAuthRequests(organizationId, request));
    }
}