package bootstrap import ( "testing" "iop/packages/config" ) func newTestConfig() *config.EdgeConfig { return &config.EdgeConfig{ Server: config.EdgeServerConf{Listen: "127.0.0.1:0"}, Logging: config.LoggingConf{Level: "error"}, Metrics: config.MetricsConf{Port: 0}, Nodes: []config.NodeDefinition{ {ID: "node-1", Alias: "alias-1", Token: "tok-1"}, }, } } func TestNewRuntimeSeedsNodeStore(t *testing.T) { cfg := newTestConfig() rt, err := NewRuntime(cfg) if err != nil { t.Fatalf("NewRuntime: %v", err) } if rt.NodeStore == nil { t.Fatal("NodeStore is nil") } rec, ok := rt.NodeStore.FindByToken("tok-1") if !ok { t.Fatal("expected node record seeded by token tok-1") } if rec.ID != "node-1" || rec.Alias != "alias-1" { t.Errorf("unexpected record: id=%q alias=%q", rec.ID, rec.Alias) } if rt.Registry == nil || rt.EventBus == nil || rt.Service == nil || rt.Server == nil || rt.Logger == nil { t.Error("runtime dependencies must be wired by NewRuntime") } } func TestRuntimeWiresTransportHandlers(t *testing.T) { cfg := newTestConfig() rt, err := NewRuntime(cfg) if err != nil { t.Fatalf("NewRuntime: %v", err) } if rt.Server.HasRunEventHandler() || rt.Server.HasNodeEventHandler() { t.Fatal("handlers must not be wired before wireHandlers") } rt.wireHandlers() if !rt.Server.HasRunEventHandler() { t.Error("run event handler not wired") } if !rt.Server.HasNodeEventHandler() { t.Error("node event handler not wired") } } func TestNewRuntimeWiresInputManager(t *testing.T) { cfg := newTestConfig() rt, err := NewRuntime(cfg) if err != nil { t.Fatalf("NewRuntime: %v", err) } if rt.Input == nil { t.Fatal("Input manager is nil") } if rt.Input.OpenAI == nil { t.Fatal("Input.OpenAI is nil") } if rt.Input.A2A == nil { t.Fatal("Input.A2A is nil") } } func TestNewRuntimeRejectsDuplicateToken(t *testing.T) { cfg := &config.EdgeConfig{ Server: config.EdgeServerConf{Listen: "127.0.0.1:0"}, Logging: config.LoggingConf{Level: "error"}, Nodes: []config.NodeDefinition{ {ID: "node-1", Alias: "a1", Token: "dup"}, {ID: "node-2", Alias: "a2", Token: "dup"}, }, } if _, err := NewRuntime(cfg); err == nil { t.Fatal("expected error on duplicate token seed") } }