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