using BuildFlow.Platform.Application.Auth.Commands; using BuildFlow.Platform.Application.Auth.Handlers; using File.Application.Features.Files.DTOs; using File.Application.Features.Files.Queries; using MediatR; using Microsoft.EntityFrameworkCore; using NSubstitute; using Xunit; namespace BuildFlow.Platform.Tests.Auth; /// /// 更新个人资料测试。数据库保留对象键,响应头像通过 File Application 路径查询解析。 /// public class UpdateProfileCommandHandlerTests { [Fact] public async Task Handle_ShouldPersistAvatarReferenceAndReturnResolvedPath() { await using var db = PlatformTestDb.CreateDbContext(); var userId = Guid.NewGuid(); await PlatformTestDb.SeedUserAsync(db, userId, "alice"); var mediator = Substitute.For(); mediator.Send(Arg.Any(), Arg.Any()) .Returns(Task.FromResult>( [ new("avatars/alice-new.png", "/api/files/preview?objectKey=avatars%2Falice-new.png") ])); var handler = new UpdateProfileCommandHandler(db, mediator); var result = await handler.Handle(new UpdateProfileCommand( userId.ToString(), "Alice Zhang", "avatars/alice-new.png", "BuildFlow user"), CancellationToken.None); var persisted = await db.Users.SingleAsync(user => user.Id == userId); Assert.Equal("avatars/alice-new.png", persisted.Avatar); Assert.Equal("/api/files/preview?objectKey=avatars%2Falice-new.png", result.Avatar); await mediator.Received(1).Send( Arg.Is(query => query.References.SequenceEqual(new string?[] { "avatars/alice-new.png" })), Arg.Any()); } }