Files
magpie/internal/library/ccswitch_test.go
T

83 lines
2.8 KiB
Go

package library
import (
"database/sql"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
_ "modernc.org/sqlite"
)
// A skill the library links to in CC Switch's folder is updated from the
// GitHub repository CC Switch installed it from, and becomes the library's
// own; CC Switch's folder is left as it was.
func TestCCSwitchSkillUpdates(t *testing.T) {
h := sandbox(t)
ccs := filepath.Join(h, ".cc-switch")
write(t, filepath.Join(ccs, "skills/pdf/SKILL.md"), "---\nname: pdf\ndescription: old\n---\n")
write(t, filepath.Join(ccs, "skills/mine/SKILL.md"), "---\nname: mine\n---\n")
db, err := sql.Open("sqlite", filepath.Join(ccs, "cc-switch.db"))
if err != nil {
t.Fatal(err)
}
for _, q := range []string{
`CREATE TABLE skills (id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, directory TEXT NOT NULL, repo_owner TEXT, repo_name TEXT, repo_branch TEXT DEFAULT 'main')`,
`INSERT INTO skills VALUES ('1','pdf','','pdf','owner','repo','main'), ('2','mine','','mine',NULL,NULL,NULL)`,
} {
if _, err := db.Exec(q); err != nil {
t.Fatal(err)
}
}
db.Close()
var asked []string
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
asked = append(asked, r.URL.Path)
w.Write(tarball(t, map[string]string{
"skills/pdf/SKILL.md": "---\nname: pdf\ndescription: new\n---\n",
"skills/pdf/forms.md": "forms",
}))
}))
defer srv.Close()
old := tarballURL
tarballURL = func(repo, ref string) string { return srv.URL + "/" + repo + "/" + ref }
defer func() { tarballURL = old }()
ok(t)(InstallSkills(filepath.Join(ccs, "skills"), []string{"pdf", "mine"}, []string{"claude"}))
v, err := Read(nil)
if err != nil {
t.Fatal(err)
}
origins := map[string]string{}
for _, s := range v.Skills {
origins[s.Name] = s.Origin
}
if origins["pdf"] != "https://github.com/owner/repo/tree/main" || origins["mine"] != "" {
t.Fatalf("origins %v", origins)
}
if _, err := UpdateSkill("mine"); err == nil {
t.Error("one CC Switch has no repository for was updated")
}
ok(t)(UpdateSkill("pdf"))
if asked[len(asked)-1] != "/owner/repo/main" {
t.Errorf("asked %v", asked)
}
if s := read(t, filepath.Join(h, ".claude/skills/pdf/forms.md")); s != "forms" {
t.Errorf("claude's pdf: %q", s)
}
if s := read(t, filepath.Join(ccs, "skills/pdf/SKILL.md")); !strings.Contains(s, "old") {
t.Errorf("CC Switch's folder changed: %q", s)
}
if fi, err := os.Lstat(skillDir("pdf")); err != nil || fi.Mode()&os.ModeSymlink != 0 {
t.Errorf("the library's pdf is still a link: %v", err)
}
l, _ := load()
if s := l.skill("pdf"); s.Source == nil || s.Source.Kind != "github" || s.Source.Repo != "owner/repo" || s.Source.Path != "skills/pdf" {
t.Errorf("source %+v", s.Source)
}
ok(t)(UpdateSkill("pdf")) // from GitHub now, like any other
}