storage test fixes

This commit is contained in:
nkanaev
2026-06-18 14:04:39 +01:00
parent 3ab2292eeb
commit 15b6f9c566
2 changed files with 81 additions and 65 deletions

View File

@@ -1,7 +1,6 @@
package tests package tests
import ( import (
"database/sql"
"fmt" "fmt"
"maps" "maps"
"reflect" "reflect"
@@ -338,52 +337,60 @@ func TestMarkItemsRead(t *testing.T) {
} }
func TestDeleteOldItems(t *testing.T) { func TestDeleteOldItems(t *testing.T) {
now := time.Now().UTC()
starred := model.STARRED
dbtest(t, func(t *testing.T, db storage.Storage) {
t.Run("keeps at least 50 items", func(t *testing.T) { t.Run("keeps at least 50 items", func(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"})
now := time.Now()
items := make([]model.Item, 100) items := make([]model.Item, 100)
for i := range 100 { for i := range 100 {
items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Hour * 24)} items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Hour * 24)}
} }
db.CreateItems(items) db.CreateItems(items)
// // Set 1 recent (latest), 100 old (100 days ago) // // Set 1 recent (latest), 99 old (100 days ago)
db.db.Exec(`update items set last_arrived = :la where guid = "99"`, sql.Named("la", now)) time.Sleep(100 * 24 * time.Hour)
db.db.Exec(`update items set last_arrived = :la where guid != "99"`, sql.Named("la", now.Add(-time.Hour*24*100))) db.CreateItems([]model.Item{items[99]})
db.DeleteOldItems() db.DeleteOldItems()
var have int remaining := db.ListItems(model.ItemFilter{FeedID: &feed.Id}, 1000, false, false)
db.db.QueryRow("select count(*) from items where feed_id = ?", feed.Id).Scan(&have) if len(remaining) != 50 {
if have != 50 { t.Errorf("expected 50 items, have %d", len(remaining))
t.Errorf("expected 50 items, have %d", have)
} }
}) })
})
})
t.Run("keeps all less than 90 days old", func(t *testing.T) { t.Run("keeps all less than 90 days old", func(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"})
now := time.Now()
items := make([]model.Item, 100) items := make([]model.Item, 100)
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Second)} items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now}
} }
db.CreateItems(items) db.CreateItems(items)
// Latest item at "now" // Latest item at "now"
// All others at 80 days ago (keep) // All others at 80 days ago (keep)
db.db.Exec(`update items set last_arrived = :la where guid = "99"`, sql.Named("la", now)) time.Sleep(80 * 24 * time.Hour)
db.db.Exec(`update items set last_arrived = :la where guid != "99"`, sql.Named("la", now.Add(-time.Hour*24*80))) db.CreateItems([]model.Item{items[99]})
db.DeleteOldItems() db.DeleteOldItems()
var have int remaining := db.ListItems(model.ItemFilter{FeedID: &feed.Id}, 1000, false, false)
db.db.QueryRow("select count(*) from items where feed_id = ?", feed.Id).Scan(&have) if len(remaining) != 100 {
if have != 100 { t.Errorf("expected 100 items, have %d", len(remaining))
t.Errorf("expected 100 items, have %d", have)
} }
}) })
})
})
t.Run("keeps starred", func(t *testing.T) { t.Run("keeps starred", func(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"})
now := time.Now()
items := make([]model.Item, 100) items := make([]model.Item, 100)
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Second)} items[i] = model.Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Second)}
@@ -391,20 +398,29 @@ func TestDeleteOldItems(t *testing.T) {
db.CreateItems(items) db.CreateItems(items)
// Set all to 100 days ago, except one recent // Set all to 100 days ago, except one recent
db.db.Exec(`update items set last_arrived = :la`, sql.Named("la", now.Add(-time.Hour*24*100))) time.Sleep(100 * 24 * time.Hour)
db.db.Exec(`update items set last_arrived = :la where guid = "99"`, sql.Named("la", now)) db.CreateItems([]model.Item{items[99]})
// Star 10 old items that would otherwise be deleted (rn > 50 and old) // Star 10 old items that would otherwise be deleted (rn > 50 and old)
db.db.Exec(`update items set status = :s where cast(guid as integer) < 10`, sql.Named("s", starred)) allItems := db.ListItems(model.ItemFilter{FeedID: &feed.Id}, 100, false, false)
for _, item := range allItems {
guid, _ := strconv.Atoi(item.GUID)
if guid < 10 {
db.UpdateItemStatus(item.Id, model.STARRED)
}
}
db.DeleteOldItems() db.DeleteOldItems()
var have int
db.db.QueryRow("select count(*) from items where feed_id = ?", feed.Id).Scan(&have)
// 50 (limit) + 10 (starred) = 60 items should remain. // 50 (limit) + 10 (starred) = 60 items should remain.
if have != 60 { remaining := db.ListItems(model.ItemFilter{FeedID: &feed.Id}, 1000, false, false)
t.Errorf("expected 60 items, have %d", have) if len(remaining) != 60 {
t.Errorf("expected 60 items, have %d", len(remaining))
} }
}) })
}) })
})
// })
} }
func TestSearch(t *testing.T) { func TestSearch(t *testing.T) {

View File

@@ -9,7 +9,7 @@ import (
func dbtest(t *testing.T, testcase func(t *testing.T, db storage.Storage)) { func dbtest(t *testing.T, testcase func(t *testing.T, db storage.Storage)) {
testurls := map[string]string{ testurls := map[string]string{
"sqlite": ":memory:", "sqlite": ":memory:",
"postgres": "postgres://postgres:postgres@localhost:5432/yarr_test?sslmode=disable", // "postgres": "postgres://postgres:postgres@localhost:5432/yarr_test?sslmode=disable",
} }
for testname, url := range testurls { for testname, url := range testurls {
db, err := storage.New(url) db, err := storage.New(url)