using BuildFlow.Application.AiModel.Handlers;
using BuildFlow.Application.AiModel.Queries;
using BuildFlow.Domain.Entities.AiModel;
using BuildFlow.Domain.Enums;
using BuildFlow.Infrastructure.Persistence;
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace BuildFlow.Rag.Tests;
///
/// 查询 AI 模型列表处理器测试。覆盖全量返回与按类型筛选。
///
public class GetAiModelsQueryHandlerTests
{
[Fact]
public async Task Handle_ReturnsAllModelsOrdered()
{
await using var db = CreateDb();
SeedModel(db, Guid.NewGuid(), "Chat-A", ModelTypeEnum.Chat);
SeedModel(db, Guid.NewGuid(), "Embed-B", ModelTypeEnum.Embedding);
await db.SaveChangesAsync();
var handler = new GetAiModelsQueryHandler(db);
var result = await handler.Handle(new GetAiModelsQuery(null), CancellationToken.None);
result.Should().HaveCount(2);
}
[Fact]
public async Task Handle_FiltersByModelType()
{
await using var db = CreateDb();
SeedModel(db, Guid.NewGuid(), "Chat-A", ModelTypeEnum.Chat);
SeedModel(db, Guid.NewGuid(), "Embed-B", ModelTypeEnum.Embedding);
await db.SaveChangesAsync();
var handler = new GetAiModelsQueryHandler(db);
var result = await handler.Handle(new GetAiModelsQuery((int)ModelTypeEnum.Chat), CancellationToken.None);
result.Should().HaveCount(1);
result[0].ModelType.Should().Be((int)ModelTypeEnum.Chat);
}
private static void SeedModel(RagDbContext db, Guid id, string name, ModelTypeEnum type)
{
db.AiModels.Add(new AiModelEntity
{
Id = id,
Name = name,
Provider = ModelProviderEnum.LMStudio,
ModelId = name,
BaseUrl = "http://localhost:1234/v1",
ApiKey = "lm-studio",
ModelType = type,
CreatedBy = "test",
UpdatedBy = "test",
OperatorIP = "127.0.0.1",
});
}
private static RagDbContext CreateDb()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"rag-get-aimodels-{Guid.NewGuid():N}")
.Options;
var db = new RagDbContext(options);
db.SavingChanges += (_, _) => RagTestDb.FillAudit(db);
return db;
}
}