using BuildFlow.Platform.Application.Users.DTOs; using BuildFlow.Platform.Application.Users.Handlers; using BuildFlow.Platform.Application.Users.Queries; using File.Application.Features.Files.DTOs; using File.Application.Features.Files.Queries; using MediatR; using NSubstitute; using Xunit; namespace BuildFlow.Platform.Tests.Users; /// /// 批量用户摘要查询测试。覆盖去重、缺失用户过滤、头像返回和空输入短路。 /// public class GetUserSummariesQueryHandlerTests { [Fact] public async Task Handle_ShouldReturnDistinctExistingUsersByGuid() { await using var db = PlatformTestDb.CreateDbContext(); var aliceId = Guid.NewGuid(); var bobId = Guid.NewGuid(); var missingId = Guid.NewGuid(); var alice = await PlatformTestDb.SeedUserAsync(db, aliceId, "alice"); var bob = await PlatformTestDb.SeedUserAsync(db, bobId, "bob"); alice.Avatar = "avatars/alice.png"; bob.Avatar = null; await db.SaveChangesAsync(); var mediator = Substitute.For(); mediator.Send(Arg.Any(), Arg.Any()) .Returns(Task.FromResult>( [ new("avatars/alice.png", "/api/files/preview?objectKey=avatars%2Falice.png") ])); var handler = new GetUserSummariesQueryHandler(db, mediator); var result = await handler.Handle( new GetUserSummariesQuery([aliceId, bobId, aliceId, missingId]), CancellationToken.None); Assert.Equal(2, result.Count); Assert.Equal(new UserSummaryDto( aliceId, "alice", "/api/files/preview?objectKey=avatars%2Falice.png"), result[aliceId]); Assert.Equal(new UserSummaryDto(bobId, "bob", null), result[bobId]); Assert.False(result.ContainsKey(missingId)); await mediator.Received(1).Send( Arg.Is(query => query.References.SequenceEqual(new string?[] { "avatars/alice.png" })), Arg.Any()); } [Fact] public async Task Handle_EmptyIds_ShouldReturnEmptyResult() { await using var db = PlatformTestDb.CreateDbContext(); var mediator = Substitute.For(); var handler = new GetUserSummariesQueryHandler(db, mediator); var result = await handler.Handle(new GetUserSummariesQuery([]), CancellationToken.None); Assert.Empty(result); Assert.Empty(mediator.ReceivedCalls()); } }