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; /// /// CreateGroupCommandHandler 成功路径:建群+会话+成员,群主 Owner 角色,成员去重。 /// public class CreateGroupCommandHandlerTests { private static readonly Guid OwnerId = Guid.Parse("22222222-2222-2222-2222-222222222222"); private static readonly Guid MemberA = Guid.Parse("33333333-3333-3333-3333-333333333333"); private static readonly Guid MemberB = Guid.Parse("30000000-0000-0000-0000-000000000001"); [Fact] public async Task Creates_group_with_owner_and_members() { await using var db = IMTestDb.Create(); var handler = new CreateGroupCommandHandler(db); var result = await handler.Handle( new CreateGroupCommand("group-1", null, "desc", OwnerId, new List { MemberA, MemberB }), CancellationToken.None); result.Name.Should().Be("group-1"); result.OwnerId.Should().Be(OwnerId); result.MemberCount.Should().Be(3); (await db.Groups.CountAsync()).Should().Be(1); (await db.ConversationParticipants.CountAsync(p => p.ConversationId == result.ConversationId)).Should().Be(3); (await db.GroupMembers.CountAsync(m => m.GroupId == result.Id && m.Role == GroupMemberRoleEnum.Owner)).Should().Be(1); } [Fact] public async Task Dedups_owner_inside_member_list() { await using var db = IMTestDb.Create(); var handler = new CreateGroupCommandHandler(db); var result = await handler.Handle( new CreateGroupCommand("group-2", null, null, OwnerId, new List { OwnerId, MemberA }), CancellationToken.None); result.MemberCount.Should().Be(2); (await db.GroupMembers.CountAsync(m => m.GroupId == result.Id)).Should().Be(2); } }