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") // 使用新的 GetDB 入口 (支持 redis 参数) docDBInst := GetDB("sqlite://"+dbFile, logger, "", "./test_docs") app := docDBInst.Auth("user1") var createdCalled, updatedCalled, removedCalled, movedCalled bool docDBInst.Hooks.OnCreatedDoc = func(doc *Document) { createdCalled = true } docDBInst.Hooks.OnUpdatedDoc = func(doc *Document) { updatedCalled = true } docDBInst.Hooks.OnRemoved = func(path string) { removedCalled = true } docDBInst.Hooks.OnMoved = func(oldPath, newPath string) { movedCalled = 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 doc1.Version != 1 { t.Fatalf("Expected version 1, got %d", doc1.Version) } if !createdCalled { t.Error("OnCreatedDoc event not triggered") } // 2. 测试 Get d, err := app.Get(docPath) if err != nil || d == nil { t.Fatalf("Get failed: %v", err) } if d.Title != "Test Doc" { t.Fatalf("Expected title 'Test Doc', got %s", d.Title) } // 3. 测试 SetDoc (更新内容) doc1.TextContent = "# Header 1\nUpdated Content" err = app.SetDoc(doc1) if err != nil { t.Fatalf("Update SetDoc failed: %v", err) } if doc1.Version != 2 { t.Fatalf("Expected version 2, got %d", doc1.Version) } if !updatedCalled { t.Error("OnUpdatedDoc event not triggered") } // 4. 测试 GetByVersion hist, err := app.GetByVersion(docPath, 1) if err != nil || hist == nil { t.Fatalf("GetByVersion(1) failed: %v", err) } if !strings.Contains(hist.TextContent, "Content 1") { t.Fatalf("Expected 'Content 1' in history, got %s", hist.TextContent) } // 5. 测试 Move (重命名) newPath := "/test/renamed.md" err = app.Move(docPath, newPath) if err != nil { t.Fatalf("Move failed: %v", err) } if !movedCalled { t.Error("OnMoved event not triggered") } // 检查旧路径失效,新路径生效 oldDoc, _ := app.Get(docPath) if oldDoc != nil { t.Error("Old path should be gone") } newDoc, err := app.Get(newPath) if err != nil || newDoc == nil { t.Fatalf("New path should work: %v", err) } if newDoc.Title != "Test Doc" { t.Error("Title should remain same after move") } // 6. 测试 Remove err = app.Remove(newPath) if err != nil { t.Fatalf("Remove failed: %v", err) } if !removedCalled { t.Error("OnRemoved event not triggered") } removedDoc, _ := app.Get(newPath) if removedDoc != nil { t.Error("Document should be removed") } // 7. 测试删除后依然能获取历史 lastHist, err := app.GetByVersion(newPath, 2) if err != nil || lastHist == nil { t.Fatalf("Should get history after removal: %v", err) } if lastHist.Version != 2 { t.Fatalf("Expected version 2, got %d", lastHist.Version) } } 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) } }