using BuildFlow.Platform.Application.Users.DTOs; using BuildFlow.Platform.Application.Users.Queries; 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 MediatR; using Moq; using Xunit; namespace BuildFlow.IM.Tests.Chat; /// /// GetGroupMembersQueryHandler:非群成员拒绝(Forbidden);群成员返回成员列表含角色。 /// public class GetGroupMembersQueryHandlerTests { private static readonly Guid OwnerId = Guid.Parse("22222222-2222-2222-2222-222222222222"); private static readonly Guid MemberId = Guid.Parse("33333333-3333-3333-3333-333333333333"); private const string Name = "group-1"; [Fact] public async Task Throws_forbidden_when_not_member() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var handler = new GetGroupMembersQueryHandler(db, new Mock().Object); var act = async () => await handler.Handle(new GetGroupMembersQuery(Guid.NewGuid(), groupId), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.Forbidden); } [Fact] public async Task Returns_members_with_roles() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var mediator = new Mock(); mediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) .ReturnsAsync(new Dictionary()); var handler = new GetGroupMembersQueryHandler(db, mediator.Object); var result = await handler.Handle(new GetGroupMembersQuery(OwnerId, groupId), CancellationToken.None); result.Should().HaveCount(2); result.Should().Contain(m => m.UserId == OwnerId && m.Role == GroupMemberRoleEnum.Owner); result.Should().Contain(m => m.UserId == MemberId && m.Role == GroupMemberRoleEnum.Member); } }