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