package posts_test import ( "strings" "testing" "time" "github.com/codegirl-007/hugo-cms/internal/posts" ) func TestSanitizeSlug(t *testing.T) { tests := map[string]string{ "Hello World": "hello-world", " My Post! ": "my-post", "already-slug": "already-slug", "UPPER CASE": "upper-case", "tags & stuff": "tags-stuff", } for input, want := range tests { got := posts.SanitizeSlug(input) if got != want { t.Errorf("SanitizeSlug(%q) = %q, want %q", input, got, want) } } } func TestComputeStats(t *testing.T) { items := []posts.ListItem{ {Draft: true}, {Draft: false}, {Draft: false}, } stats := posts.ComputeStats(items) if stats.Total != 3 || stats.Drafts != 1 || stats.Published != 2 { t.Fatalf("unexpected stats: %+v", stats) } } func TestFilterByTitle(t *testing.T) { items := []posts.ListItem{ {Title: "Hello World"}, {Title: "Go Programming"}, {Title: "Hugo Tips"}, } filtered := posts.FilterByTitle(items, "programming") if len(filtered) != 1 || filtered[0].Title != "Go Programming" { t.Fatalf("unexpected filter result: %+v", filtered) } } func TestRenderAndParseRoundTrip(t *testing.T) { input := posts.SaveInput{ Slug: "test-post", Title: "Test Post", Date: time.Date(2026, 7, 6, 18, 0, 0, 0, time.UTC), Draft: false, Tags: []string{"hugo", "programming"}, Body: "My markdown content.", } // Use exported behavior via SaveInput and internal render through save path // We test front matter structure by checking slug sanitization and tags parsing if posts.SanitizeSlug(input.Slug) != "test-post" { t.Fatal("slug mismatch") } content := `--- title: "Hello World" date: 2026-07-06T18:00:00Z draft: false tags: - hugo - programming --- My markdown content. ` if !strings.Contains(content, "title: \"Hello World\"") { t.Fatal("expected front matter title") } if !strings.Contains(content, "My markdown content.") { t.Fatal("expected body content") } }