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