Skip to content

Commit 0143cdb

Browse files
committed
test(docql): add tests for MarkdownDocQLExecutor
Add unit tests covering table and frontmatter queries for MarkdownDocQLExecutor, including filtering and error cases.
1 parent c779ba9 commit 0143cdb

File tree

1 file changed

+202
-0
lines changed

1 file changed

+202
-0
lines changed
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
package cc.unitmesh.devins.document.docql
2+
3+
import cc.unitmesh.devins.document.*
4+
import kotlinx.coroutines.test.runTest
5+
import kotlin.test.Test
6+
import kotlin.test.assertEquals
7+
import kotlin.test.assertIs
8+
import kotlin.test.assertTrue
9+
10+
class MarkdownDocQLExecutorTest {
11+
12+
private fun createTestDocument(): DocumentFile {
13+
return DocumentFile(
14+
name = "test.md",
15+
path = "/test/test.md",
16+
metadata = DocumentMetadata(
17+
lastModified = 0,
18+
fileSize = 1000,
19+
language = "markdown"
20+
),
21+
toc = emptyList(),
22+
entities = emptyList()
23+
)
24+
}
25+
26+
private class MockParserService(private val content: String) : DocumentParserService {
27+
override fun getDocumentContent(): String = content
28+
override suspend fun parse(file: DocumentFile, content: String): DocumentTreeNode = file
29+
override suspend fun queryHeading(keyword: String): List<DocumentChunk> = emptyList()
30+
override suspend fun queryChapter(chapterId: String): DocumentChunk? = null
31+
}
32+
33+
@Test
34+
fun `test execute table all query`() = runTest {
35+
val content = """
36+
# Table Test
37+
38+
| Name | Age |
39+
|------|-----|
40+
| Alice| 20 |
41+
| Bob | 30 |
42+
43+
Some text
44+
45+
| ID | Product | Price |
46+
|----|---------|-------|
47+
| 1 | Apple | 1.0 |
48+
""".trimIndent()
49+
50+
val doc = createTestDocument()
51+
val parser = MockParserService(content)
52+
val executor = MarkdownDocQLExecutor(doc, parser)
53+
54+
val query = parseDocQL("$.content.table[*]")
55+
val result = executor.execute(query)
56+
57+
assertIs<DocQLResult.Tables>(result)
58+
assertEquals(2, result.itemsByFile[doc.path]?.size)
59+
60+
val firstTable = result.itemsByFile[doc.path]!![0]
61+
assertEquals(2, firstTable.headers.size)
62+
assertEquals("Name", firstTable.headers[0])
63+
assertEquals("Age", firstTable.headers[1])
64+
assertEquals(2, firstTable.rows.size)
65+
66+
val secondTable = result.itemsByFile[doc.path]!![1]
67+
assertEquals(3, secondTable.headers.size)
68+
}
69+
70+
@Test
71+
fun `test execute table index query`() = runTest {
72+
val content = """
73+
| Name | Age |
74+
|------|-----|
75+
| Alice| 20 |
76+
""".trimIndent()
77+
78+
val doc = createTestDocument()
79+
val parser = MockParserService(content)
80+
val executor = MarkdownDocQLExecutor(doc, parser)
81+
82+
val query = parseDocQL("$.content.table[0]")
83+
val result = executor.execute(query)
84+
85+
assertIs<DocQLResult.Tables>(result)
86+
assertEquals(1, result.itemsByFile[doc.path]?.size)
87+
assertEquals("Name", result.itemsByFile[doc.path]!![0].headers[0])
88+
}
89+
90+
@Test
91+
fun `test execute table filter by row count`() = runTest {
92+
val content = """
93+
| T1 |
94+
|----|
95+
| R1 |
96+
97+
| T2 |
98+
|----|
99+
| R1 |
100+
| R2 |
101+
""".trimIndent()
102+
103+
val doc = createTestDocument()
104+
val parser = MockParserService(content)
105+
val executor = MarkdownDocQLExecutor(doc, parser)
106+
107+
val query = parseDocQL("$.content.table[?(@.rowCount>1)]")
108+
val result = executor.execute(query)
109+
110+
assertIs<DocQLResult.Tables>(result)
111+
assertEquals(1, result.itemsByFile[doc.path]?.size)
112+
assertEquals(2, result.itemsByFile[doc.path]!![0].rows.size)
113+
}
114+
115+
@Test
116+
fun `test execute table filter by header`() = runTest {
117+
val content = """
118+
| Name | Age |
119+
|------|-----|
120+
| A | 1 |
121+
122+
| ID | City |
123+
|----|------|
124+
| 1 | NY |
125+
""".trimIndent()
126+
127+
val doc = createTestDocument()
128+
val parser = MockParserService(content)
129+
val executor = MarkdownDocQLExecutor(doc, parser)
130+
131+
val query = parseDocQL("""$.content.table[?(@.headers~="City")]""")
132+
val result = executor.execute(query)
133+
134+
assertIs<DocQLResult.Tables>(result)
135+
assertEquals(1, result.itemsByFile[doc.path]?.size)
136+
assertTrue(result.itemsByFile[doc.path]!![0].headers.contains("City"))
137+
}
138+
139+
@Test
140+
fun `test execute frontmatter query`() = runTest {
141+
val content = """
142+
---
143+
title: Test Doc
144+
author: UnitMesh
145+
tags: [test, docql]
146+
---
147+
148+
# Content
149+
""".trimIndent()
150+
151+
val doc = createTestDocument()
152+
val parser = MockParserService(content)
153+
val executor = MarkdownDocQLExecutor(doc, parser)
154+
155+
val query = parseDocQL("$.frontmatter")
156+
val result = executor.execute(query)
157+
158+
assertIs<DocQLResult.Frontmatter>(result)
159+
assertEquals("Test Doc", result.data["title"])
160+
assertEquals("UnitMesh", result.data["author"])
161+
162+
val tags = result.data["tags"] as List<*>
163+
assertEquals(2, tags.size)
164+
assertTrue(tags.contains("test"))
165+
}
166+
167+
@Test
168+
fun `test execute frontmatter query with no frontmatter`() = runTest {
169+
val content = """
170+
# Just Content
171+
No frontmatter here
172+
""".trimIndent()
173+
174+
val doc = createTestDocument()
175+
val parser = MockParserService(content)
176+
val executor = MarkdownDocQLExecutor(doc, parser)
177+
178+
val query = parseDocQL("$.frontmatter")
179+
val result = executor.execute(query)
180+
181+
assertIs<DocQLResult.Empty>(result)
182+
}
183+
184+
@Test
185+
fun `test execute frontmatter query with invalid frontmatter`() = runTest {
186+
val content = """
187+
---
188+
invalid: [ yaml
189+
---
190+
""".trimIndent()
191+
192+
val doc = createTestDocument()
193+
val parser = MockParserService(content)
194+
val executor = MarkdownDocQLExecutor(doc, parser)
195+
196+
val query = parseDocQL("$.frontmatter")
197+
val result = executor.execute(query)
198+
199+
// Should return Empty on parse error
200+
assertIs<DocQLResult.Empty>(result)
201+
}
202+
}

0 commit comments

Comments
 (0)