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(); } }