using BuildFlow.Shared.Domain.Errors;
using BuildFlow.Shared.Domain.Exceptions;
using FluentAssertions;
using IM.Application.Chat.Commands;
using IM.Application.Chat.Handlers;
using IM.Domain.Enums;
using IM.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace BuildFlow.IM.Tests.Chat;
///
/// SetConversationRemarkCommandHandler:成功置备注 / 空白清空备注 / 参与者不存在抛 NotFound。
///
public class SetConversationRemarkCommandHandlerTests
{
private static readonly Guid UserId = Guid.Parse("22222222-2222-2222-2222-222222222222");
private static readonly Guid ConvId = Guid.Parse("11111111-1111-1111-1111-111111111111");
[Fact]
public async Task Sets_remark_for_participant()
{
await using var db = IMTestDb.Create();
db.Conversations.Add(ImTestData.BuildConversation(ConvId, ConversationTypeEnum.Private, (UserId, 0)));
await db.SaveChangesAsync();
var handler = new SetConversationRemarkCommandHandler(db);
await handler.Handle(new SetConversationRemarkCommand(ConvId, UserId, "老板"), CancellationToken.None);
var p = await db.ConversationParticipants.FirstAsync(x => x.ConversationId == ConvId && x.UserId == UserId);
p.Remark.Should().Be("老板");
}
[Fact]
public async Task Clears_remark_when_blank()
{
await using var db = IMTestDb.Create();
db.Conversations.Add(ImTestData.BuildConversation(ConvId, ConversationTypeEnum.Private, (UserId, 0)));
await db.SaveChangesAsync();
var handler = new SetConversationRemarkCommandHandler(db);
await handler.Handle(new SetConversationRemarkCommand(ConvId, UserId, ""), CancellationToken.None);
var p = await db.ConversationParticipants.FirstAsync(x => x.ConversationId == ConvId && x.UserId == UserId);
p.Remark.Should().BeNull();
}
[Fact]
public async Task Throws_not_found_when_participant_missing()
{
await using var db = IMTestDb.Create();
var handler = new SetConversationRemarkCommandHandler(db);
var act = async () => await handler.Handle(new SetConversationRemarkCommand(ConvId, UserId, "x"), CancellationToken.None);
var ex = await act.Should().ThrowAsync();
ex.Which.Code.Should().Be(ErrorCode.NotFound);
}
}