Files
kandev/apps/backend/internal/agent/settings/controller/agent_discovery_test.go
T
2026-07-27 12:21:47 +01:00

117 lines
3.5 KiB
Go

package controller
import (
"context"
"encoding/json"
"testing"
"time"
"github.com/kandev/kandev/internal/agent/agents"
"github.com/kandev/kandev/internal/agent/discovery"
"github.com/kandev/kandev/internal/agent/hostutility"
)
type managedTestAgent struct {
testAgent
spec agents.ManagedNPMRuntimeSpec
}
func (a *managedTestAgent) ManagedNPMRuntime() agents.ManagedNPMRuntimeSpec {
return a.spec
}
func TestAvailableAgentIncludesManagedRuntimeMetadata(t *testing.T) {
ag := &managedTestAgent{
testAgent: testAgent{id: "managed-acp", name: "Managed", enabled: true},
spec: agents.ManagedNPMRuntimeSpec{Package: "@example/managed-acp"},
}
ctrl := newTestController(map[string]agents.Agent{ag.ID(): ag})
ctrl.SetRuntimeUpdater(&fakeRuntimeUpdater{
current: hostutility.AgentCapabilities{AgentVersion: "1.2.3"},
currentFound: true,
})
item := ctrl.buildAvailableAgentDTO(context.Background(), ag, discovery.Availability{
Name: ag.ID(),
Available: true,
}, time.Now())
raw, err := json.Marshal(item)
if err != nil {
t.Fatalf("marshal available agent: %v", err)
}
var payload map[string]any
if err := json.Unmarshal(raw, &payload); err != nil {
t.Fatalf("unmarshal available agent: %v", err)
}
runtimeUpdate, ok := payload["runtime_update"].(map[string]any)
if !ok {
t.Fatal("runtime_update missing, want managed runtime metadata")
}
if runtimeUpdate["package"] != "@example/managed-acp" {
t.Fatalf("package = %#v, want @example/managed-acp", runtimeUpdate["package"])
}
if runtimeUpdate["supported"] != true {
t.Fatalf("supported = %#v, want true", runtimeUpdate["supported"])
}
if runtimeUpdate["current_version"] != "1.2.3" {
t.Fatalf("current_version = %#v, want 1.2.3", runtimeUpdate["current_version"])
}
}
func TestUnavailableManagedAgentOmitsRuntimeMetadata(t *testing.T) {
ag := &managedTestAgent{
testAgent: testAgent{id: "managed-acp", name: "Managed", enabled: true},
spec: agents.ManagedNPMRuntimeSpec{Package: "@example/managed-acp"},
}
ctrl := newTestController(map[string]agents.Agent{ag.ID(): ag})
item := ctrl.buildAvailableAgentDTO(
context.Background(),
ag,
discovery.Availability{Name: ag.ID(), Available: false},
time.Now(),
)
raw, err := json.Marshal(item)
if err != nil {
t.Fatalf("marshal available agent: %v", err)
}
var payload map[string]any
if err := json.Unmarshal(raw, &payload); err != nil {
t.Fatalf("unmarshal available agent: %v", err)
}
if _, exists := payload["runtime_update"]; exists {
t.Fatal("runtime_update present for unavailable agent")
}
}
func TestConfigOptionDTOsPreserveDescriptions(t *testing.T) {
dtos := configOptionDTOs([]hostutility.ConfigOption{{
Type: "select",
ID: "reasoning_effort",
Name: "Reasoning effort",
Description: "Controls reasoning depth.",
CurrentValue: "high",
Options: []hostutility.ConfigOptionChoice{{
Value: "high",
Name: "High",
Description: "More thorough reasoning.",
}},
}})
raw, err := json.Marshal(dtos)
if err != nil {
t.Fatalf("marshal config option DTOs: %v", err)
}
var payload []map[string]any
if err := json.Unmarshal(raw, &payload); err != nil {
t.Fatalf("unmarshal config option DTOs: %v", err)
}
if got := payload[0]["description"]; got != "Controls reasoning depth." {
t.Errorf("option description = %#v, want provider description", got)
}
values := payload[0]["options"].([]any)
if got := values[0].(map[string]any)["description"]; got != "More thorough reasoning." {
t.Errorf("value description = %#v, want provider description", got)
}
}