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.

348 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Moq;
using FluentAssertions;
using Xunit;
using Haoliang.Api.Controllers;
using Haoliang.Core.Services;
using Haoliang.Models.Common;
using Haoliang.Models.User;
namespace Haoliang.Tests.Controllers
{
public class AuthControllerTests
{
private readonly Mock<IAuthService> _authService;
private readonly Mock<IUserService> _userService;
private readonly Mock<IPermissionService> _permissionService;
private readonly Mock<ILoggingService> _loggingService;
private readonly AuthController _controller;
public AuthControllerTests()
{
_authService = new Mock<IAuthService>();
_userService = new Mock<IUserService>();
_permissionService = new Mock<IPermissionService>();
_loggingService = new Mock<ILoggingService>();
_controller = new AuthController(
_authService.Object,
_userService.Object,
_permissionService.Object,
_loggingService.Object);
}
// Login
[Fact]
public async Task Login_WhenSuccess_ReturnsOk()
{
var authResult = new AuthResult { Success = true, Token = "token123" };
_authService.Setup(s => s.LoginAsync(It.IsAny<LoginRequest>()))
.ReturnsAsync(authResult);
var result = await _controller.Login(new LoginRequest { Username = "admin", Password = "pass" });
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task Login_WhenFailed_ReturnsUnauthorized()
{
var authResult = new AuthResult { Success = false };
_authService.Setup(s => s.LoginAsync(It.IsAny<LoginRequest>()))
.ReturnsAsync(authResult);
var result = await _controller.Login(new LoginRequest { Username = "admin", Password = "wrong" });
result.Should().BeOfType<UnauthorizedObjectResult>();
}
[Fact]
public async Task Login_WhenException_Returns500()
{
_authService.Setup(s => s.LoginAsync(It.IsAny<LoginRequest>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.Login(new LoginRequest { Username = "admin", Password = "pass" });
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// Logout
[Fact]
public async Task Logout_WhenSuccess_ReturnsOk()
{
_authService.Setup(s => s.LogoutAsync(1))
.ReturnsAsync(true);
var result = await _controller.Logout(new LogoutRequest { UserId = 1 });
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task Logout_WhenFailed_ReturnsBadRequest()
{
_authService.Setup(s => s.LogoutAsync(1))
.ReturnsAsync(false);
var result = await _controller.Logout(new LogoutRequest { UserId = 1 });
result.Should().BeOfType<BadRequestObjectResult>();
}
[Fact]
public async Task Logout_WhenInvalidUserId_ReturnsBadRequest()
{
var result = await _controller.Logout(new LogoutRequest { UserId = 0 });
result.Should().BeOfType<BadRequestObjectResult>();
}
[Fact]
public async Task Logout_WhenException_Returns500()
{
_authService.Setup(s => s.LogoutAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.Logout(new LogoutRequest { UserId = 1 });
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// RefreshToken
[Fact]
public async Task RefreshToken_WhenSuccess_ReturnsOk()
{
var authResult = new AuthResult { Success = true, Token = "newtoken" };
_authService.Setup(s => s.RefreshTokenAsync("refresh123"))
.ReturnsAsync(authResult);
var result = await _controller.RefreshToken(new RefreshTokenRequest { RefreshToken = "refresh123" });
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task RefreshToken_WhenFailed_ReturnsUnauthorized()
{
var authResult = new AuthResult { Success = false };
_authService.Setup(s => s.RefreshTokenAsync(It.IsAny<string>()))
.ReturnsAsync(authResult);
var result = await _controller.RefreshToken(new RefreshTokenRequest { RefreshToken = "invalid" });
result.Should().BeOfType<UnauthorizedObjectResult>();
}
[Fact]
public async Task RefreshToken_WhenException_Returns500()
{
_authService.Setup(s => s.RefreshTokenAsync(It.IsAny<string>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.RefreshToken(new RefreshTokenRequest { RefreshToken = "token" });
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// Register
[Fact]
public async Task Register_WhenSuccess_ReturnsOk()
{
_authService.Setup(s => s.UsernameExistsAsync(It.IsAny<string>()))
.ReturnsAsync(false);
_authService.Setup(s => s.EmailExistsAsync(It.IsAny<string>()))
.ReturnsAsync(false);
_userService.Setup(s => s.CreateUserAsync(It.IsAny<User>()))
.ReturnsAsync(new UserViewModel { Id = 1, Username = "newuser" });
var result = await _controller.Register(new RegisterRequest
{
Username = "newuser",
Email = "new@test.com",
Password = "pass123",
ConfirmPassword = "pass123"
});
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task Register_WhenUsernameExists_ReturnsBadRequest()
{
_authService.Setup(s => s.UsernameExistsAsync("existing"))
.ReturnsAsync(true);
var result = await _controller.Register(new RegisterRequest { Username = "existing", Email = "e@t.com", Password = "p", ConfirmPassword = "p" });
result.Should().BeOfType<BadRequestObjectResult>();
}
[Fact]
public async Task Register_WhenEmailExists_ReturnsBadRequest()
{
_authService.Setup(s => s.UsernameExistsAsync(It.IsAny<string>()))
.ReturnsAsync(false);
_authService.Setup(s => s.EmailExistsAsync("existing@test.com"))
.ReturnsAsync(true);
var result = await _controller.Register(new RegisterRequest { Username = "new", Email = "existing@test.com", Password = "p", ConfirmPassword = "p" });
result.Should().BeOfType<BadRequestObjectResult>();
}
// GetProfile - GetCurrentUserId() returns null in test context
[Fact]
public async Task GetProfile_WhenNotAuthenticated_ReturnsUnauthorized()
{
// GetCurrentUserId() returns null by default (no JWT middleware in tests)
var result = await _controller.GetProfile();
result.Should().BeOfType<UnauthorizedObjectResult>();
}
// GetUserPermissions - same issue with GetCurrentUserId
[Fact]
public async Task GetUserPermissions_WhenNotAuthenticated_ReturnsUnauthorized()
{
var result = await _controller.GetUserPermissions();
result.Should().BeOfType<UnauthorizedObjectResult>();
}
// GetAllUsers
[Fact]
public async Task GetAllUsers_WhenSuccess_ReturnsOk()
{
_userService.Setup(s => s.GetAllUsersAsync())
.ReturnsAsync(new List<UserViewModel>());
var result = await _controller.GetAllUsers(new UserFilter());
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task GetAllUsers_WhenException_Returns500()
{
_userService.Setup(s => s.GetAllUsersAsync())
.ThrowsAsync(new Exception("test"));
var result = await _controller.GetAllUsers(new UserFilter());
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// GetUserById
[Fact]
public async Task GetUserById_WhenFound_ReturnsOk()
{
_userService.Setup(s => s.GetUserByIdAsync(1))
.ReturnsAsync(new UserViewModel { Id = 1 });
var result = await _controller.GetUserById(1);
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task GetUserById_WhenNotFound_ReturnsNotFound()
{
_userService.Setup(s => s.GetUserByIdAsync(999))
.ReturnsAsync((UserViewModel?)null);
var result = await _controller.GetUserById(999);
result.Should().BeOfType<NotFoundObjectResult>();
}
[Fact]
public async Task GetUserById_WhenException_Returns500()
{
_userService.Setup(s => s.GetUserByIdAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.GetUserById(1);
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// ActivateUser
[Fact]
public async Task ActivateUser_WhenSuccess_ReturnsOk()
{
_userService.Setup(s => s.ActivateUserAsync(1))
.ReturnsAsync(true);
var result = await _controller.ActivateUser(1);
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task ActivateUser_WhenFailed_ReturnsBadRequest()
{
_userService.Setup(s => s.ActivateUserAsync(999))
.ReturnsAsync(false);
var result = await _controller.ActivateUser(999);
result.Should().BeOfType<BadRequestObjectResult>();
}
[Fact]
public async Task ActivateUser_WhenException_Returns500()
{
_userService.Setup(s => s.ActivateUserAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.ActivateUser(1);
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
// DeactivateUser
[Fact]
public async Task DeactivateUser_WhenSuccess_ReturnsOk()
{
_userService.Setup(s => s.DeactivateUserAsync(1))
.ReturnsAsync(true);
var result = await _controller.DeactivateUser(1);
result.Should().BeOfType<OkObjectResult>();
}
[Fact]
public async Task DeactivateUser_WhenFailed_ReturnsBadRequest()
{
_userService.Setup(s => s.DeactivateUserAsync(999))
.ReturnsAsync(false);
var result = await _controller.DeactivateUser(999);
result.Should().BeOfType<BadRequestObjectResult>();
}
[Fact]
public async Task DeactivateUser_WhenException_Returns500()
{
_userService.Setup(s => s.DeactivateUserAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("test"));
var result = await _controller.DeactivateUser(1);
var objResult = result.Should().BeOfType<ObjectResult>().Subject;
objResult.StatusCode.Should().Be(500);
}
}
}