using BuildFlow.Shared.Domain.Errors; using BuildFlow.Shared.Domain.Exceptions; using FluentAssertions; using IM.Application.Chat.Commands; using IM.Application.Chat.Handlers; using IM.Infrastructure.Persistence; using Xunit; namespace BuildFlow.IM.Tests.Chat; /// /// UpdateGroupCommandHandler:群不存在 NotFound;普通成员改群信息 Business;群主改群名成功。 /// public class UpdateGroupCommandHandlerTests { 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_not_found_when_group_missing() { await using var db = IMTestDb.Create(); var handler = new UpdateGroupCommandHandler(db); var act = async () => await handler.Handle(new UpdateGroupCommand(Guid.NewGuid(), OwnerId, "x", null, null), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.NotFound); } [Fact] public async Task Throws_business_when_operator_is_member() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var handler = new UpdateGroupCommandHandler(db); var act = async () => await handler.Handle(new UpdateGroupCommand(groupId, MemberId, "new", null, null), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.Business); } [Fact] public async Task Owner_updates_name() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var handler = new UpdateGroupCommandHandler(db); var result = await handler.Handle(new UpdateGroupCommand(groupId, OwnerId, "renamed", null, null), CancellationToken.None); result.Name.Should().Be("renamed"); var g = await db.Groups.FindAsync(groupId); g.Should().NotBeNull(); g!.Name.Should().Be("renamed"); } }