using BuildFlow.Application.AiModel.Commands; using BuildFlow.Application.AiModel.Handlers; using BuildFlow.Domain.Enums; using BuildFlow.Infrastructure.Persistence; using BuildFlow.Shared.Domain.Errors; using BuildFlow.Shared.Domain.Exceptions; using FluentAssertions; using Microsoft.EntityFrameworkCore; using Xunit; namespace BuildFlow.Rag.Tests; /// /// 新建 AI 模型处理器测试。成功路径 + 参数校验异常分支。 /// public class CreateAiModelCommandHandlerTests { [Fact] public async Task Handle_ValidRequest_CreatesModelAndReturnsDto() { await using var db = CreateDb(); var handler = new CreateAiModelCommandHandler(db); var command = new CreateAiModelCommand( "Qwen", (int)ModelProviderEnum.LMStudio, "qwen2.5-7b", "http://localhost:1234/v1", "lm-studio", (int)ModelTypeEnum.Chat, false, null, null, null); var result = await handler.Handle(command, CancellationToken.None); result.Name.Should().Be("Qwen"); result.ModelId.Should().Be("qwen2.5-7b"); result.IsDefault.Should().BeFalse(); (await db.AiModels.CountAsync()).Should().Be(1); } [Fact] public async Task Handle_EmptyName_ThrowsInvalidParam() { await using var db = CreateDb(); var handler = new CreateAiModelCommandHandler(db); var command = new CreateAiModelCommand( "", (int)ModelProviderEnum.LMStudio, "qwen2.5-7b", "http://localhost:1234/v1", "lm-studio", (int)ModelTypeEnum.Chat, false, null, null, null); var act = async () => await handler.Handle(command, CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.InvalidParam); } [Fact] public async Task Handle_InvalidProvider_ThrowsInvalidParam() { await using var db = CreateDb(); var handler = new CreateAiModelCommandHandler(db); var command = new CreateAiModelCommand( "Qwen", 999, "qwen2.5-7b", "http://localhost:1234/v1", "lm-studio", (int)ModelTypeEnum.Chat, false, null, null, null); var act = async () => await handler.Handle(command, CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.InvalidParam); } private static RagDbContext CreateDb() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase($"rag-create-aimodel-{Guid.NewGuid():N}") .Options; var db = new RagDbContext(options); db.SavingChanges += (_, _) => RagTestDb.FillAudit(db); return db; } }