using System;
using System.Web.Http.Results;
using CncModels.Constants;
using CncModels.Dto;
using CncModels.Dto.Login;
using CncService;
using CncWebApi.Controllers;
using Xunit;
namespace CncWebApi.Tests
{
///
/// AuthController单元测试
/// 登录接口,无JWT过滤,验证登录成功/失败场景
///
[Collection("Database")]
public class AuthControllerTests
{
private readonly AuthController _controller;
private const string TestPassword = "admin123";
public AuthControllerTests()
{
TestDb.TruncateAll();
// 设置真实BCrypt密码哈希,确保密码验证可通过
TestDb.SetRealPasswordHash(TestPassword);
_controller = ControllerFactory.CreateAuthController();
}
#region Login - 登录
///
/// 测试:正确用户名和密码登录成功
///
[Fact]
public void Login_CorrectCredentials_ShouldReturnToken()
{
// Arrange
var request = new LoginRequest
{
Username = "admin",
Password = TestPassword,
RememberMe = false
};
// Act
var result = _controller.Login(request);
// Assert
var response = ControllerFactory.Extract(result);
ControllerFactory.AssertSuccess(response);
Assert.NotNull(response.Data);
Assert.False(string.IsNullOrWhiteSpace(response.Data.Token));
Assert.Equal(8 * 3600, response.Data.ExpiresIn); // 非记住密码,8小时
}
///
/// 测试:记住密码时Token过期时间为24小时
///
[Fact]
public void Login_RememberMe_ShouldReturn24HourToken()
{
// Arrange
var request = new LoginRequest
{
Username = "admin",
Password = TestPassword,
RememberMe = true
};
// Act
var result = _controller.Login(request);
// Assert
var response = ControllerFactory.Extract(result);
Assert.Equal(24 * 3600, response.Data.ExpiresIn);
}
///
/// 测试:错误密码登录失败
///
[Fact]
public void Login_WrongPassword_ShouldThrowBusinessException()
{
// Arrange
var request = new LoginRequest
{
Username = "admin",
Password = "wrong_password"
};
// Act & Assert
var ex = Assert.Throws(() => _controller.Login(request));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
Assert.Equal("用户名或密码错误", ex.Message);
}
///
/// 测试:错误用户名登录失败
///
[Fact]
public void Login_WrongUsername_ShouldThrowBusinessException()
{
// Arrange
var request = new LoginRequest
{
Username = "notexist",
Password = TestPassword
};
// Act & Assert
var ex = Assert.Throws(() => _controller.Login(request));
Assert.Equal("用户名或密码错误", ex.Message);
}
///
/// 测试:请求为null时抛出参数异常
///
[Fact]
public void Login_NullRequest_ShouldThrowBusinessException()
{
// Act & Assert
var ex = Assert.Throws(() => _controller.Login(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
///
/// 测试:用户名不区分大小写
///
[Fact]
public void Login_CaseInsensitiveUsername_ShouldReturnToken()
{
// Arrange
var request = new LoginRequest
{
Username = "ADMIN",
Password = TestPassword
};
// Act
var result = _controller.Login(request);
// Assert
var response = ControllerFactory.Extract(result);
ControllerFactory.AssertSuccess(response);
Assert.NotNull(response.Data.Token);
}
#endregion
}
}