55 lines
1.9 KiB
C#
55 lines
1.9 KiB
C#
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;
|
||
}
|
||
}
|