194 lines
5.0 KiB
Java
194 lines
5.0 KiB
Java
package com.superbiz.agent.service;
|
|
|
|
import com.superbiz.agent.dto.Frontmatter;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import java.util.List;
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
/**
|
|
* FrontmatterParser 单元测试
|
|
*/
|
|
class FrontmatterParserTest {
|
|
|
|
private FrontmatterParser parser;
|
|
|
|
@BeforeEach
|
|
void setUp() {
|
|
parser = new FrontmatterParser();
|
|
}
|
|
|
|
@Test
|
|
void testHasFrontmatter_withValidFrontmatter() {
|
|
String content = "---\ntitle: Test\n---\nContent";
|
|
assertTrue(parser.hasFrontmatter(content));
|
|
}
|
|
|
|
@Test
|
|
void testHasFrontmatter_withoutFrontmatter() {
|
|
String content = "# Just a title\nContent";
|
|
assertFalse(parser.hasFrontmatter(content));
|
|
}
|
|
|
|
@Test
|
|
void testHasFrontmatter_nullContent() {
|
|
assertFalse(parser.hasFrontmatter(null));
|
|
}
|
|
|
|
@Test
|
|
void testHasFrontmatter_emptyContent() {
|
|
assertFalse(parser.hasFrontmatter(""));
|
|
}
|
|
|
|
@Test
|
|
void testParse_validFrontmatter() {
|
|
String content = """
|
|
---
|
|
title: 支付网关错误码
|
|
keywords: [ERR_TIMEOUT, 超时, 支付网关]
|
|
summary: 记录了支付网关所有核心错误码
|
|
category: api
|
|
---
|
|
|
|
# 正文内容
|
|
""";
|
|
|
|
Frontmatter result = parser.parse(content);
|
|
|
|
assertNotNull(result);
|
|
assertEquals("支付网关错误码", result.getTitle());
|
|
assertEquals(3, result.getKeywords().size());
|
|
assertTrue(result.getKeywords().contains("ERR_TIMEOUT"));
|
|
assertEquals("记录了支付网关所有核心错误码", result.getSummary());
|
|
assertEquals("api", result.getCategory());
|
|
}
|
|
|
|
@Test
|
|
void testParse_withoutFrontmatter() {
|
|
String content = "# Just content\nNo frontmatter here";
|
|
assertNull(parser.parse(content));
|
|
}
|
|
|
|
@Test
|
|
void testParse_missingRequiredFields() {
|
|
String content = """
|
|
---
|
|
title: Only Title
|
|
---
|
|
Content
|
|
""";
|
|
|
|
// 缺少 keywords 和 summary,应返回 null
|
|
Frontmatter result = parser.parse(content);
|
|
assertNull(result);
|
|
}
|
|
|
|
@Test
|
|
void testParse_malformedYaml() {
|
|
String content = """
|
|
---
|
|
title: Test
|
|
keywords: [unclosed array
|
|
---
|
|
Content
|
|
""";
|
|
|
|
// YAML 格式错误,应返回 null
|
|
Frontmatter result = parser.parse(content);
|
|
assertNull(result);
|
|
}
|
|
|
|
@Test
|
|
void testParse_noClosingDelimiter() {
|
|
String content = """
|
|
---
|
|
title: Test
|
|
keywords: [test]
|
|
summary: Test summary
|
|
|
|
Content without closing ---
|
|
""";
|
|
|
|
// 缺少结束标记,应返回 null
|
|
Frontmatter result = parser.parse(content);
|
|
assertNull(result);
|
|
}
|
|
|
|
@Test
|
|
void testParse_windowsLineEndings() {
|
|
String content = "---\r\ntitle: Test\r\nkeywords: [test]\r\nsummary: Summary\r\n---\r\nContent";
|
|
|
|
Frontmatter result = parser.parse(content);
|
|
|
|
assertNotNull(result);
|
|
assertEquals("Test", result.getTitle());
|
|
}
|
|
|
|
@Test
|
|
void testParse_withOptionalFields() {
|
|
String content = """
|
|
---
|
|
title: Test Document
|
|
keywords: [test, doc]
|
|
summary: A test document
|
|
version: 1.0.0
|
|
author: Test Author
|
|
---
|
|
Content
|
|
""";
|
|
|
|
Frontmatter result = parser.parse(content);
|
|
|
|
assertNotNull(result);
|
|
assertEquals("Test Document", result.getTitle());
|
|
assertEquals("1.0.0", result.getVersion());
|
|
assertEquals("Test Author", result.getAuthor());
|
|
}
|
|
|
|
@Test
|
|
void testParse_withRetrievalMetadata() {
|
|
String content = """
|
|
---
|
|
title: MySQL Connection Pool
|
|
keywords: [connection pool, HikariCP]
|
|
summary: Diagnose exhausted MySQL connection pools
|
|
category: database
|
|
source: mysql-connection-pool
|
|
breadcrumb: Database > MySQL > Connection Pool
|
|
kb_scope: rag-eval
|
|
---
|
|
Content
|
|
""";
|
|
|
|
Frontmatter result = parser.parse(content);
|
|
|
|
assertNotNull(result);
|
|
assertEquals("mysql-connection-pool", result.getSource());
|
|
assertEquals("Database > MySQL > Connection Pool", result.getBreadcrumb());
|
|
assertEquals("rag-eval", result.getKbScope());
|
|
}
|
|
|
|
@Test
|
|
void testStripFrontmatter_returnsMarkdownBodyOnly() {
|
|
String content = """
|
|
---
|
|
title: Test
|
|
keywords: [frontmatter-only]
|
|
summary: Summary
|
|
---
|
|
|
|
# Body
|
|
|
|
Body content
|
|
""";
|
|
|
|
String body = parser.stripFrontmatter(content);
|
|
|
|
assertFalse(body.contains("frontmatter-only"));
|
|
assertTrue(body.startsWith("# Body"));
|
|
assertTrue(body.contains("Body content"));
|
|
}
|
|
}
|