Store post state as text so Go owns the allowed values and future states such as locked remain representable without a database enum migration.
This commit is contained in:
@@ -50,6 +50,9 @@ func TestMemoryPostLifecycle(t *testing.T) {
|
||||
if err := mem.CreatePost(ctx, root); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if root.PostState != PostStateVisible {
|
||||
t.Fatalf("default post state = %q, want visible", root.PostState)
|
||||
}
|
||||
|
||||
rootID := root.ID
|
||||
later := &Post{
|
||||
@@ -175,6 +178,24 @@ func TestMemoryPostValidation(t *testing.T) {
|
||||
Body: "Body",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "invalid post state",
|
||||
post: &Post{
|
||||
AuthorID: homeowner.ID,
|
||||
Title: "Invalid state",
|
||||
Body: "Body",
|
||||
PostState: PostState("archived"),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "reply with non-visible state",
|
||||
post: &Post{
|
||||
ParentID: ptr("missing"),
|
||||
AuthorID: homeowner.ID,
|
||||
Body: "Body",
|
||||
PostState: PostStateLocked,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
@@ -185,12 +206,12 @@ func TestMemoryPostValidation(t *testing.T) {
|
||||
}
|
||||
|
||||
hidden := &Post{
|
||||
ID: "hidden",
|
||||
AuthorID: homeowner.ID,
|
||||
Title: "Hidden",
|
||||
Body: "Body",
|
||||
PostDate: "2026-08-26",
|
||||
Hidden: true,
|
||||
ID: "hidden",
|
||||
AuthorID: homeowner.ID,
|
||||
Title: "Hidden",
|
||||
Body: "Body",
|
||||
PostDate: "2026-08-26",
|
||||
PostState: PostStateHidden,
|
||||
}
|
||||
if err := mem.CreatePost(ctx, hidden); err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -199,6 +220,28 @@ func TestMemoryPostValidation(t *testing.T) {
|
||||
t.Fatalf("hidden root vote error = %v", err)
|
||||
}
|
||||
|
||||
locked := &Post{
|
||||
ID: "locked",
|
||||
AuthorID: homeowner.ID,
|
||||
Title: "Locked",
|
||||
Body: "Body",
|
||||
PostDate: "2026-08-26",
|
||||
PostState: PostStateLocked,
|
||||
}
|
||||
if err := mem.CreatePost(ctx, locked); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := mem.VotePost(ctx, homeowner.ID, locked.ID, 1); err != nil {
|
||||
t.Fatalf("locked root should remain votable: %v", err)
|
||||
}
|
||||
roots, err := mem.ListRootPosts(ctx, locked.PostDate, homeowner.ID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(roots) != 1 || roots[0].ID != locked.ID || roots[0].PostState != PostStateLocked {
|
||||
t.Fatalf("locked root should remain visible: %+v", roots)
|
||||
}
|
||||
|
||||
if _, err := mem.GetPostThread(ctx, "missing"); !errors.Is(err, sql.ErrNoRows) {
|
||||
t.Fatalf("missing thread error = %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user