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; } }