Files
picoclaw/pkg/evolution/lifecycle_actions_test.go
T
lxowalle b3a7b7ad64 feat: agent self evolution (#2847)
* feat: add agent self-evolution

* fix ci

* delete unused doc

* fix lint

* fix evolution review issues
2026-05-11 16:13:27 +08:00

73 lines
1.9 KiB
Go

package evolution_test
import (
"os"
"path/filepath"
"testing"
"github.com/sipeed/picoclaw/pkg/evolution"
)
func TestApplyLifecycleStateDeletedRemovesSkillFile(t *testing.T) {
workspace := t.TempDir()
skillDir := filepath.Join(workspace, "skills", "weather")
if err := os.MkdirAll(skillDir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
skillPath := filepath.Join(skillDir, "SKILL.md")
if err := os.WriteFile(skillPath, []byte("# weather\n"), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
err := evolution.ApplyLifecycleState(
evolution.NewPaths(workspace, ""),
evolution.SkillProfile{SkillName: "weather"},
evolution.SkillStatusDeleted,
)
if err != nil {
t.Fatalf("ApplyLifecycleState: %v", err)
}
if _, err := os.Stat(skillPath); !os.IsNotExist(err) {
t.Fatalf("skill file should be removed, stat err = %v", err)
}
}
func TestApplyLifecycleStateDeletedRequiresResolvedWorkspace(t *testing.T) {
err := evolution.ApplyLifecycleState(
evolution.Paths{RootDir: filepath.Join(t.TempDir(), "shared-evolution")},
evolution.SkillProfile{SkillName: "weather"},
evolution.SkillStatusDeleted,
)
if err == nil {
t.Fatal("expected error when workspace cannot be resolved")
}
}
func TestApplyLifecycleStateDeletedRequiresSkillName(t *testing.T) {
workspace := t.TempDir()
err := evolution.ApplyLifecycleState(
evolution.NewPaths(workspace, ""),
evolution.SkillProfile{WorkspaceID: workspace},
evolution.SkillStatusDeleted,
)
if err == nil {
t.Fatal("expected error when skill name is empty")
}
}
func TestApplyLifecycleStateDeletedRejectsTraversalSkillName(t *testing.T) {
workspace := t.TempDir()
err := evolution.ApplyLifecycleState(
evolution.NewPaths(workspace, ""),
evolution.SkillProfile{WorkspaceID: workspace, SkillName: "../escape"},
evolution.SkillStatusDeleted,
)
if err == nil {
t.Fatal("expected error for traversal skill name")
}
}