package main import ( "os" "path/filepath" "strings" "testing" ) func TestPatchFrontmatterField_UpdateExistingKey(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "0119-x.md") original := "---\n" + "id: \"0119\"\n" + "title: \"Test\"\n" + "status: pendiente\n" + "priority: alta\n" + "tags: [a, b]\n" + "---\n" + "\n" + "# Body heading\n" + "\n" + "Some body.\n" if err := os.WriteFile(path, []byte(original), 0o644); err != nil { t.Fatalf("write: %v", err) } if err := PatchFrontmatterField(path, "status", "en-curso"); err != nil { t.Fatalf("patch: %v", err) } got, err := os.ReadFile(path) if err != nil { t.Fatalf("read: %v", err) } gotStr := string(got) if !strings.Contains(gotStr, "status: en-curso") { t.Fatalf("expected status: en-curso, got:\n%s", gotStr) } // Preserve everything else. for _, line := range []string{ `id: "0119"`, `title: "Test"`, `priority: alta`, `tags: [a, b]`, `# Body heading`, `Some body.`, } { if !strings.Contains(gotStr, line) { t.Fatalf("line %q lost after patch, got:\n%s", line, gotStr) } } // Ensure original status line is gone (no duplicate). if strings.Count(gotStr, "status:") != 1 { t.Fatalf("expected exactly one status: line, got %d:\n%s", strings.Count(gotStr, "status:"), gotStr) } } func TestPatchFrontmatterField_InsertMissingKey(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "0119-x.md") original := "---\n" + "id: \"0119\"\n" + "title: \"Test\"\n" + "---\n" + "body\n" if err := os.WriteFile(path, []byte(original), 0o644); err != nil { t.Fatalf("write: %v", err) } if err := PatchFrontmatterField(path, "status", "done"); err != nil { t.Fatalf("patch: %v", err) } got, _ := os.ReadFile(path) gotStr := string(got) if !strings.Contains(gotStr, "status: done") { t.Fatalf("missing inserted status line:\n%s", gotStr) } if !strings.Contains(gotStr, "body") { t.Fatalf("body lost:\n%s", gotStr) } } func TestPatchFrontmatterField_NoFrontmatter(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "plain.md") _ = os.WriteFile(path, []byte("just a body\n"), 0o644) err := PatchFrontmatterField(path, "status", "done") if err == nil { t.Fatalf("expected error for missing frontmatter") } } func TestPatchFrontmatterField_AtomicNoLeftovers(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "0119.md") _ = os.WriteFile(path, []byte("---\nid: \"0119\"\nstatus: pendiente\n---\n"), 0o644) if err := PatchFrontmatterField(path, "status", "en-curso"); err != nil { t.Fatalf("patch: %v", err) } entries, _ := os.ReadDir(dir) for _, e := range entries { if strings.HasPrefix(e.Name(), ".fm.") || strings.HasSuffix(e.Name(), ".tmp") { t.Fatalf("leftover tmp file: %s", e.Name()) } } }