164 lines
4.0 KiB
Go
164 lines
4.0 KiB
Go
package kimi
|
|
|
|
import (
|
|
"context"
|
|
"os/exec"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/chenhg5/cc-connect/core"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func skipUnlessKimiAvailable(t *testing.T) {
|
|
t.Helper()
|
|
if _, err := exec.LookPath("kimi"); err != nil {
|
|
t.Skipf("kimi CLI not in PATH, skipping: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeMode(t *testing.T) {
|
|
cases := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"default", "default"},
|
|
{"DEFAULT", "default"},
|
|
{"yolo", "yolo"},
|
|
{"YOLO", "yolo"},
|
|
{"force", "yolo"},
|
|
{"bypass", "yolo"},
|
|
{"auto", "yolo"},
|
|
{"plan", "plan"},
|
|
{"quiet", "quiet"},
|
|
{"", "default"},
|
|
{"unknown", "default"},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
assert.Equal(t, c.expected, normalizeMode(c.input), "input: %s", c.input)
|
|
}
|
|
}
|
|
|
|
func TestAgentNew(t *testing.T) {
|
|
skipUnlessKimiAvailable(t)
|
|
agentInf, err := New(map[string]any{
|
|
"work_dir": "/tmp",
|
|
"model": "kimi-k2",
|
|
"mode": "yolo",
|
|
"timeout_mins": 15,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NotNil(t, agentInf)
|
|
|
|
a := agentInf.(*Agent)
|
|
assert.Equal(t, "kimi", a.Name())
|
|
assert.Equal(t, "/tmp", a.GetWorkDir())
|
|
assert.Equal(t, "yolo", a.GetMode())
|
|
assert.Equal(t, "kimi-k2", a.GetModel())
|
|
}
|
|
|
|
// TestAgentFields verifies Name/WorkDir/Mode/Model without requiring
|
|
// the kimi CLI on PATH — constructs the struct directly.
|
|
func TestAgentFields(t *testing.T) {
|
|
a := &Agent{
|
|
workDir: "/tmp",
|
|
model: "kimi-k2",
|
|
mode: "yolo",
|
|
cmd: "kimi",
|
|
activeIdx: -1,
|
|
}
|
|
assert.Equal(t, "kimi", a.Name())
|
|
assert.Equal(t, "Kimi", a.CLIDisplayName())
|
|
assert.Equal(t, "kimi", a.CLIBinaryName())
|
|
assert.Equal(t, "/tmp", a.GetWorkDir())
|
|
assert.Equal(t, "yolo", a.GetMode())
|
|
assert.Equal(t, "kimi-k2", a.GetModel())
|
|
}
|
|
|
|
func TestAgentSetters(t *testing.T) {
|
|
a := &Agent{workDir: "/tmp", mode: "default", activeIdx: -1}
|
|
|
|
a.SetWorkDir("/new/path")
|
|
assert.Equal(t, "/new/path", a.GetWorkDir())
|
|
|
|
a.SetModel("kimi-k2-5")
|
|
assert.Equal(t, "kimi-k2-5", a.GetModel())
|
|
|
|
a.SetMode("plan")
|
|
assert.Equal(t, "plan", a.GetMode())
|
|
}
|
|
|
|
func TestAgentPermissionModes(t *testing.T) {
|
|
a := &Agent{}
|
|
|
|
modes := a.PermissionModes()
|
|
require.Len(t, modes, 4)
|
|
assert.Equal(t, "default", modes[0].Key)
|
|
assert.Equal(t, "yolo", modes[1].Key)
|
|
assert.Equal(t, "plan", modes[2].Key)
|
|
assert.Equal(t, "quiet", modes[3].Key)
|
|
}
|
|
|
|
func TestAgentProviderSwitcher(t *testing.T) {
|
|
a := &Agent{workDir: "/tmp", activeIdx: -1}
|
|
|
|
providers := []core.ProviderConfig{
|
|
{Name: "moonshot", APIKey: "sk-123"},
|
|
{Name: "custom", BaseURL: "https://api.example.com"},
|
|
}
|
|
a.SetProviders(providers)
|
|
|
|
assert.False(t, a.SetActiveProvider("missing"))
|
|
assert.True(t, a.SetActiveProvider("moonshot"))
|
|
assert.Equal(t, "moonshot", a.GetActiveProvider().Name)
|
|
|
|
list := a.ListProviders()
|
|
require.Len(t, list, 2)
|
|
assert.Equal(t, "moonshot", list[0].Name)
|
|
}
|
|
|
|
func TestAgentStartSession(t *testing.T) {
|
|
skipUnlessKimiAvailable(t)
|
|
agentInf, err := New(map[string]any{
|
|
"work_dir": "/tmp",
|
|
"model": "kimi-k2",
|
|
"mode": "default",
|
|
"timeout_mins": 10,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
session, err := agentInf.StartSession(ctx, "test-session-id")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, session)
|
|
assert.True(t, session.Alive())
|
|
assert.Equal(t, "test-session-id", session.CurrentSessionID())
|
|
|
|
err = session.Close()
|
|
assert.NoError(t, err)
|
|
assert.False(t, session.Alive())
|
|
}
|
|
|
|
func TestAgentMemoryAndSkill(t *testing.T) {
|
|
a := &Agent{workDir: "/tmp/my-project", activeIdx: -1}
|
|
|
|
assert.Equal(t, "/tmp/my-project/AGENTS.md", a.ProjectMemoryFile())
|
|
assert.NotEmpty(t, a.GlobalMemoryFile())
|
|
|
|
skillDirs := a.SkillDirs()
|
|
require.Len(t, skillDirs, 2)
|
|
assert.Contains(t, skillDirs[0], ".kimi/skills")
|
|
assert.Contains(t, skillDirs[1], ".kimi/skills")
|
|
}
|
|
|
|
func TestAgentAvailableModels(t *testing.T) {
|
|
a := &Agent{workDir: "/tmp", activeIdx: -1}
|
|
|
|
models := a.AvailableModels(context.Background())
|
|
require.True(t, len(models) > 0)
|
|
}
|