package skillpack import ( "strings" "testing" ) const goodManifest = `--- name: pdf-processing description: Extract text and tables from PDF files and fill forms. license: MIT allowed-tools: [Read, Bash] metadata: version: 1.2.0 --- # PDF Processing Use pdfplumber for extraction. ` func TestParseManifest_Good(t *testing.T) { m, err := ParseManifest([]byte(goodManifest)) if err != nil { t.Fatalf("ParseManifest: %v", err) } if m.Name != "pdf-processing" { t.Errorf("name = %q", m.Name) } if !strings.HasPrefix(m.Description, "Extract text") { t.Errorf("description = %q", m.Description) } if m.License != "MIT" { t.Errorf("license = %q", m.License) } if len(m.AllowedTools) != 2 || m.AllowedTools[0] != "Read" || m.AllowedTools[1] != "Bash" { t.Errorf("allowed-tools = %v", m.AllowedTools) } if m.Metadata["version"] != "1.2.0" { t.Errorf("metadata version = %q", m.Metadata["version"]) } if !strings.Contains(m.Body, "pdfplumber") || strings.Contains(m.Body, "---") { t.Errorf("body not cleanly extracted: %q", m.Body) } } func TestParseManifest_AllowedToolsScalar(t *testing.T) { m, err := ParseManifest([]byte("---\nname: n\ndescription: d\nallowed-tools: \"Read, Bash , Grep\"\n---\nbody\n")) if err != nil { t.Fatal(err) } if len(m.AllowedTools) != 3 || m.AllowedTools[2] != "Grep" { t.Errorf("scalar allowed-tools = %v", m.AllowedTools) } } func TestParseManifest_Errors(t *testing.T) { cases := map[string]string{ "no frontmatter": "# just a heading\n", "unterminated": "---\nname: x\ndescription: y\n", "missing name": "---\ndescription: y\n---\nb\n", "missing desc": "---\nname: x\n---\nb\n", "bad name uppercase": "---\nname: PdfProcessing\ndescription: d\n---\nb\n", "bad name space": "---\nname: pdf processing\ndescription: d\n---\nb\n", "bad yaml": "---\nname: [unclosed\n---\nb\n", } for label, in := range cases { if _, err := ParseManifest([]byte(in)); err == nil { t.Errorf("%s: expected error, got nil", label) } } } func TestParseManifest_LeadingBlanksAndCRLF(t *testing.T) { in := "\r\n\n---\r\nname: ok-name\r\ndescription: fine\r\n---\r\nbody line\r\n" m, err := ParseManifest([]byte(in)) if err != nil { t.Fatalf("tolerant parse: %v", err) } if m.Name != "ok-name" || m.Body != "body line" { t.Errorf("got name=%q body=%q", m.Name, m.Body) } }