You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/tests/CncWebApi.Tests/AuthControllerTests.cs

152 lines
4.5 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// AuthController单元测试
/// 登录接口无JWT过滤验证登录成功/失败场景
/// </summary>
[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 - 登录
/// <summary>
/// 测试:正确用户名和密码登录成功
/// </summary>
[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<LoginResponse>(result);
ControllerFactory.AssertSuccess(response);
Assert.NotNull(response.Data);
Assert.False(string.IsNullOrWhiteSpace(response.Data.Token));
Assert.Equal(8 * 3600, response.Data.ExpiresIn); // 非记住密码8小时
}
/// <summary>
/// 测试记住密码时Token过期时间为24小时
/// </summary>
[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<LoginResponse>(result);
Assert.Equal(24 * 3600, response.Data.ExpiresIn);
}
/// <summary>
/// 测试:错误密码登录失败
/// </summary>
[Fact]
public void Login_WrongPassword_ShouldThrowBusinessException()
{
// Arrange
var request = new LoginRequest
{
Username = "admin",
Password = "wrong_password"
};
// Act & Assert
var ex = Assert.Throws<BusinessException>(() => _controller.Login(request));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
Assert.Equal("用户名或密码错误", ex.Message);
}
/// <summary>
/// 测试:错误用户名登录失败
/// </summary>
[Fact]
public void Login_WrongUsername_ShouldThrowBusinessException()
{
// Arrange
var request = new LoginRequest
{
Username = "notexist",
Password = TestPassword
};
// Act & Assert
var ex = Assert.Throws<BusinessException>(() => _controller.Login(request));
Assert.Equal("用户名或密码错误", ex.Message);
}
/// <summary>
/// 测试请求为null时抛出参数异常
/// </summary>
[Fact]
public void Login_NullRequest_ShouldThrowBusinessException()
{
// Act & Assert
var ex = Assert.Throws<BusinessException>(() => _controller.Login(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
/// <summary>
/// 测试:用户名不区分大小写
/// </summary>
[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<LoginResponse>(result);
ControllerFactory.AssertSuccess(response);
Assert.NotNull(response.Data.Token);
}
#endregion
}
}