package index
|
|
import (
|
"path/filepath"
|
"testing"
|
|
"github.com/aisim/kb-cli/internal/graph"
|
)
|
|
func TestStore(t *testing.T) {
|
tmpDir := t.TempDir()
|
dbPath := filepath.Join(tmpDir, "test.db")
|
|
store, err := Open(dbPath)
|
if err != nil {
|
t.Fatalf("Open failed: %v", err)
|
}
|
defer store.Close()
|
|
// 测试插入节点
|
node := &graph.Node{
|
Path: "FAQ/充装类/001-test.md",
|
Title: "测试FAQ",
|
Section: "FAQ",
|
Tags: []string{"充装", "智能枪"},
|
}
|
id, err := store.InsertNode(node)
|
if err != nil {
|
t.Fatalf("InsertNode failed: %v", err)
|
}
|
if id == 0 {
|
t.Error("InsertNode returned 0 id")
|
}
|
|
// 测试插入边
|
edge := &graph.Edge{
|
FromNode: id,
|
ToNode: 1000000,
|
Relation: "tag",
|
Label: "充装",
|
}
|
if err := store.InsertEdge(edge); err != nil {
|
t.Fatalf("InsertEdge failed: %v", err)
|
}
|
|
// 测试元信息
|
if err := store.SetMeta("git_commit", "abc123"); err != nil {
|
t.Fatalf("SetMeta failed: %v", err)
|
}
|
commit, err := store.GetMeta("git_commit")
|
if err != nil {
|
t.Fatalf("GetMeta failed: %v", err)
|
}
|
if commit != "abc123" {
|
t.Errorf("commit = %q, want %q", commit, "abc123")
|
}
|
|
// 测试计数
|
count, err := store.NodeCount()
|
if err != nil {
|
t.Fatalf("NodeCount failed: %v", err)
|
}
|
if count != 1 {
|
t.Errorf("node count = %d, want 1", count)
|
}
|
}
|
|
func TestGetNodeLinks(t *testing.T) {
|
tmpDir := t.TempDir()
|
dbPath := filepath.Join(tmpDir, "test.db")
|
|
store, err := Open(dbPath)
|
if err != nil {
|
t.Fatalf("Open failed: %v", err)
|
}
|
defer store.Close()
|
|
// 插入测试节点
|
node1 := &graph.Node{
|
Path: "FAQ/001-测试.md",
|
Title: "测试文档",
|
Section: "FAQ",
|
Content: "# 测试\n\n内容",
|
}
|
node2 := &graph.Node{
|
Path: "FAQ/002-相关.md",
|
Title: "相关文档",
|
Section: "FAQ",
|
Content: "# 相关\n\n内容",
|
}
|
|
id1, err := store.InsertNode(node1)
|
if err != nil {
|
t.Fatalf("InsertNode node1 failed: %v", err)
|
}
|
|
id2, err := store.InsertNode(node2)
|
if err != nil {
|
t.Fatalf("InsertNode node2 failed: %v", err)
|
}
|
|
// 插入 wikilink 边
|
edge := &graph.Edge{
|
FromNode: id1,
|
ToNode: id2,
|
Relation: "wikilink",
|
Label: "相关文档",
|
}
|
if err := store.InsertEdge(edge); err != nil {
|
t.Fatalf("InsertEdge failed: %v", err)
|
}
|
|
// 测试获取链接
|
links, err := store.GetNodeLinks(id1)
|
if err != nil {
|
t.Fatalf("GetNodeLinks failed: %v", err)
|
}
|
if len(links) != 1 {
|
t.Errorf("links count = %d, want 1", len(links))
|
}
|
if len(links) > 0 && links[0] != "FAQ/002-相关.md" {
|
t.Errorf("links[0] = %q, want %q", links[0], "FAQ/002-相关.md")
|
}
|
|
// 测试无链接的节点
|
links, err = store.GetNodeLinks(id2)
|
if err != nil {
|
t.Fatalf("GetNodeLinks for node2 failed: %v", err)
|
}
|
if len(links) != 0 {
|
t.Errorf("links count = %d, want 0", len(links))
|
}
|
}
|
|
func TestNodeTypeSeparation(t *testing.T) {
|
tmpDir := t.TempDir()
|
store, err := Open(filepath.Join(tmpDir, "test.db"))
|
if err != nil {
|
t.Fatalf("Open failed: %v", err)
|
}
|
defer store.Close()
|
|
// 插入文件节点 + tag 节点
|
fileID, err := store.InsertNode(&graph.Node{
|
Path: "FAQ/001-测试.md", Title: "测试文档", Section: "FAQ", NodeType: "file",
|
Tags: []string{"电磁阀"},
|
})
|
if err != nil {
|
t.Fatalf("InsertNode file failed: %v", err)
|
}
|
tagID, err := store.InsertNode(&graph.Node{
|
Path: "tag:电磁阀", Title: "电磁阀", NodeType: "tag",
|
})
|
if err != nil {
|
t.Fatalf("InsertNode tag failed: %v", err)
|
}
|
|
// tag 节点不进 FTS
|
if err := store.CreateFTS(); err != nil {
|
t.Fatalf("CreateFTS failed: %v", err)
|
}
|
if err := store.PopulateFTS(); err != nil {
|
t.Fatalf("PopulateFTS failed: %v", err)
|
}
|
res, err := store.FTSSearch([]string{"测试"}, 10)
|
if err != nil {
|
t.Fatalf("FTSSearch failed: %v", err)
|
}
|
for _, r := range res {
|
if r.ID == tagID {
|
t.Error("FTS result contains tag node")
|
}
|
}
|
|
// FindNodesByKeyword 不返回 tag 节点
|
nodes, err := store.FindNodesByKeyword("电磁阀")
|
if err != nil {
|
t.Fatalf("FindNodesByKeyword failed: %v", err)
|
}
|
for _, n := range nodes {
|
if n.ID == tagID {
|
t.Error("FindNodesByKeyword returned tag node")
|
}
|
}
|
|
// GetAllNodes 只返回 file 节点
|
all, err := store.GetAllNodes()
|
if err != nil {
|
t.Fatalf("GetAllNodes failed: %v", err)
|
}
|
for _, n := range all {
|
if n.ID == tagID {
|
t.Error("GetAllNodes returned tag node")
|
}
|
}
|
_ = fileID
|
}
|