Files
BlackBean/pigo/internal/pkgmgr/distribute_skill_test.go
2026-08-14 23:41:57 +08:00

77 lines
2.4 KiB
Go

package pkgmgr
import (
"os"
"path/filepath"
"testing"
)
// TestDistributeSkill verifies a skill package copies into skillsDir/<name>/
// with its SKILL.md and supporting files, discoverable by LoadSkillsDir's
// nested layout.
func TestDistributeSkill(t *testing.T) {
skills := t.TempDir()
t.Setenv("PIGO_SKILLS_DIR", skills)
pkg := writePkg(t, `{"name":"pi-writing","version":"1.0.0","pi":{"type":"skill"}}`, map[string]string{
"SKILL.md": "---\nname: writing\ndescription: help writing\n---\nbody",
"references/tips.md": "tips",
})
files, err := DistributeSkill(pkg, "pi-writing")
if err != nil {
t.Fatalf("DistributeSkill: %v", err)
}
// SKILL.md must land at <skillsDir>/<name>/SKILL.md (nested layout).
skillMd := filepath.Join(skills, "pi-writing", "SKILL.md")
if _, err := os.Stat(skillMd); err != nil {
t.Fatalf("SKILL.md not placed: %v", err)
}
if _, err := os.Stat(filepath.Join(skills, "pi-writing", "references", "tips.md")); err != nil {
t.Errorf("supporting file not copied: %v", err)
}
var sawSkillMd bool
for _, f := range files {
if f == skillMd {
sawSkillMd = true
}
}
if !sawSkillMd {
t.Errorf("created files %v missing SKILL.md", files)
}
}
// TestDistributeSkillReinstallReplaces verifies reinstalling clears stale files.
func TestDistributeSkillReinstallReplaces(t *testing.T) {
skills := t.TempDir()
t.Setenv("PIGO_SKILLS_DIR", skills)
pkg1 := writePkg(t, `{"name":"pi-s","version":"1.0.0"}`, map[string]string{
"SKILL.md": "---\nname: s\ndescription: d\n---\n",
"old.md": "old",
})
if _, err := DistributeSkill(pkg1, "pi-s"); err != nil {
t.Fatalf("first install: %v", err)
}
pkg2 := writePkg(t, `{"name":"pi-s","version":"2.0.0"}`, map[string]string{
"SKILL.md": "---\nname: s\ndescription: d2\n---\n",
})
if _, err := DistributeSkill(pkg2, "pi-s"); err != nil {
t.Fatalf("reinstall: %v", err)
}
if _, err := os.Stat(filepath.Join(skills, "pi-s", "old.md")); !os.IsNotExist(err) {
t.Errorf("stale skill file survived reinstall: %v", err)
}
}
// TestDistributeSkillNoSkillMd verifies a package without SKILL.md errors.
func TestDistributeSkillNoSkillMd(t *testing.T) {
t.Setenv("PIGO_SKILLS_DIR", t.TempDir())
pkg := writePkg(t, `{"name":"pi-noskill","version":"1.0.0"}`, nil)
if _, err := DistributeSkill(pkg, "pi-noskill"); err == nil {
t.Fatal("DistributeSkill without SKILL.md = nil error, want error")
}
}