Files
SuperBizAgent-java/src/test/java/com/superbiz/agent/service/FrontmatterParserTest.java
T

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