Provide one creation path for roots and replies, recursive thread loading, body-only updates, root listings, and post voting across PostgreSQL and the in-memory test store.
This commit is contained in:
@@ -9,6 +9,8 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
"plumber/internal/store/sqlc"
|
||||
)
|
||||
|
||||
func TestMigratePostsCopiesLegacyData(t *testing.T) {
|
||||
@@ -47,7 +49,9 @@ func TestMigratePostsCopiesLegacyData(t *testing.T) {
|
||||
|
||||
legacySchema := `
|
||||
CREATE TABLE users (
|
||||
id TEXT PRIMARY KEY
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
role TEXT NOT NULL
|
||||
);
|
||||
CREATE TABLE questions (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -76,7 +80,8 @@ CREATE TABLE votes (
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := conn.ExecContext(ctx, `
|
||||
INSERT INTO users (id) VALUES ('homeowner'), ('plumber');
|
||||
INSERT INTO users (id, name, role)
|
||||
VALUES ('homeowner', 'Home Owner', 'user'), ('plumber', 'The Plumber', 'admin');
|
||||
INSERT INTO questions (id, author_id, title, body, city, hunt_date, hidden, created_at)
|
||||
VALUES ('question-1', 'homeowner', 'Leaky sink', 'It drips.', 'Oakland', '2026-08-26', 0, '2026-08-26T08:00:00Z');
|
||||
INSERT INTO answers (question_id, author_id, body, created_at, updated_at)
|
||||
@@ -183,6 +188,56 @@ INSERT INTO posts (
|
||||
)`); err == nil {
|
||||
t.Fatal("reply with root-only title unexpectedly succeeded")
|
||||
}
|
||||
|
||||
queries := sqlc.New(conn)
|
||||
if err := queries.CreatePost(ctx, sqlc.CreatePostParams{
|
||||
ID: "follow-up",
|
||||
ParentID: sql.NullString{String: "answer:question-1", Valid: true},
|
||||
AuthorID: "homeowner",
|
||||
Body: "It is still dripping.",
|
||||
CreatedAt: "2026-08-26T10:00:00Z",
|
||||
UpdatedAt: "2026-08-26T10:00:00Z",
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
thread, err := queries.ListPostThread(ctx, "question-1")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(thread) != 3 ||
|
||||
thread[0].ID != "question-1" ||
|
||||
thread[1].ID != "answer:question-1" ||
|
||||
thread[2].ID != "follow-up" {
|
||||
t.Fatalf("recursive thread = %+v", thread)
|
||||
}
|
||||
if n, err := queries.UpdatePost(ctx, sqlc.UpdatePostParams{
|
||||
ID: "follow-up",
|
||||
Body: "The drip continues.",
|
||||
UpdatedAt: "2026-08-26T10:05:00Z",
|
||||
}); err != nil || n != 1 {
|
||||
t.Fatalf("update rows=%d error=%v", n, err)
|
||||
}
|
||||
if n, err := queries.UpsertPostVoteOnVisibleRoot(ctx, sqlc.UpsertPostVoteOnVisibleRootParams{
|
||||
UserID: "plumber",
|
||||
PostID: "question-1",
|
||||
Value: 1,
|
||||
}); err != nil || n != 1 {
|
||||
t.Fatalf("vote rows=%d error=%v", n, err)
|
||||
}
|
||||
roots, err := queries.ListRootPosts(ctx, sqlc.ListRootPostsParams{
|
||||
ViewerID: "plumber",
|
||||
RowLimit: 100,
|
||||
PostDate: "2026-08-26",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(roots) != 1 ||
|
||||
roots[0].Score != 2 ||
|
||||
!roots[0].Answered ||
|
||||
roots[0].UserVote != 1 {
|
||||
t.Fatalf("root annotations = %+v", roots)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMigratePostsReportsStep(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user