- 添加HNSW向量索引提升检索性能 - 实现Hybrid检索模式支持向量和关键词双路召回 - 采用RRF算法融合多路召回结果 - 支持ParentChild分块模式的上下文回填 - 优化向量写入采用批量SQL操作提升性能 - 添加RAG PostgreSQL连接字符串配置 - 更新部署脚本增加PGVector集成测试 - 修正表名引用从document_chunks到b_document_chunks - 重构RagRetrievalService实现完整的检索流程 - 增加重排策略支持关键词和LLM重排 - 修改服务器部署地址配置
55 lines
2.2 KiB
C#
55 lines
2.2 KiB
C#
using BuildFlow.Platform.Application.Users.DTOs;
|
||
using BuildFlow.Platform.Application.Users.Queries;
|
||
using FluentAssertions;
|
||
using IM.Application.Chat.Commands;
|
||
using IM.Application.Chat.Handlers;
|
||
using IM.Domain.Enums;
|
||
using IM.Infrastructure.Persistence;
|
||
using MediatR;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Moq;
|
||
using Xunit;
|
||
|
||
namespace BuildFlow.IM.Tests.Chat;
|
||
|
||
/// <summary>
|
||
/// CreatePrivateConversationCommandHandler:幂等创建私聊(A↔B 仅一条),返回 OtherUserId。
|
||
/// </summary>
|
||
public class CreatePrivateConversationCommandHandlerTests
|
||
{
|
||
private static readonly Guid Current = Guid.Parse("22222222-2222-2222-2222-222222222222");
|
||
private static readonly Guid Target = Guid.Parse("33333333-3333-3333-3333-333333333333");
|
||
|
||
private static IMediator NewMediator()
|
||
{
|
||
var mediator = new Mock<IMediator>();
|
||
mediator.Setup(m => m.Send(It.IsAny<GetUserSummariesQuery>(), It.IsAny<CancellationToken>()))
|
||
.ReturnsAsync(new Dictionary<Guid, UserSummaryDto> { [Target] = new UserSummaryDto(Target, "Bob", null) });
|
||
return mediator.Object;
|
||
}
|
||
|
||
[Fact]
|
||
public async Task Creates_new_private_conversation()
|
||
{
|
||
await using var db = IMTestDb.Create();
|
||
var handler = new CreatePrivateConversationCommandHandler(db, NewMediator());
|
||
var result = await handler.Handle(new CreatePrivateConversationCommand(Current, Target), CancellationToken.None);
|
||
|
||
result.Type.Should().Be(ConversationTypeEnum.Private);
|
||
result.OtherUserId.Should().Be(Target);
|
||
(await db.Conversations.CountAsync(c => c.Type == ConversationTypeEnum.Private)).Should().Be(1);
|
||
}
|
||
|
||
[Fact]
|
||
public async Task Returns_same_conversation_when_called_again()
|
||
{
|
||
await using var db = IMTestDb.Create();
|
||
var handler = new CreatePrivateConversationCommandHandler(db, NewMediator());
|
||
var first = await handler.Handle(new CreatePrivateConversationCommand(Current, Target), CancellationToken.None);
|
||
var second = await handler.Handle(new CreatePrivateConversationCommand(Current, Target), CancellationToken.None);
|
||
|
||
second.Id.Should().Be(first.Id);
|
||
(await db.Conversations.CountAsync(c => c.Type == ConversationTypeEnum.Private)).Should().Be(1);
|
||
}
|
||
}
|