package router import ( "testing" "gitea.thetempleofdoom.com/drjones/mcp-gateway-nexus/internal/mcp" ) func TestQualifyAndSplit(t *testing.T) { q := Qualify("demo", "echo") if q != "demo.echo" { t.Fatalf("Qualify = %q, want demo.echo", q) } ns, name, ok := SplitQualified("demo.echo") if !ok || ns != "demo" || name != "echo" { t.Fatalf("SplitQualified = (%q,%q,%v)", ns, name, ok) } // tool name containing a dot: split on first separator only ns, name, ok = SplitQualified("fs.read.file") if !ok || ns != "fs" || name != "read.file" { t.Fatalf("SplitQualified dotted = (%q,%q,%v)", ns, name, ok) } if _, _, ok := SplitQualified("nodot"); ok { t.Fatal("SplitQualified with no separator should fail") } } func TestRegistryReplaceLookupDefinitions(t *testing.T) { r := NewRegistry() r.Replace("demo", []mcp.ToolDefinition{ {Name: "echo", Description: "echo"}, {Name: "add", Description: "add"}, }) r.Replace("fs", []mcp.ToolDefinition{{Name: "read"}}) if r.Len() != 3 { t.Fatalf("Len = %d, want 3", r.Len()) } ns, name, ok := r.Lookup("demo.echo") if !ok || ns != "demo" || name != "echo" { t.Fatalf("Lookup demo.echo = (%q,%q,%v)", ns, name, ok) } defs := r.Definitions() if len(defs) != 3 { t.Fatalf("Definitions len = %d, want 3", len(defs)) } // definitions must expose the namespaced id and be sorted if defs[0].Name != "demo.add" { t.Fatalf("first def = %q, want demo.add", defs[0].Name) } // replacing a namespace must not leave stale tools r.Replace("demo", []mcp.ToolDefinition{{Name: "echo"}}) if _, _, ok := r.Lookup("demo.add"); ok { t.Fatal("demo.add should be gone after replace") } if r.Len() != 2 { t.Fatalf("Len after replace = %d, want 2", r.Len()) } r.Remove("fs") if _, _, ok := r.Lookup("fs.read"); ok { t.Fatal("fs.read should be gone after Remove") } }