build-flow.api/tests/BuildFlow.IM.Tests/Chat/MarkMessagesReadCommandHandlerTests.cs

55 lines
1.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
/// <summary>
/// MarkMessagesReadCommandHandler 双写测试:PG 清零 + Redis 清零。
/// </summary>
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, ConversationType.Private,
(UserId, 7)));
await db.SaveChangesAsync();
var unreadCounter = new Mock<IUnreadCounter>();
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<CancellationToken>()),
Times.Once);
}
private static ImDbContext BuildInMemoryDb()
{
var services = new ServiceCollection();
services.AddDbContext<ImDbContext>(o => o.UseInMemoryDatabase($"im-read-{Guid.NewGuid()}"));
var db = services.BuildServiceProvider().GetRequiredService<ImDbContext>();
return db;
}
}