docDB/doc_test.go

87 lines
2.3 KiB
Go
Raw Normal View History

package docDB
import (
"os"
"strings"
"testing"
"apigo.cc/go/log"
)
func TestDocDB(t *testing.T) {
logger := log.DefaultLogger
dbFile := "test_doc.db"
os.Remove(dbFile)
defer os.Remove(dbFile)
os.RemoveAll("./test_docs")
defer os.RemoveAll("./test_docs")
docDBInst := GetDB("sqlite://"+dbFile, logger, "", "./test_docs")
app := docDBInst.Auth("user1")
var updatedCalled, removedDocCalled, updatedToCCalled, removedToCCalled bool
docDBInst.Hooks.OnUpdatedDoc = func(doc *Document) { updatedCalled = true }
docDBInst.Hooks.OnRemovedDoc = func(path string) { removedDocCalled = true }
docDBInst.Hooks.OnUpdatedToC = func(path string, toc []ToCNode) { updatedToCCalled = true }
docDBInst.Hooks.OnRemovedToC = func(path string) { removedToCCalled = true }
// 1. 测试 SetDoc (创建)
docPath := "/test/doc1.md"
doc1 := &Document{
Path: docPath,
Title: "Test Doc",
TextContent: "# Header 1\nContent 1",
Type: "markdown",
}
err := app.SetDoc(doc1)
if err != nil {
t.Fatalf("SetDoc failed: %v", err)
}
if !updatedCalled || !updatedToCCalled {
t.Error("Hooks not triggered on creation")
}
updatedCalled, updatedToCCalled = false, false
// 2. 测试 SetMeta 更新 TextContent (触发 ToC 事件)
err = app.SetMeta(docPath, map[string]any{"textContent": "# New Header"})
if err != nil {
t.Fatalf("SetMeta failed: %v", err)
}
if !updatedToCCalled || !removedToCCalled {
t.Error("ToC Hooks not triggered on SetMeta text update")
}
if updatedCalled {
t.Error("OnUpdatedDoc should NOT be triggered on SetMeta")
}
updatedToCCalled, removedToCCalled = false, false
// 3. 测试 Move (触发删除旧的 + 更新新的)
newPath := "/test/moved.md"
err = app.Move(docPath, newPath)
if err != nil {
t.Fatalf("Move failed: %v", err)
}
if !removedDocCalled || !updatedCalled {
t.Error("Move Hooks sequence failed")
}
removedDocCalled, updatedCalled = false, false
// 4. 测试 Remove
err = app.Remove(newPath)
if err != nil {
t.Fatalf("Remove failed: %v", err)
}
if !removedDocCalled {
t.Error("OnRemovedDoc not triggered on Remove")
}
}
func BenchmarkExtractToC(b *testing.B) {
content := "# H1\n## H1.1\n### H1.1.1\n" + strings.Repeat("Some content\n", 100) + "# H2\n## H2.1\n"
for i := 0; i < b.N; i++ {
_ = ExtractToC(content)
}
}