/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/Gridient.Core.Tests/Controllers/AuthConfigControllerTests.cs
225 строк
9 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
using FluentAssertions; using Gridient.Core.Controllers; using Gridient.Core.Features.AuthConfig.Queries; using Gridient.Core.Models.Auth; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Moq; using Xunit; namespace Gridient.Core.Tests.Controllers { public class AuthConfigControllerTests { #region GetConfig /// <summary> /// Проверяет, что при ошибке конфигурации провайдеров контроллер возвращает 500. /// </summary> [Fact] public async Task GetConfig_WhenNoEnabledProvidersAfterFeatureFiltering_ShouldReturn500() { var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ThrowsAsync(new InvalidOperationException("Не настроен ни один провайдер аутентификации или соответствующие feature flags не включены.")); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<ObjectResult>(); var obj = (ObjectResult)result; obj.StatusCode.Should().Be(StatusCodes.Status500InternalServerError); } /// <summary> /// Проверяет, что при корректной конфигурации local провайдера возвращается OkObjectResult с моделью. /// </summary> [Fact] public async Task GetConfig_WhenLocalEnabled_ShouldReturnOkWithLocalProvider() { var expected = new AuthConfigModel { Mode = "Local", Providers = new List<AuthProviderConfigModel> { new() { Id = "local", Type = "LocalPassword", LoginKind = "Password" } }, CanRegister = true, HasPasswordReset = true }; var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ReturnsAsync(expected); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<OkObjectResult>(); var model = (AuthConfigModel)((OkObjectResult)result).Value!; model.Mode.Should().Be("Local"); model.Providers.Should().HaveCount(1); model.Providers[0].Type.Should().Be("LocalPassword"); model.Providers[0].LoginKind.Should().Be("Password"); model.CanRegister.Should().BeTrue(); model.HasPasswordReset.Should().BeTrue(); } /// <summary> /// Проверяет, что при режиме Hybrid возвращается ожидаемая модель. /// </summary> [Fact] public async Task GetConfig_WhenLocalAndOidcEnabled_ShouldReturnHybrid_AndOrderedProviders() { var expected = new AuthConfigModel { Mode = "Hybrid", Providers = new List<AuthProviderConfigModel> { new() { Id = "local" }, new() { Id = "oidc" } }, LogoutEndpoint = "/api/auth/oidc/logout", CanRegister = true, HasPasswordReset = true }; var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ReturnsAsync(expected); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<OkObjectResult>(); var model = (AuthConfigModel)((OkObjectResult)result).Value!; model.Mode.Should().Be("Hybrid"); model.Providers.Should().HaveCount(2); model.Providers[0].Id.Should().Be("local"); model.Providers[1].Id.Should().Be("oidc"); model.LogoutEndpoint.Should().Be("/api/auth/oidc/logout"); model.CanRegister.Should().BeTrue(); model.HasPasswordReset.Should().BeTrue(); } /// <summary> /// Проверяет, что при режиме Oidc возвращается ожидаемая модель. /// </summary> [Fact] public async Task GetConfig_WhenOnlyOidcEnabled_ShouldReturnOidcMode_AndRedirectLoginKind() { var expected = new AuthConfigModel { Mode = "Oidc", Providers = new List<AuthProviderConfigModel> { new() { Type = "OIDC", LoginKind = "Redirect", LoginEndpointOrUrl = "/api/auth/oidc/login" } }, CanRegister = false, HasPasswordReset = false, LogoutEndpoint = "/api/auth/oidc/logout" }; var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ReturnsAsync(expected); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<OkObjectResult>(); var model = (AuthConfigModel)((OkObjectResult)result).Value!; model.Mode.Should().Be("Oidc"); model.Providers.Should().HaveCount(1); model.Providers[0].Type.Should().Be("OIDC"); model.Providers[0].LoginKind.Should().Be("Redirect"); model.Providers[0].LoginEndpointOrUrl.Should().Be("/api/auth/oidc/login"); model.CanRegister.Should().BeFalse(); model.HasPasswordReset.Should().BeFalse(); model.LogoutEndpoint.Should().Be("/api/auth/oidc/logout"); } /// <summary> /// Проверяет, что для local провайдера с LoginUrl используется заданный URL. /// </summary> [Fact] public async Task GetConfig_WhenLocalProviderHasLoginUrl_ShouldUseLoginUrl() { var expected = new AuthConfigModel { Mode = "Local", Providers = new List<AuthProviderConfigModel> { new() { Id = "local", LoginKind = "Password", LoginEndpointOrUrl = "https://sso/login", AllowsRegistration = false } } }; var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ReturnsAsync(expected); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<OkObjectResult>(); var model = (AuthConfigModel)((OkObjectResult)result).Value!; model.Providers.Should().HaveCount(1); model.Providers[0].LoginKind.Should().Be("Password"); model.Providers[0].LoginEndpointOrUrl.Should().Be("https://sso/login"); model.Providers[0].AllowsRegistration.Should().BeFalse(); } /// <summary> /// Проверяет, что при полной недоступности провайдеров возвращается 500. /// </summary> [Fact] public async Task GetConfig_WhenAllProvidersDisabled_ShouldReturn500() { var mediatorMock = new Mock<IMediator>(); mediatorMock .Setup(m => m.Send(It.IsAny<GetAuthConfigQuery>(), It.IsAny<CancellationToken>())) .ThrowsAsync(new InvalidOperationException("Не настроен ни один провайдер аутентификации или соответствующие feature flags не включены.")); var controller = new AuthConfigController(mediatorMock.Object); var result = await controller.GetConfig(CancellationToken.None); result.Should().BeOfType<ObjectResult>(); var obj = (ObjectResult)result; obj.StatusCode.Should().Be(StatusCodes.Status500InternalServerError); } #endregion } }