main pico / pkg / apps / pgs / db / postgres_test.go
Antonio Mika  ·  2026-10-25
 1package pgsdb
 2
 3import (
 4	"log/slog"
 5	"testing"
 6	"time"
 7
 8	"github.com/jmoiron/sqlx"
 9	"github.com/picosh/pico/pkg/db/postgres/pgtest"
10)
11
12func TestMain(m *testing.M) {
13	pgtest.Main(m)
14}
15
16func TestFindProjectsOrder(t *testing.T) {
17	conn := sqlx.MustConnect("postgres", pgtest.URL(t))
18	t.Cleanup(func() { _ = conn.Close() })
19	pgtest.Clean(t, conn)
20	testDB := NewDBWithConn(conn, slog.New(slog.DiscardHandler))
21
22	var userID string
23	if err := conn.Get(&userID, `INSERT INTO app_users (name) VALUES ('projectsowner') RETURNING id`); err != nil {
24		t.Fatalf("insert user: %v", err)
25	}
26
27	// "older" was created first but updated last, so the two orderings differ.
28	now := time.Now()
29	for _, p := range []struct {
30		name      string
31		createdAt time.Time
32		updatedAt time.Time
33	}{
34		{"older", now.Add(-2 * time.Hour), now},
35		{"newer", now.Add(-1 * time.Hour), now.Add(-1 * time.Hour)},
36	} {
37		id, err := testDB.InsertProject(userID, p.name, p.name)
38		if err != nil {
39			t.Fatalf("insert project %s: %v", p.name, err)
40		}
41		_, err = conn.Exec(`UPDATE projects SET created_at = $1, updated_at = $2 WHERE id = $3`, p.createdAt, p.updatedAt, id)
42		if err != nil {
43			t.Fatalf("set project %s times: %v", p.name, err)
44		}
45	}
46
47	for by, want := range map[string][]string{
48		"created_at": {"newer", "older"},
49		"updated_at": {"older", "newer"},
50	} {
51		projects, err := testDB.FindProjects(by)
52		if err != nil {
53			t.Fatalf("FindProjects(%s) failed: %v", by, err)
54		}
55		var got []string
56		for _, p := range projects {
57			got = append(got, p.Name)
58		}
59		if len(got) != len(want) || got[0] != want[0] || got[1] != want[1] {
60			t.Errorf("FindProjects(%s) = %v, want %v", by, got, want)
61		}
62	}
63}