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}