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.
176 lines
5.5 KiB
C#
176 lines
5.5 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 UserServiceTests
|
|
{
|
|
private readonly Mock<IUserRepository> _mockUserRepository;
|
|
private readonly UserService _userService;
|
|
|
|
public UserServiceTests()
|
|
{
|
|
_mockUserRepository = new Mock<IUserRepository>();
|
|
_userService = new UserService(_mockUserRepository.Object);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CreateUserAsync_SetsCreatedAtAndUpdatedAt()
|
|
{
|
|
var user = new User { Username = "newuser", RealName = "New User", Email = "new@example.com" };
|
|
_mockUserRepository.Setup(r => r.AddAsync(It.IsAny<User>())).Returns(Task.CompletedTask);
|
|
_mockUserRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
|
|
|
|
var beforeCreate = DateTime.Now;
|
|
var result = await _userService.CreateUserAsync(user);
|
|
var afterCreate = DateTime.Now;
|
|
|
|
result.CreatedAt.Should().BeOnOrAfter(beforeCreate);
|
|
result.CreatedAt.Should().BeOnOrBefore(afterCreate);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetUserByIdAsync_ReturnsUserViewModel_WhenExists()
|
|
{
|
|
var user = new User
|
|
{
|
|
Id = 1,
|
|
Username = "admin",
|
|
RealName = "Administrator",
|
|
Email = "admin@example.com",
|
|
Role = new Role { RoleName = "Admin" }
|
|
};
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(user);
|
|
|
|
var result = await _userService.GetUserByIdAsync(1);
|
|
|
|
result.Should().NotBeNull();
|
|
result!.Username.Should().Be("admin");
|
|
result.RealName.Should().Be("Administrator");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetUserByIdAsync_ReturnsNull_WhenNotExists()
|
|
{
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((User?)null);
|
|
|
|
var result = await _userService.GetUserByIdAsync(999);
|
|
|
|
result.Should().BeNull();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetAllUsersAsync_ReturnsAllUsers()
|
|
{
|
|
var users = new List<User>
|
|
{
|
|
new User { Id = 1, Username = "user1", RealName = "User 1" },
|
|
new User { Id = 2, Username = "user2", RealName = "User 2" }
|
|
};
|
|
_mockUserRepository.Setup(r => r.GetAllAsync()).ReturnsAsync(users);
|
|
|
|
var result = await _userService.GetAllUsersAsync();
|
|
|
|
result.Should().HaveCount(2);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task UpdateUserAsync_UpdatesUser_WhenExists()
|
|
{
|
|
var existing = new User
|
|
{
|
|
Id = 1,
|
|
Username = "admin",
|
|
RealName = "Original Name",
|
|
Email = "original@example.com"
|
|
};
|
|
var updateData = new User
|
|
{
|
|
RealName = "Updated Name",
|
|
Email = "updated@example.com",
|
|
Department = "IT",
|
|
RoleId = 2
|
|
};
|
|
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(existing);
|
|
_mockUserRepository.Setup(r => r.Update(It.IsAny<User>())).Verifiable();
|
|
_mockUserRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
|
|
|
|
var result = await _userService.UpdateUserAsync(1, updateData);
|
|
|
|
result.Should().NotBeNull();
|
|
result!.RealName.Should().Be("Updated Name");
|
|
result.Email.Should().Be("updated@example.com");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task UpdateUserAsync_ReturnsNull_WhenNotExists()
|
|
{
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((User?)null);
|
|
|
|
var result = await _userService.UpdateUserAsync(999, new User());
|
|
|
|
result.Should().BeNull();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ActivateUserAsync_ReturnsTrue_WhenUserExists()
|
|
{
|
|
var user = new User { Id = 1, IsActive = false };
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(user);
|
|
_mockUserRepository.Setup(r => r.Update(It.IsAny<User>())).Verifiable();
|
|
_mockUserRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
|
|
|
|
var result = await _userService.ActivateUserAsync(1);
|
|
|
|
result.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ActivateUserAsync_ReturnsFalse_WhenUserNotExists()
|
|
{
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((User?)null);
|
|
|
|
var result = await _userService.ActivateUserAsync(999);
|
|
|
|
result.Should().BeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeactivateUserAsync_ReturnsTrue_WhenUserExists()
|
|
{
|
|
var user = new User { Id = 1, IsActive = true };
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(user);
|
|
_mockUserRepository.Setup(r => r.Update(It.IsAny<User>())).Verifiable();
|
|
_mockUserRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
|
|
|
|
var result = await _userService.DeactivateUserAsync(1);
|
|
|
|
result.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeactivateUserAsync_ReturnsFalse_WhenUserNotExists()
|
|
{
|
|
_mockUserRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((User?)null);
|
|
|
|
var result = await _userService.DeactivateUserAsync(999);
|
|
|
|
result.Should().BeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ChangePasswordAsync_CallsRepository()
|
|
{
|
|
_mockUserRepository.Setup(r => r.ChangePasswordAsync(1, "old", "new")).ReturnsAsync(true);
|
|
|
|
var result = await _userService.ChangePasswordAsync(1, "old", "new");
|
|
|
|
result.Should().BeTrue();
|
|
_mockUserRepository.Verify(r => r.ChangePasswordAsync(1, "old", "new"), Times.Once);
|
|
}
|
|
} |