summaryrefslogtreecommitdiffstats
path: root/internal/db/posts_test.go
diff options
context:
space:
mode:
authorivar <i@oiee.no>2026-04-04 16:36:18 +0200
committerivar <i@oiee.no>2026-04-04 16:36:18 +0200
commit0d8f53520a2143b22e2246ab1ec25e0860e90dad (patch)
treeda1798fed5b7f4847538ee7b355a0397f28bbc33 /internal/db/posts_test.go
parenta6355e7a6530af3335c4cd8af05f1e9c8b978169 (diff)
downloadnebbet.no-0d8f53520a2143b22e2246ab1ec25e0860e90dad.tar.xz
nebbet.no-0d8f53520a2143b22e2246ab1ec25e0860e90dad.zip
fix: make slug rename and content update atomic via RenameAndUpsertPost
Previously RenamePost + UpsertPost were two separate DB calls; a failure between them left the post at the new slug with stale content. The new RenameAndUpsertPost method does both in a single transaction. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/db/posts_test.go')
-rw-r--r--internal/db/posts_test.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/internal/db/posts_test.go b/internal/db/posts_test.go
index 26664ce..1c3eb33 100644
--- a/internal/db/posts_test.go
+++ b/internal/db/posts_test.go
@@ -124,6 +124,52 @@ func TestRenamePost(t *testing.T) {
}
}
+func TestRenameAndUpsertPost(t *testing.T) {
+ m := openTestDB(t)
+
+ if err := m.UpsertPost(PostRecord{Slug: "old", Title: "Old Title", Date: "2026-01-01", Blocks: "[]", UpdatedAt: 1}); err != nil {
+ t.Fatalf("UpsertPost: %v", err)
+ }
+
+ updated := PostRecord{
+ Slug: "new",
+ Title: "New Title",
+ Date: "2026-04-04",
+ Tags: []string{"go"},
+ Blocks: "[]",
+ UpdatedAt: 2,
+ }
+ if err := m.RenameAndUpsertPost("old", updated); err != nil {
+ t.Fatalf("RenameAndUpsertPost: %v", err)
+ }
+
+ // New slug has updated content
+ got, err := m.GetPost("new")
+ if err != nil {
+ t.Fatalf("GetPost new: %v", err)
+ }
+ if got.Title != "New Title" {
+ t.Errorf("title: got %q, want %q", got.Title, "New Title")
+ }
+ if got.Date != "2026-04-04" {
+ t.Errorf("date: got %q, want %q", got.Date, "2026-04-04")
+ }
+
+ // Old slug is gone
+ if _, err := m.GetPost("old"); err == nil {
+ t.Error("expected old slug to be deleted")
+ }
+
+ // Redirect created
+ toSlug, err := m.GetRedirect("old")
+ if err != nil {
+ t.Fatalf("GetRedirect: %v", err)
+ }
+ if toSlug != "new" {
+ t.Errorf("redirect: got %q, want %q", toSlug, "new")
+ }
+}
+
func TestRenamePost_CollapsesChain(t *testing.T) {
m := openTestDB(t)