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