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