using System.Net;
using System.Net.Http.Json;
using System.Text.Json;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using NSubstitute;
using Xunit;
using XiangYi.AdminApi;
using XiangYi.Application.DTOs.Requests;
using XiangYi.Application.DTOs.Responses;
using XiangYi.Application.Interfaces;
namespace XiangYi.Api.Tests.AdminApi;
///
/// 后台认证控制器集成测试
///
public class AdminAuthControllerIntegrationTests : IClassFixture>
{
private readonly WebApplicationFactory _factory;
private readonly IAdminAuthService _mockAdminAuthService;
public AdminAuthControllerIntegrationTests(WebApplicationFactory factory)
{
_mockAdminAuthService = Substitute.For();
_factory = factory.WithWebHostBuilder(builder =>
{
builder.UseEnvironment("Testing");
builder.ConfigureServices(services =>
{
services.RemoveAll();
services.AddSingleton(_mockAdminAuthService);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = AdminTestAuthHandler.AuthenticationScheme;
options.DefaultChallengeScheme = AdminTestAuthHandler.AuthenticationScheme;
})
.AddScheme(
AdminTestAuthHandler.AuthenticationScheme, options => { });
});
});
}
///
/// 测试管理员登录 - 成功场景
///
[Fact]
public async Task Login_WithValidCredentials_ReturnsSuccess()
{
// Arrange
var expectedResponse = new AdminLoginResponse
{
Token = "admin-jwt-token-123",
AdminId = 1,
Username = "admin",
RealName = "管理员",
Roles = new List { "admin" },
Permissions = new List { "user:list", "user:view" }
};
_mockAdminAuthService.LoginAsync("admin", "password123", Arg.Any())
.Returns(Task.FromResult(expectedResponse));
var client = _factory.CreateClient();
var request = new AdminLoginRequest
{
Username = "admin",
Password = "password123"
};
// Act
var response = await client.PostAsJsonAsync("/api/admin/auth/login", request);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize>(content,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Assert.NotNull(result);
Assert.Equal(0, result.Code);
Assert.NotNull(result.Data);
Assert.Equal(expectedResponse.AdminId, result.Data.AdminId);
Assert.Equal(expectedResponse.Username, result.Data.Username);
}
///
/// 测试获取管理员信息 - 未授权返回401
///
[Fact]
public async Task GetInfo_WithoutAuth_ReturnsUnauthorized()
{
// Arrange
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/admin/auth/info");
// Assert
Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
}
///
/// 测试获取管理员信息 - 授权后成功
///
[Fact]
public async Task GetInfo_WithAuth_ReturnsSuccess()
{
// Arrange
var expectedResponse = new AdminInfoResponse
{
AdminId = 1,
Username = "admin",
RealName = "管理员",
Roles = new List
{
new AdminRoleDto { RoleId = 1, RoleName = "超级管理员", RoleCode = "admin" }
},
Permissions = new List { "user:list", "user:view" }
};
_mockAdminAuthService.GetAdminInfoAsync(1)
.Returns(Task.FromResult(expectedResponse));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
// Act
var response = await client.GetAsync("/api/admin/auth/info");
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize>(content,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Assert.NotNull(result);
Assert.Equal(0, result.Code);
Assert.NotNull(result.Data);
Assert.Equal(expectedResponse.AdminId, result.Data.AdminId);
}
///
/// 测试获取菜单权限 - 成功
///
[Fact]
public async Task GetMenus_WithAuth_ReturnsSuccess()
{
// Arrange
var expectedMenus = new List
{
new AdminMenuResponse
{
MenuId = 1,
MenuName = "用户管理",
MenuType = 1,
Path = "/users",
Children = new List
{
new AdminMenuResponse
{
MenuId = 2,
ParentId = 1,
MenuName = "用户列表",
MenuType = 2,
Path = "/users/list"
}
}
}
};
_mockAdminAuthService.GetAdminMenusAsync(1)
.Returns(Task.FromResult(expectedMenus));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
// Act
var response = await client.GetAsync("/api/admin/auth/menus");
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize>>(content,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Assert.NotNull(result);
Assert.Equal(0, result.Code);
Assert.NotNull(result.Data);
Assert.Single(result.Data);
}
///
/// 测试退出登录 - 成功
///
[Fact]
public async Task Logout_WithAuth_ReturnsSuccess()
{
// Arrange
_mockAdminAuthService.LogoutAsync(1)
.Returns(Task.CompletedTask);
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
// Act
var response = await client.PostAsync("/api/admin/auth/logout", null);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize(content,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Assert.NotNull(result);
Assert.Equal(0, result.Code);
}
}