117 lines
3.5 KiB
Go
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)
|
|
}
|
|
}
|