You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

71 lines
2.4 KiB

package controlplane
import (
"path/filepath"
"strings"
"testing"
)
func TestSkillDocumentProvidesReadOnlyMarkdownWithSensitiveLinesRedacted(t *testing.T) {
t.Setenv("MULTICLAW_CONTROLLER_DATA_DIR", t.TempDir())
controller, err := Open(filepath.Join(t.TempDir(), "controller-config.json"))
if err != nil {
t.Fatal(err)
}
defer controller.Close()
skill, err := controller.SaveSkill(SkillInput{
Name: "只读预览测试",
Version: "1.0.0",
Content: "# Skill\n\npassword: demo-password\napi_key=demo-key\n普通说明\n<think>不应显示</think>",
})
if err != nil {
t.Fatal(err)
}
document, err := controller.SkillDocument(skill.ID)
if err != nil {
t.Fatal(err)
}
if document.ID != skill.ID || document.Name != skill.Name || !strings.Contains(document.Content, "普通说明") {
t.Fatalf("unexpected Skill document: %#v", document)
}
for _, forbidden := range []string{"demo-password", "demo-key", "不应显示"} {
if strings.Contains(document.Content, forbidden) {
t.Fatalf("Skill preview leaked sensitive or hidden content: %q", forbidden)
}
}
if strings.Count(document.Content, "[已脱敏]") != 2 {
t.Fatalf("expected both sensitive values to be redacted: %q", document.Content)
}
if _, err := controller.SkillDocument("not-a-skill-id"); err == nil {
t.Fatal("invalid Skill ID must be rejected")
}
}
func TestSaveSkillKeepsItsIdentityWhenAnUpdatedVersionIsImported(t *testing.T) {
t.Setenv("MULTICLAW_CONTROLLER_DATA_DIR", t.TempDir())
controller, err := Open(filepath.Join(t.TempDir(), "controller-config.json"))
if err != nil {
t.Fatal(err)
}
defer controller.Close()
first, err := controller.SaveSkill(SkillInput{Name: "Docker Essentials", Version: "1.0.0", Content: "# Docker\n第一版"})
if err != nil {
t.Fatal(err)
}
second, err := controller.SaveSkill(SkillInput{Name: "Docker Essentials", Version: "1.1.0", Content: "# Docker\n第二版"})
if err != nil {
t.Fatal(err)
}
if second.ID != first.ID || second.Version != "1.1.0" || second.Checksum == first.Checksum {
t.Fatalf("expected an in-place update, got %#v then %#v", first, second)
}
skills, err := controller.Skills()
if err != nil || len(skills) != 1 {
t.Fatalf("a renamed import must not create a duplicate package: %#v / %v", skills, err)
}
document, err := controller.SkillDocument(second.ID)
if err != nil || !strings.Contains(document.Content, "第二版") {
t.Fatalf("expected the updated Markdown, got %#v / %v", document, err)
}
}