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.

134 lines
4.1 KiB
C#

using Xunit;
using Moq;
using FluentAssertions;
using Haoliang.Core.Services;
using Haoliang.Models.User;
using Haoliang.Data.Repositories;
namespace Haoliang.Tests;
public class AuthServiceTests
{
private readonly Mock<IUserRepository> _mockUserRepository;
private readonly Mock<ICacheService> _mockCacheService;
private readonly AuthService _authService;
public AuthServiceTests()
{
_mockUserRepository = new Mock<IUserRepository>();
_mockCacheService = new Mock<ICacheService>();
_authService = new AuthService(_mockUserRepository.Object, _mockCacheService.Object);
}
[Fact]
public async Task LoginAsync_ReturnsSuccess_WhenCredentialsValid()
{
var request = new LoginRequest { Username = "admin", Password = "password" };
var user = new User
{
Id = 1,
Username = "admin",
RealName = "Administrator",
Role = new Role { RoleName = "Admin", Permissions = new List<string> { "read", "write" } }
};
_mockUserRepository.Setup(r => r.AuthenticateAsync("admin", "password")).ReturnsAsync(user);
var result = await _authService.LoginAsync(request);
result.Success.Should().BeTrue();
result.User.Should().NotBeNull();
result.User!.Username.Should().Be("admin");
result.Permissions.Should().Contain("read");
}
[Fact]
public async Task LoginAsync_ReturnsFailure_WhenCredentialsInvalid()
{
var request = new LoginRequest { Username = "admin", Password = "wrongpassword" };
_mockUserRepository.Setup(r => r.AuthenticateAsync("admin", "wrongpassword")).ReturnsAsync((User?)null);
var result = await _authService.LoginAsync(request);
result.Success.Should().BeFalse();
result.Message.Should().Be("用户名或密码错误");
}
[Fact]
public async Task LogoutAsync_ReturnsTrue()
{
var result = await _authService.LogoutAsync(1);
result.Should().BeTrue();
}
[Fact]
public async Task RefreshTokenAsync_ReturnsNull()
{
var result = await _authService.RefreshTokenAsync("someRefreshToken");
result.Should().BeNull();
}
[Fact]
public async Task UsernameExistsAsync_ReturnsTrue_WhenExists()
{
_mockUserRepository.Setup(r => r.UsernameExistsAsync("admin")).ReturnsAsync(true);
var result = await _authService.UsernameExistsAsync("admin");
result.Should().BeTrue();
}
[Fact]
public async Task UsernameExistsAsync_ReturnsFalse_WhenNotExists()
{
_mockUserRepository.Setup(r => r.UsernameExistsAsync("nonexistent")).ReturnsAsync(false);
var result = await _authService.UsernameExistsAsync("nonexistent");
result.Should().BeFalse();
}
[Fact]
public async Task EmailExistsAsync_ReturnsTrue_WhenExists()
{
_mockUserRepository.Setup(r => r.EmailExistsAsync("admin@example.com")).ReturnsAsync(true);
var result = await _authService.EmailExistsAsync("admin@example.com");
result.Should().BeTrue();
}
[Fact]
public async Task EmailExistsAsync_ReturnsFalse_WhenNotExists()
{
_mockUserRepository.Setup(r => r.EmailExistsAsync("nonexistent@example.com")).ReturnsAsync(false);
var result = await _authService.EmailExistsAsync("nonexistent@example.com");
result.Should().BeFalse();
}
[Fact]
public async Task GetUserByIdAsync_ReturnsUser_WhenExists()
{
var user = new User { Id = 1, Username = "admin", RealName = "Administrator" };
_mockUserRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(user);
var result = await _authService.GetUserByIdAsync(1);
result.Should().NotBeNull();
result!.Id.Should().Be(1);
result.Username.Should().Be("admin");
}
[Fact]
public async Task GetUserByIdAsync_ReturnsNull_WhenNotExists()
{
_mockUserRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((User?)null);
var result = await _authService.GetUserByIdAsync(999);
result.Should().BeNull();
}
}