using BuildFlow.Shared.Domain.Errors;
using BuildFlow.Shared.Domain.Exceptions;
using FluentAssertions;
using IM.Application.Chat.Handlers;
using IM.Application.Chat.Queries;
using IM.Domain.Enums;
using IM.Infrastructure.Persistence;
using Xunit;
namespace BuildFlow.IM.Tests.Chat;
///
/// GetConversationParticipantIdsQueryHandler:成员返回参与者 ID 列表;请求者非参与者拒绝(Forbidden)。
///
public class GetConversationParticipantIdsQueryHandlerTests
{
private static readonly Guid UserId = Guid.Parse("22222222-2222-2222-2222-222222222222");
private static readonly Guid Other = Guid.Parse("33333333-3333-3333-3333-333333333333");
private static readonly Guid ConvId = Guid.Parse("11111111-1111-1111-1111-111111111111");
[Fact]
public async Task Returns_participant_ids_for_member()
{
await using var db = IMTestDb.Create();
db.Conversations.Add(ImTestData.BuildConversation(ConvId, ConversationTypeEnum.Private, (UserId, 0), (Other, 0)));
await db.SaveChangesAsync();
var handler = new GetConversationParticipantIdsQueryHandler(db);
var result = await handler.Handle(new GetConversationParticipantIdsQuery(ConvId, UserId), CancellationToken.None);
result.Should().BeEquivalentTo(new[] { UserId, Other });
}
[Fact]
public async Task Throws_forbidden_when_requester_not_participant()
{
await using var db = IMTestDb.Create();
db.Conversations.Add(ImTestData.BuildConversation(ConvId, ConversationTypeEnum.Private, (Other, 0)));
await db.SaveChangesAsync();
var handler = new GetConversationParticipantIdsQueryHandler(db);
var act = async () => await handler.Handle(new GetConversationParticipantIdsQuery(ConvId, UserId), CancellationToken.None);
var ex = await act.Should().ThrowAsync();
ex.Which.Code.Should().Be(ErrorCode.Forbidden);
}
}