using BuildFlow.Application.AiModel.Commands;
using BuildFlow.Application.AiModel.Handlers;
using BuildFlow.Domain.Entities.AiModel;
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 SetDefaultAiModelCommandHandlerTests
{
[Fact]
public async Task Handle_ExistingModel_SetsDefault()
{
await using var db = CreateDb();
var modelId = Guid.NewGuid();
db.AiModels.Add(new AiModelEntity
{
Id = modelId,
Name = "Qwen",
Provider = ModelProviderEnum.LMStudio,
ModelId = "qwen2.5",
BaseUrl = "http://localhost:1234/v1",
ApiKey = "lm-studio",
ModelType = ModelTypeEnum.Chat,
IsDefault = false,
CreatedBy = "test",
UpdatedBy = "test",
OperatorIP = "127.0.0.1",
});
await db.SaveChangesAsync();
var handler = new SetDefaultAiModelCommandHandler(db);
var result = await handler.Handle(new SetDefaultAiModelCommand(modelId), CancellationToken.None);
result.IsDefault.Should().BeTrue();
var persisted = await db.AiModels.FindAsync(modelId);
persisted!.IsDefault.Should().BeTrue(); // 前面已断言存在
}
[Fact]
public async Task Handle_NotFound_ThrowsNotFound()
{
await using var db = CreateDb();
var handler = new SetDefaultAiModelCommandHandler(db);
var act = async () => await handler.Handle(new SetDefaultAiModelCommand(Guid.NewGuid()), CancellationToken.None);
var ex = await act.Should().ThrowAsync();
ex.Which.Code.Should().Be(ErrorCode.NotFound);
}
private static RagDbContext CreateDb()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"rag-setdefault-aimodel-{Guid.NewGuid():N}")
.Options;
var db = new RagDbContext(options);
db.SavingChanges += (_, _) => RagTestDb.FillAudit(db);
return db;
}
}