using BuildFlow.Application.Users.Handlers;
using BuildFlow.Application.Users.Queries;
using BuildFlow.Domain.Entities;
using BuildFlow.Infrastructure.Persistence;
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace BuildFlow.Rag.Tests.Users;
///
/// 用户列表查询处理器单元测试。覆盖无搜索、关键字搜索、空表三个场景。
///
public class GetUserListQueryHandlerTests
{
/// 创建 InMemory 数据库 + 种子用户。
private static async Task<(RagDbContext db, GetUserListQueryHandler handler)> SetupAsync()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"userlist-{Guid.NewGuid()}")
.Options;
var db = new RagDbContext(options);
db.Users.AddRange(
new User { Id = Guid.NewGuid(), Username = "zhangsan", Email = "z@e.com", PasswordHash = "x", IsActive = true, CreatedBy = "s", UpdatedBy = "s", OperatorIP = "0" },
new User { Id = Guid.NewGuid(), Username = "lisi", Email = "l@e.com", PasswordHash = "x", IsActive = true, CreatedBy = "s", UpdatedBy = "s", OperatorIP = "0" },
new User { Id = Guid.NewGuid(), Username = "wangwu", Email = "w@e.com", PasswordHash = "x", IsActive = false, CreatedBy = "s", UpdatedBy = "s", OperatorIP = "0" }
);
await db.SaveChangesAsync();
var handler = new GetUserListQueryHandler(db);
return (db, handler);
}
[Fact]
public async Task GetUserList_WithoutSearch_ReturnsAllUsers()
{
// Arrange
var (db, handler) = await SetupAsync();
// Act
var result = await handler.Handle(new GetUserListQuery(null), CancellationToken.None);
// Assert
result.Should().HaveCount(3);
}
[Fact]
public async Task GetUserList_WithSearch_ReturnsFilteredUsers()
{
// Arrange
var (db, handler) = await SetupAsync();
// Act
var result = await handler.Handle(new GetUserListQuery("zhang"), CancellationToken.None);
// Assert
result.Should().HaveCount(1);
result[0].Username.Should().Be("zhangsan");
}
[Fact]
public async Task GetUserList_OnEmptyDatabase_ReturnsEmptyList()
{
// Arrange
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"userlist-empty-{Guid.NewGuid()}")
.Options;
var db = new RagDbContext(options);
var handler = new GetUserListQueryHandler(db);
// Act
var result = await handler.Handle(new GetUserListQuery(null), CancellationToken.None);
// Assert
result.Should().BeEmpty();
}
}