using IM.Application.Chat.Commands; using IM.Application.Chat.Handlers; using IM.Domain.Common; using IM.Domain.Enums; using IM.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Moq; using Xunit; namespace BuildFlow.IM.Tests.Chat; /// /// MarkMessagesReadCommandHandler 双写测试:PG 清零 + Redis 清零。 /// public class MarkMessagesReadCommandHandlerTests { private static readonly Guid ConversationId = Guid.Parse("11111111-1111-1111-1111-111111111111"); private static readonly Guid UserId = Guid.Parse("22222222-2222-2222-2222-222222222222"); [Fact] public async Task Resets_pg_unread_and_calls_redis_reset() { await using var db = BuildInMemoryDb(); db.Conversations.Add(ImTestData.BuildConversation(ConversationId, ConversationTypeEnum.Private, (UserId, 7))); await db.SaveChangesAsync(); var unreadCounter = new Mock(); var handler = new MarkMessagesReadCommandHandler(db, unreadCounter.Object); await handler.Handle( new MarkMessagesReadCommand(ConversationId, UserId, "650000000000000000000000"), CancellationToken.None); // PG 清零 var p = await db.ConversationParticipants.FirstAsync(x => x.UserId == UserId); Assert.Equal(0, p.UnreadCount); Assert.Equal("650000000000000000000000", p.LastReadMessageId); // Redis 清零被调用一次 unreadCounter.Verify( c => c.ResetAsync(ConversationId, UserId, It.IsAny()), Times.Once); } private static ImDbContext BuildInMemoryDb() { var services = new ServiceCollection(); services.AddDbContext(o => o.UseInMemoryDatabase($"im-read-{Guid.NewGuid()}")); var db = services.BuildServiceProvider().GetRequiredService(); return db; } }