Files
reddit-reader/internal/store/store_test.go

118 lines
4.4 KiB
Go

package store_test
import (
"testing"
"time"
"somegit.dev/vikingowl/reddit-reader/internal/domain"
"somegit.dev/vikingowl/reddit-reader/internal/store"
)
func newTestStore(t *testing.T) *store.Store {
t.Helper()
s, err := store.Open(":memory:")
if err != nil {
t.Fatalf("Open: %v", err)
}
t.Cleanup(func() { s.Close() })
return s
}
func TestInsertAndGetPost(t *testing.T) {
s := newTestStore(t)
rel := 0.85
sum := "- point 1\n- point 2"
post := domain.Post{
ID: "t3_abc123", Subreddit: "golang", Title: "Test Post",
Author: "testuser", URL: "https://reddit.com/r/golang/test",
SelfText: "Some text", Score: 42,
CreatedUTC: time.Date(2026, 4, 1, 12, 0, 0, 0, time.UTC),
Relevance: &rel, Summary: &sum,
}
if err := s.InsertPost(post); err != nil {
t.Fatalf("InsertPost: %v", err)
}
got, err := s.GetPost("t3_abc123")
if err != nil {
t.Fatalf("GetPost: %v", err)
}
if got.Title != "Test Post" { t.Errorf("Title = %q, want %q", got.Title, "Test Post") }
if got.Relevance == nil || *got.Relevance != 0.85 { t.Errorf("Relevance = %v, want 0.85", got.Relevance) }
}
func TestPostExists(t *testing.T) {
s := newTestStore(t)
exists, _ := s.PostExists("t3_nonexistent")
if exists { t.Error("PostExists returned true for nonexistent post") }
s.InsertPost(domain.Post{ID: "t3_exists", Subreddit: "test", Title: "Exists", CreatedUTC: time.Now()})
exists, _ = s.PostExists("t3_exists")
if !exists { t.Error("PostExists returned false for existing post") }
}
func TestListPosts(t *testing.T) {
s := newTestStore(t)
rel1, rel2 := 0.9, 0.5
s.InsertPost(domain.Post{ID: "t3_a", Subreddit: "golang", Title: "High", CreatedUTC: time.Now(), Relevance: &rel1})
s.InsertPost(domain.Post{ID: "t3_b", Subreddit: "golang", Title: "Low", CreatedUTC: time.Now(), Relevance: &rel2})
posts, err := s.ListPosts(store.ListFilter{})
if err != nil { t.Fatalf("ListPosts: %v", err) }
if len(posts) != 2 { t.Fatalf("len = %d, want 2", len(posts)) }
if posts[0].Title != "High" { t.Errorf("first post = %q, want %q (ordered by relevance desc)", posts[0].Title, "High") }
}
func TestListPostsFilterBySubreddit(t *testing.T) {
s := newTestStore(t)
s.InsertPost(domain.Post{ID: "t3_a", Subreddit: "golang", Title: "Go", CreatedUTC: time.Now()})
s.InsertPost(domain.Post{ID: "t3_b", Subreddit: "linux", Title: "Linux", CreatedUTC: time.Now()})
posts, _ := s.ListPosts(store.ListFilter{Subreddit: "golang"})
if len(posts) != 1 { t.Fatalf("len = %d, want 1", len(posts)) }
if posts[0].Subreddit != "golang" { t.Errorf("Subreddit = %q, want golang", posts[0].Subreddit) }
}
func TestUpdatePostFlags(t *testing.T) {
s := newTestStore(t)
s.InsertPost(domain.Post{ID: "t3_a", Subreddit: "test", Title: "Test", CreatedUTC: time.Now()})
s.UpdatePost("t3_a", store.PostUpdate{Read: boolPtr(true), Starred: boolPtr(true)})
got, _ := s.GetPost("t3_a")
if !got.Read { t.Error("Read should be true") }
if !got.Starred { t.Error("Starred should be true") }
}
func TestSubredditCRUD(t *testing.T) {
s := newTestStore(t)
s.AddSubreddit(domain.Subreddit{Name: "golang", PollSort: "new"})
subs, _ := s.ListSubreddits()
if len(subs) != 1 || subs[0].Name != "golang" { t.Errorf("ListSubreddits = %v", subs) }
s.RemoveSubreddit("golang")
subs, _ = s.ListSubreddits()
if len(subs) != 0 { t.Errorf("after remove = %v", subs) }
}
func TestFilterCRUD(t *testing.T) {
s := newTestStore(t)
s.AddSubreddit(domain.Subreddit{Name: "golang", PollSort: "new"})
id, _ := s.AddFilter(domain.Filter{Subreddit: "golang", Pattern: "generics"})
if id == 0 { t.Error("AddFilter returned 0") }
filters, _ := s.ListFilters("golang")
if len(filters) != 1 || filters[0].Pattern != "generics" { t.Errorf("ListFilters = %v", filters) }
}
func TestFeedback(t *testing.T) {
s := newTestStore(t)
s.InsertPost(domain.Post{ID: "t3_a", Subreddit: "test", Title: "Test", CreatedUTC: time.Now()})
s.AddFeedback("t3_a", 1)
fb, _ := s.RecentFeedback(10)
if len(fb) != 1 || fb[0].Vote != 1 { t.Errorf("RecentFeedback = %v", fb) }
}
func TestUnsummarizedPosts(t *testing.T) {
s := newTestStore(t)
s.InsertPost(domain.Post{ID: "t3_a", Subreddit: "test", Title: "No summary", CreatedUTC: time.Now()})
rel := 0.8; sum := "has summary"
s.InsertPost(domain.Post{ID: "t3_b", Subreddit: "test", Title: "With summary", CreatedUTC: time.Now(), Relevance: &rel, Summary: &sum})
posts, _ := s.UnsummarizedPosts()
if len(posts) != 1 || posts[0].ID != "t3_a" { t.Errorf("UnsummarizedPosts = %v", posts) }
}
func boolPtr(b bool) *bool { return &b }