build-flow.api/tests/BuildFlow.Rag.Tests/AiModelCatalogTests.cs
xiangning 2181f7dd49 feat(platform): 完善平台功能与权限管理
- 在菜单系统中新增 RenderType、FormDefinitionId 和 RuntimeViewMode 字段
- 实现自定义表单菜单类型的组件映射和验证逻辑
- 为分片上传相关端点添加 file:upload 权限控制
- 为桶和文件夹操作添加 bucket:write 和 file:write 权限控制
- 为文件共享功能添加 file-share:write 权限控制
- 为文件读取操作添加 file:read 权限控制
- 扩展 AI 模型提供商枚举,支持更多模型供应商
- 在 AI 模型创建和更新时添加枚举值验证
- 重构工作流按钮权限检查逻辑,使用统一的权限码查询方式
- 为 JSON 格式文档添加提取器支持
- 增强表单数据派生服务,支持自定义表单关联解析
- 为表单数据添加按表单定义 ID 的索引优化
- 添加聊天消息搜索和上下文获取的集成测试
- 修正删除菜单端点的 ID 类型从 Guid 改为 long
2026-07-04 19:38:43 +08:00

72 lines
2.7 KiB
C#

using BuildFlow.Application.AiModel.Services;
using Xunit;
namespace BuildFlow.Rag.Tests;
/// <summary>
/// AI 模型目录测试。覆盖主流渠道预设、本地模型类型识别和 Models.dev 目录解析。
/// </summary>
public class AiModelCatalogTests
{
[Fact]
public void GetProviderPresetsShouldIncludeMainstreamProvidersAndDeepSeek()
{
var providers = AiModelCatalogNormalizer.GetProviderPresets();
Assert.Contains(providers, p => p.Provider == 3 && p.Key == "deepseek" && p.BaseUrl == "https://api.deepseek.com/v1");
Assert.Contains(providers, p => p.Provider == 4 && p.Key == "anthropic");
Assert.Contains(providers, p => p.Provider == 5 && p.Key == "google");
Assert.Contains(providers, p => p.Provider == 6 && p.Key == "openrouter");
Assert.Contains(providers, p => p.Provider == 1 && p.Key == "lmstudio" && p.BaseUrl == "http://localhost:1234/v1");
}
[Theory]
[InlineData("text-embedding-3-large", 1)]
[InlineData("nomic-embed-text-v1.5", 1)]
[InlineData("bge-m3", 1)]
[InlineData("qwen2.5-7b-instruct", 0)]
[InlineData("deepseek-chat", 0)]
public void GuessModelTypeShouldDetectEmbeddingModels(string modelId, int expectedType)
{
Assert.Equal(expectedType, AiModelCatalogNormalizer.GuessModelType(modelId));
}
[Fact]
public void ParseModelsDevApiShouldNormalizeProviderModels()
{
const string json = """
{
"deepseek": {
"id": "deepseek",
"name": "DeepSeek",
"api": "https://api.deepseek.com/v1",
"models": {
"deepseek-chat": {
"id": "deepseek-chat",
"name": "DeepSeek Chat",
"description": "General chat model",
"release_date": "2025-01-15",
"limit": { "context": 64000, "output": 8000 }
},
"deepseek-embedding": {
"id": "deepseek-embedding",
"name": "DeepSeek Embedding"
}
}
}
}
""";
var result = AiModelCatalogNormalizer.ParseModelsDevApi(json);
Assert.Single(result.Providers);
Assert.Equal("deepseek", result.Providers[0].Key);
Assert.Equal("DeepSeek", result.Providers[0].Label);
Assert.Equal("https://api.deepseek.com/v1", result.Providers[0].BaseUrl);
Assert.Contains("OpenCode", result.Source);
Assert.Equal(2, result.Models.Count);
Assert.Contains(result.Models, m => m.ProviderKey == "deepseek" && m.ModelId == "deepseek-chat" && m.ModelType == 0);
Assert.Contains(result.Models, m => m.ProviderKey == "deepseek" && m.ModelId == "deepseek-embedding" && m.ModelType == 1);
}
}