@@ -331,6 +331,27 @@ func TestResolveImportsFromBindsLexicographicRepresentativeForMultiFilePackage(t
331331 }
332332}
333333
334+ func TestResolveImportsFromPrefersPackageNodeOverFileRepresentative (t * testing.T ) {
335+ lookup := fakeLookup {nodes : []model.Node {
336+ {ID : 10 , QualifiedName : "cmd/main.go" , Name : "cmd/main.go" , Kind : model .NodeKindFile , FilePath : "cmd/main.go" , Language : "go" },
337+ {ID : 20 , QualifiedName : "internal/mcp/a.go" , Name : "internal/mcp/a.go" , Kind : model .NodeKindFile , FilePath : "internal/mcp/a.go" , Language : "go" },
338+ {ID : 21 , QualifiedName : "internal/mcp/z.go" , Name : "internal/mcp/z.go" , Kind : model .NodeKindFile , FilePath : "internal/mcp/z.go" , Language : "go" },
339+ {ID : 30 , QualifiedName : "github.com/example/project/internal/mcp" , Name : "mcp" , Kind : model .NodeKindPackage , FilePath : "internal/mcp" , Language : "go" },
340+ }}
341+ edges , err := Resolve (context .Background (), lookup , []model.Edge {{
342+ Kind : model .EdgeKindImportsFrom ,
343+ FilePath : "cmd/main.go" ,
344+ Line : 2 ,
345+ Fingerprint : "imports_from:cmd/main.go:github.com/example/project/internal/mcp:2" ,
346+ }})
347+ if err != nil {
348+ t .Fatal (err )
349+ }
350+ if got := edges [0 ].ToNodeID ; got != 30 {
351+ t .Fatalf ("ToNodeID=%d, want package node 30" , got )
352+ }
353+ }
354+
334355func TestResolveImportsFromLeavesAmbiguousSuffixUnresolved (t * testing.T ) {
335356 lookup := fakeLookup {nodes : []model.Node {
336357 {ID : 10 , QualifiedName : "cmd/main.go" , Name : "cmd/main.go" , Kind : model .NodeKindFile , FilePath : "cmd/main.go" , Language : "go" },
@@ -395,6 +416,42 @@ func TestResolveTestedByBindsTestAndProductionEndpoints(t *testing.T) {
395416 }
396417}
397418
419+ func TestFilterResolvedDropsEdgesWithMissingEndpoints (t * testing.T ) {
420+ edges := FilterResolved ([]model.Edge {
421+ {FromNodeID : 1 , ToNodeID : 2 , Kind : model .EdgeKindCalls , Fingerprint : "resolved" },
422+ {FromNodeID : 0 , ToNodeID : 2 , Kind : model .EdgeKindCalls , Fingerprint : "missing-from" },
423+ {FromNodeID : 1 , ToNodeID : 0 , Kind : model .EdgeKindCalls , Fingerprint : "missing-to" },
424+ })
425+ if len (edges ) != 1 {
426+ t .Fatalf ("expected 1 resolved edge, got %d: %+v" , len (edges ), edges )
427+ }
428+ if edges [0 ].Fingerprint != "resolved" {
429+ t .Fatalf ("expected resolved edge to remain, got %+v" , edges [0 ])
430+ }
431+ }
432+
433+ func TestResolveTestedByBindsQualifiedProductionEndpoint (t * testing.T ) {
434+ lookup := fakeLookup {nodes : []model.Node {
435+ {ID : 1 , QualifiedName : "calc.Add" , Name : "Add" , Kind : model .NodeKindFunction , FilePath : "add.go" , StartLine : 3 , EndLine : 5 , Language : "go" },
436+ {ID : 2 , QualifiedName : "calc_test.TestAdd" , Name : "TestAdd" , Kind : model .NodeKindTest , FilePath : "add_test.go" , StartLine : 3 , EndLine : 7 , Language : "go" },
437+ }}
438+ edges , err := Resolve (context .Background (), lookup , []model.Edge {{
439+ Kind : model .EdgeKindTestedBy ,
440+ FilePath : "add_test.go" ,
441+ Line : 5 ,
442+ Fingerprint : "tested_by:add_test.go:calc.Add:calc_test.TestAdd" ,
443+ }})
444+ if err != nil {
445+ t .Fatal (err )
446+ }
447+ if got := edges [0 ].FromNodeID ; got != 2 {
448+ t .Fatalf ("FromNodeID=%d, want test node 2" , got )
449+ }
450+ if got := edges [0 ].ToNodeID ; got != 1 {
451+ t .Fatalf ("ToNodeID=%d, want production node 1" , got )
452+ }
453+ }
454+
398455func TestResolveTestedByLeavesAmbiguousProductionUnresolved (t * testing.T ) {
399456 lookup := fakeLookup {nodes : []model.Node {
400457 {ID : 1 , QualifiedName : "pkg.Add" , Name : "Add" , Kind : model .NodeKindFunction , FilePath : "add_test.go" , StartLine : 3 , EndLine : 5 , Language : "go" },
0 commit comments