using IM.Application.Chat.Handlers;
using IM.Application.Chat.Queries;
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;
///
/// GetUnreadCountQueryHandler 的读扩散断言:Redis 命中必须能独立驱动未读汇总。
///
public class GetUnreadCountQueryHandlerTests
{
private static readonly Guid UserId = Guid.Parse("22222222-2222-2222-2222-222222222222");
private static readonly Guid OtherUserId = Guid.Parse("33333333-3333-3333-3333-333333333333");
private static readonly Guid ConversationId = Guid.Parse("11111111-1111-1111-1111-111111111111");
[Fact]
public async Task Returns_redis_unread_even_when_pg_cold_backup_is_zero()
{
await using var db = BuildInMemoryDb();
db.Conversations.Add(ImTestData.BuildConversation(
ConversationId,
ConversationTypeEnum.Private,
(UserId, 0),
(OtherUserId, 0)));
await db.SaveChangesAsync();
var unreadCounter = new Mock();
unreadCounter
.Setup(c => c.GetByUserAsync(
UserId,
It.Is>(ids => ids.SequenceEqual(new[] { ConversationId })),
It.IsAny()))
.ReturnsAsync(new Dictionary { [ConversationId] = 3 });
var handler = new GetUnreadCountQueryHandler(db, unreadCounter.Object);
var result = await handler.Handle(new GetUnreadCountQuery(UserId), CancellationToken.None);
Assert.Equal(3, result.Total);
var item = Assert.Single(result.Items);
Assert.Equal(ConversationId, item.ConversationId);
Assert.Equal(3, item.UnreadCount);
}
private static ImDbContext BuildInMemoryDb()
{
var services = new ServiceCollection();
services.AddDbContext(o => o.UseInMemoryDatabase($"im-unread-{Guid.NewGuid()}"));
return services.BuildServiceProvider().GetRequiredService();
}
}