- 在菜单系统中新增 RenderType、FormDefinitionId 和 RuntimeViewMode 字段 - 实现自定义表单菜单类型的组件映射和验证逻辑 - 为分片上传相关端点添加 file:upload 权限控制 - 为桶和文件夹操作添加 bucket:write 和 file:write 权限控制 - 为文件共享功能添加 file-share:write 权限控制 - 为文件读取操作添加 file:read 权限控制 - 扩展 AI 模型提供商枚举,支持更多模型供应商 - 在 AI 模型创建和更新时添加枚举值验证 - 重构工作流按钮权限检查逻辑,使用统一的权限码查询方式 - 为 JSON 格式文档添加提取器支持 - 增强表单数据派生服务,支持自定义表单关联解析 - 为表单数据添加按表单定义 ID 的索引优化 - 添加聊天消息搜索和上下文获取的集成测试 - 修正删除菜单端点的 ID 类型从 Guid 改为 long
83 lines
2.6 KiB
C#
83 lines
2.6 KiB
C#
using BuildFlow.Infrastructure.Extractors;
|
|
using BuildFlow.Shared.Domain.Exceptions;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
using Xunit;
|
|
|
|
namespace BuildFlow.Rag.Tests;
|
|
|
|
/// <summary>
|
|
/// JSON 文档提取器测试。确保结构化 JSON 会规范化为可按标题和路径检索的 Markdown 文本。
|
|
/// </summary>
|
|
public class JsonExtractorTests
|
|
{
|
|
[Fact]
|
|
public void DocumentExtractorFactoryShouldRouteJsonToJsonExtractor()
|
|
{
|
|
var factory = new DocumentExtractorFactory(
|
|
new MarkdownExtractor(),
|
|
new PdfExtractor(),
|
|
new JsonExtractor(),
|
|
new DocxExtractor(),
|
|
new PptxExtractor(),
|
|
new HtmlExtractor(),
|
|
new TextExtractor(),
|
|
NullLogger<DocumentExtractorFactory>.Instance);
|
|
|
|
Assert.IsType<JsonExtractor>(factory.GetExtractor("settings.json"));
|
|
Assert.DoesNotContain("json", new TextExtractor().SupportedExtensions);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ExtractAsyncShouldNormalizeJsonIntoMarkdownAndPathValues()
|
|
{
|
|
var filePath = Path.Combine(Path.GetTempPath(), $"settings-{Guid.NewGuid():N}.json");
|
|
await File.WriteAllTextAsync(
|
|
filePath,
|
|
"""
|
|
{
|
|
"service": {
|
|
"name": "BuildFlow",
|
|
"enabled": true
|
|
},
|
|
"ports": [5999, 8080]
|
|
}
|
|
""");
|
|
|
|
try
|
|
{
|
|
var result = await new JsonExtractor().ExtractAsync(filePath);
|
|
|
|
Assert.StartsWith("# settings-", result.Content);
|
|
Assert.Contains("## JSON 路径值", result.Content);
|
|
Assert.Contains("- $.service.name: BuildFlow", result.Content);
|
|
Assert.Contains("- $.ports[0]: 5999", result.Content);
|
|
Assert.Contains("```json", result.Content);
|
|
Assert.Contains("\"name\": \"BuildFlow\"", result.Content);
|
|
Assert.Contains("\"format\":\"json\"", result.MetadataJson);
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(filePath);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ExtractAsyncShouldRejectInvalidJson()
|
|
{
|
|
var filePath = Path.Combine(Path.GetTempPath(), $"invalid-{Guid.NewGuid():N}.json");
|
|
await File.WriteAllTextAsync(filePath, "{ invalid json");
|
|
|
|
try
|
|
{
|
|
var ex = await Assert.ThrowsAsync<BusinessException>(() =>
|
|
new JsonExtractor().ExtractAsync(filePath));
|
|
|
|
Assert.Contains("JSON 文件格式无效", ex.Message);
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(filePath);
|
|
}
|
|
}
|
|
}
|