Files
wehub-resource-sync a06f331eb8
install-script / powershell-syntax (push) Waiting to run
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
install-script / install (macos-14) (push) Waiting to run
install-script / install (ubuntu-latest) (push) Waiting to run
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:33:42 +08:00

176 lines
5.3 KiB
Go

package sql
import (
"testing"
"github.com/zzet/gortex/internal/graph"
)
func TestRebuildTablesFromStringRegistry_BuildsTablesAndEdges(t *testing.T) {
g := graph.New()
// Caller (any node kind will do — the rebuild reads emitters
// from EdgeEmits.From regardless).
g.AddNode(&graph.Node{ID: "pkg/foo.go::Run", Kind: graph.KindFunction, Name: "Run"})
// KindString context="sql" registry node.
strID := "string::sql::SELECT id FROM users"
g.AddNode(&graph.Node{
ID: strID,
Kind: graph.KindString,
Name: "SELECT id FROM users",
Language: "go",
Meta: map[string]any{
"context": "sql",
"value": "SELECT id FROM users",
"dialect": "postgres",
},
})
g.AddEdge(&graph.Edge{
From: "pkg/foo.go::Run",
To: strID,
Kind: graph.EdgeEmits,
Meta: map[string]any{"context": "sql", "dialect": "postgres"},
})
stats := RebuildTablesFromStringRegistry(g)
if stats.StringsVisited != 1 {
t.Errorf("StringsVisited = %d, want 1", stats.StringsVisited)
}
if stats.TablesCreated != 1 {
t.Errorf("TablesCreated = %d, want 1", stats.TablesCreated)
}
if stats.QueryEdges != 1 {
t.Errorf("QueryEdges = %d, want 1", stats.QueryEdges)
}
if stats.EmittersLinked != 1 {
t.Errorf("EmittersLinked = %d, want 1", stats.EmittersLinked)
}
tableID := TableNodeID("postgres", "", "users")
if n := g.GetNode(tableID); n == nil {
t.Fatalf("expected KindTable %q to be created", tableID)
} else if n.Kind != graph.KindTable {
t.Errorf("node kind = %s, want %s", n.Kind, graph.KindTable)
}
// EdgeQueries from caller to table.
in := g.GetInEdges(tableID)
hasQueries := false
for _, e := range in {
if e.Kind == graph.EdgeQueries && e.From == "pkg/foo.go::Run" {
hasQueries = true
if e.Origin != graph.OriginTextMatched {
t.Errorf("Origin = %q, want text_matched", e.Origin)
}
}
}
if !hasQueries {
t.Errorf("missing EdgeQueries from caller to %s", tableID)
}
}
func TestRebuildTablesFromStringRegistry_Idempotent(t *testing.T) {
g := graph.New()
g.AddNode(&graph.Node{ID: "pkg/foo.go::Run", Kind: graph.KindFunction, Name: "Run"})
g.AddNode(&graph.Node{
ID: "string::sql::UPDATE users SET active = true",
Kind: graph.KindString,
Name: "UPDATE users SET active = true",
Meta: map[string]any{"context": "sql", "dialect": "postgres"},
})
g.AddEdge(&graph.Edge{
From: "pkg/foo.go::Run",
To: "string::sql::UPDATE users SET active = true",
Kind: graph.EdgeEmits,
})
first := RebuildTablesFromStringRegistry(g)
if first.TablesCreated == 0 {
t.Fatalf("first pass created no tables: %+v", first)
}
second := RebuildTablesFromStringRegistry(g)
if second.TablesCreated != 0 {
t.Errorf("second pass created %d tables, expected idempotent", second.TablesCreated)
}
if second.QueryEdges != 0 {
t.Errorf("second pass added %d query edges, expected idempotent", second.QueryEdges)
}
}
func TestRebuildTablesFromStringRegistry_SkipsNonSQLStrings(t *testing.T) {
g := graph.New()
g.AddNode(&graph.Node{ID: "pkg/foo.go::Run", Kind: graph.KindFunction, Name: "Run"})
// error_msg KindString — should be ignored.
g.AddNode(&graph.Node{
ID: "string::error_msg::bad token",
Kind: graph.KindString,
Name: "bad token",
Meta: map[string]any{"context": "error_msg"},
})
g.AddEdge(&graph.Edge{
From: "pkg/foo.go::Run",
To: "string::error_msg::bad token",
Kind: graph.EdgeEmits,
})
stats := RebuildTablesFromStringRegistry(g)
if stats.StringsVisited != 0 {
t.Errorf("StringsVisited = %d, want 0 (no sql-context strings)", stats.StringsVisited)
}
if stats.TablesCreated != 0 {
t.Errorf("TablesCreated = %d, want 0", stats.TablesCreated)
}
}
func TestRebuildTablesFromStringRegistry_SkipsUnparseableQueries(t *testing.T) {
g := graph.New()
g.AddNode(&graph.Node{ID: "pkg/foo.go::Run", Kind: graph.KindFunction, Name: "Run"})
g.AddNode(&graph.Node{
ID: "string::sql::not actually sql",
Kind: graph.KindString,
Name: "not actually sql",
Meta: map[string]any{"context": "sql"},
})
stats := RebuildTablesFromStringRegistry(g)
if stats.StringsVisited != 1 {
t.Errorf("StringsVisited = %d, want 1", stats.StringsVisited)
}
if stats.TablesCreated != 0 {
t.Errorf("TablesCreated = %d, want 0", stats.TablesCreated)
}
if stats.Skipped != 1 {
t.Errorf("Skipped = %d, want 1", stats.Skipped)
}
}
func TestRebuildTablesFromStringRegistry_EmitsColumnEdges(t *testing.T) {
g := graph.New()
g.AddNode(&graph.Node{ID: "pkg/foo.go::Run", Kind: graph.KindFunction, Name: "Run"})
g.AddNode(&graph.Node{
ID: "string::sql::INSERT INTO accounts (id, balance) VALUES (1, 10)",
Kind: graph.KindString,
Name: "INSERT INTO accounts (id, balance) VALUES (1, 10)",
Meta: map[string]any{"context": "sql", "dialect": "postgres"},
})
g.AddEdge(&graph.Edge{
From: "pkg/foo.go::Run",
To: "string::sql::INSERT INTO accounts (id, balance) VALUES (1, 10)",
Kind: graph.EdgeEmits,
})
stats := RebuildTablesFromStringRegistry(g)
if stats.ColumnsCreated != 2 {
t.Errorf("ColumnsCreated = %d, want 2 (id, balance)", stats.ColumnsCreated)
}
if stats.WriteColEdges != 2 {
t.Errorf("WriteColEdges = %d, want 2 (INSERT is a write)", stats.WriteColEdges)
}
}
func TestRebuildTablesFromStringRegistry_NilGraphSafe(t *testing.T) {
stats := RebuildTablesFromStringRegistry(nil)
if stats.StringsVisited != 0 {
t.Errorf("nil graph produced StringsVisited = %d, want 0", stats.StringsVisited)
}
}