Files
glpi-neural-brain/internal/engine/vector_graph_test.go
jbergner 440423c5b6
All checks were successful
release-tag / release-image (push) Successful in 2m43s
RC-3
2026-08-09 11:29:13 +02:00

72 lines
3.4 KiB
Go

package engine
import (
"strings"
"testing"
"time"
"github.com/local/glpi-neural-brain/internal/sourceagent"
"github.com/local/glpi-neural-brain/internal/vectorgraph"
)
func testVectorAgentRequest() sourceagent.VectorGraphComputeRequest {
return sourceagent.VectorGraphComputeRequest{
Header: sourceagent.VectorGraphComputeHeader{
GraphVersion: 7,
Primary: vectorgraph.Config{Neighbors: 1, Layout: false},
OrphanPass: true,
Orphan: vectorgraph.Config{Neighbors: 1},
OrphanFocusIDs: []string{"c"},
},
Entries: []vectorgraph.Entry{{ID: "a", Vector: []float32{1, 0}}, {ID: "b", Vector: []float32{.9, .1}}, {ID: "c", Vector: []float32{.8, .2}}},
}
}
func TestValidateAgentVectorGraphResultRejectsInvalidEndpoint(t *testing.T) {
req := testVectorAgentRequest()
result := sourceagent.VectorGraphComputeResult{Kind: sourceagent.ComputeKindVectorGraph, GraphVersion: 7, Primary: vectorgraph.Result{Links: []vectorgraph.Link{{Source: "a", Target: "missing", Similarity: .9, Affinity: .8, Confidence: .85}}}}
if err := validateAgentVectorGraphResult(req, result); err == nil || !strings.Contains(err.Error(), "endpoint") {
t.Fatalf("expected endpoint validation error, got %v", err)
}
}
func TestValidateAgentVectorGraphResultRejectsOrphanLinkOutsideFocus(t *testing.T) {
req := testVectorAgentRequest()
result := sourceagent.VectorGraphComputeResult{Kind: sourceagent.ComputeKindVectorGraph, GraphVersion: 7, Orphan: vectorgraph.Result{Links: []vectorgraph.Link{{Source: "a", Target: "b", Similarity: .9, Affinity: .8, Confidence: .85}}}}
if err := validateAgentVectorGraphResult(req, result); err == nil || !strings.Contains(err.Error(), "orphan focus") {
t.Fatalf("expected orphan focus validation error, got %v", err)
}
}
func TestValidateAgentVectorGraphResultRejectsUnexpectedPositions(t *testing.T) {
req := testVectorAgentRequest()
result := sourceagent.VectorGraphComputeResult{Kind: sourceagent.ComputeKindVectorGraph, GraphVersion: 7, Primary: vectorgraph.Result{Positions: []vectorgraph.Position{{ID: "a", X: .1, Y: .2, Z: .3}}}}
if err := validateAgentVectorGraphResult(req, result); err == nil || !strings.Contains(err.Error(), "unexpected positions") {
t.Fatalf("expected unexpected position validation error, got %v", err)
}
}
func TestValidateAgentVectorGraphResultAcceptsBoundedResult(t *testing.T) {
req := testVectorAgentRequest()
result := sourceagent.VectorGraphComputeResult{
Kind: sourceagent.ComputeKindVectorGraph, GraphVersion: 7,
Primary: vectorgraph.Result{Links: []vectorgraph.Link{{Source: "a", Target: "b", Similarity: .9, Affinity: .8, Confidence: .85}}},
Orphan: vectorgraph.Result{Links: []vectorgraph.Link{{Source: "c", Target: "b", Similarity: .82, Affinity: .5, Confidence: .7}}},
}
if err := validateAgentVectorGraphResult(req, result); err != nil {
t.Fatalf("expected valid result, got %v", err)
}
}
func TestVectorAgentStartupGraceUsesConfiguredWaitOnlyDuringBootstrap(t *testing.T) {
if got := vectorAgentStartupGrace(true, 2*time.Minute); got != 2*time.Minute {
t.Fatalf("expected configured startup grace during bootstrap, got %s", got)
}
if got := vectorAgentStartupGrace(false, 2*time.Minute); got != 0 {
t.Fatalf("steady-state vector rebuild must not wait for late agent registration, got %s", got)
}
if got := vectorAgentStartupGrace(true, 0); got != 0 {
t.Fatalf("disabled wait must remain disabled, got %s", got)
}
}