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