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