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 Microsoft.EntityFrameworkCore; using Xunit; namespace BuildFlow.IM.Tests.Chat; /// /// DeleteGroupCommandHandler:群不存在 NotFound;非群主 Business;群主解散成功(记录不可再查得)。 /// public class DeleteGroupCommandHandlerTests { 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 DeleteGroupCommandHandler(db); var act = async () => await handler.Handle(new DeleteGroupCommand(Guid.NewGuid(), OwnerId), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.NotFound); } [Fact] public async Task Throws_business_when_not_owner() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var handler = new DeleteGroupCommandHandler(db); var act = async () => await handler.Handle(new DeleteGroupCommand(groupId, MemberId), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.Business); } [Fact] public async Task Owner_deletes_group() { await using var db = IMTestDb.Create(); var (_, groupId) = await IMTestDb.SeedGroupAsync(db, Name, OwnerId, MemberId); var handler = new DeleteGroupCommandHandler(db); await handler.Handle(new DeleteGroupCommand(groupId, OwnerId), CancellationToken.None); (await db.Groups.AnyAsync(g => g.Id == groupId)).Should().BeFalse(); } }