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