slidewalk/internal/parser/frontmatter_test.go
2026-07-15 20:14:07 +02:00

91 lines
2 KiB
Go

package parser
import (
"testing"
)
func TestSplitFrontmatter(t *testing.T) {
tests := []struct {
name string
input string
wantFM string
wantBody string
}{
{
name: "no frontmatter",
input: "# Just markdown\n",
wantFM: "",
wantBody: "# Just markdown\n",
},
{
name: "with frontmatter",
input: "---\ntitle: Hello\n---\n# Body\n",
wantFM: "title: Hello",
wantBody: "# Body\n",
},
{
name: "frontmatter with no trailing body",
input: "---\ntitle: Hello\n---\n",
wantFM: "title: Hello",
wantBody: "",
},
{
name: "unterminated frontmatter treated as body",
input: "---\ntitle: Hello\n# Body\n",
wantFM: "",
wantBody: "---\ntitle: Hello\n# Body\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fm, body := splitFrontmatter([]byte(tt.input))
if string(fm) != tt.wantFM {
t.Errorf("frontmatter = %q, want %q", fm, tt.wantFM)
}
if string(body) != tt.wantBody {
t.Errorf("body = %q, want %q", body, tt.wantBody)
}
})
}
}
func TestParseFrontmatter(t *testing.T) {
tests := []struct {
name string
input string
want frontmatter
wantErr bool
}{
{
name: "all fields",
input: "---\ntitle: Intro\nclass: center\nnotes: speaker notes\nskip: true\nincremental: true\n---\nbody\n",
want: frontmatter{Title: "Intro", Class: "center", Notes: "speaker notes", Skip: true, Incremental: true},
},
{
name: "no frontmatter defaults to zero values",
input: "just body\n",
want: frontmatter{},
},
{
name: "invalid yaml",
input: "---\ntitle: [unterminated\n---\nbody\n",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, _, err := parseFrontmatter([]byte(tt.input))
if (err != nil) != tt.wantErr {
t.Fatalf("err = %v, wantErr %v", err, tt.wantErr)
}
if err != nil {
return
}
if got != tt.want {
t.Errorf("frontmatter = %+v, want %+v", got, tt.want)
}
})
}
}