main pico / pkg / apps / feeds / db_test.go
Antonio Mika  ·  2026-10-10
  1package feeds
  2
  3import (
  4	"log/slog"
  5	"testing"
  6	"time"
  7
  8	"github.com/picosh/pico/pkg/db"
  9	"github.com/picosh/pico/pkg/db/postgres"
 10	"github.com/picosh/pico/pkg/db/postgres/pgtest"
 11)
 12
 13var testDB *PsqlDB
 14
 15func TestMain(m *testing.M) {
 16	pgtest.Main(m)
 17}
 18
 19func cleanupTestData(t *testing.T) {
 20	t.Helper()
 21	if testDB == nil {
 22		testDB = NewDB(postgres.NewDB(pgtest.URL(t), slog.New(slog.DiscardHandler)))
 23	}
 24	pgtest.Clean(t, testDB.Db)
 25}
 26
 27func mustInsertPost(t *testing.T, post *db.Post) *db.Post {
 28	t.Helper()
 29	return pgtest.InsertPost(t, testDB, post)
 30}
 31
 32func TestFindUsersWithPost(t *testing.T) {
 33	cleanupTestData(t)
 34
 35	user, _ := testDB.RegisterUser("feedspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedspostowner", "comment", "")
 36
 37	_ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"})
 38
 39	users, err := testDB.FindUsersWithPost("feeds")
 40	if err != nil {
 41		t.Fatalf("FindUsersWithPost failed: %v", err)
 42	}
 43	if len(users) != 1 {
 44		t.Errorf("expected 1 user, got %d", len(users))
 45	}
 46}
 47
 48func TestInsertFeedItems(t *testing.T) {
 49	cleanupTestData(t)
 50
 51	user, _ := testDB.RegisterUser("feeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feeditemsowner", "comment", "")
 52	post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"})
 53
 54	items := []*db.FeedItem{
 55		{PostID: post.ID, GUID: "guid-1", Data: db.FeedItemData{Title: "Item 1", Link: "http://example.com/1"}},
 56		{PostID: post.ID, GUID: "guid-2", Data: db.FeedItemData{Title: "Item 2", Link: "http://example.com/2"}},
 57	}
 58
 59	err := testDB.InsertFeedItems(post.ID, items)
 60	if err != nil {
 61		t.Fatalf("InsertFeedItems failed: %v", err)
 62	}
 63}
 64
 65func TestFindFeedItemsByPostID(t *testing.T) {
 66	cleanupTestData(t)
 67
 68	user, _ := testDB.RegisterUser("findfeeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeeditemsowner", "comment", "")
 69	post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "findfeed.txt", Slug: "findfeed", Title: "Find Feed", Space: "feeds"})
 70
 71	items := []*db.FeedItem{
 72		{PostID: post.ID, GUID: "find-guid-1", Data: db.FeedItemData{Title: "Find Item 1"}},
 73	}
 74	_ = testDB.InsertFeedItems(post.ID, items)
 75
 76	found, err := testDB.FindFeedItemsByPostID(post.ID)
 77	if err != nil {
 78		t.Fatalf("FindFeedItemsByPostID failed: %v", err)
 79	}
 80	if len(found) != 1 {
 81		t.Errorf("expected 1 feed item, got %d", len(found))
 82	}
 83}
 84
 85// ============ Projects Tests ============
 86
 87func TestFeedItemData_JSONBRoundtrip(t *testing.T) {
 88	cleanupTestData(t)
 89
 90	user, _ := testDB.RegisterUser("feedjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedjsonbowner", "comment", "")
 91	post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feedjsonb.txt", Slug: "feedjsonb", Title: "Feed JSONB", Space: "feeds"})
 92
 93	now := time.Now().Truncate(time.Second)
 94	items := []*db.FeedItem{
 95		{
 96			PostID: post.ID,
 97			GUID:   "jsonb-guid",
 98			Data: db.FeedItemData{
 99				Title:       "JSONB Item",
100				Description: "Description",
101				Content:     "Content",
102				Link:        "http://example.com",
103				PublishedAt: &now,
104			},
105		},
106	}
107	_ = testDB.InsertFeedItems(post.ID, items)
108
109	found, err := testDB.FindFeedItemsByPostID(post.ID)
110	if err != nil {
111		t.Fatalf("FindFeedItemsByPostID failed: %v", err)
112	}
113	if len(found) != 1 {
114		t.Fatalf("expected 1 item, got %d", len(found))
115	}
116	if found[0].Data.Title != "JSONB Item" {
117		t.Errorf("expected title 'JSONB Item', got '%s'", found[0].Data.Title)
118	}
119}