more storage tests

This commit is contained in:
nkanaev
2026-06-20 14:58:21 +01:00
parent 72a2bf605b
commit e7004bbd29
3 changed files with 158 additions and 0 deletions

View File

@@ -80,6 +80,61 @@ func TestUpdateFeed(t *testing.T) {
}) })
} }
func TestFeedStats(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
// empty
stats := db.FeedStats()
if len(stats) != 0 {
t.Errorf("expected 0 stats, got %d", len(stats))
}
scope := testItemsSetup(db)
stats = db.FeedStats()
statByFeed := make(map[int64]model.FeedStat)
for _, s := range stats {
statByFeed[s.FeedId] = s
}
for _, tc := range []struct {
feedID int64
unread int64
starred int64
}{
{scope.feed11.Id, 1, 1},
{scope.feed12.Id, 1, 0},
{scope.feed21.Id, 0, 1},
{scope.feed01.Id, 1, 1},
} {
s, ok := statByFeed[tc.feedID]
if !ok {
t.Errorf("feed %d missing from stats", tc.feedID)
continue
}
if s.UnreadCount != tc.unread {
t.Errorf("feed %d unread: expected %d, got %d", tc.feedID, tc.unread, s.UnreadCount)
}
if s.StarredCount != tc.starred {
t.Errorf("feed %d starred: expected %d, got %d", tc.feedID, tc.starred, s.StarredCount)
}
}
// mark feed11 read, verify stats update
db.MarkItemsRead(model.MarkFilter{FeedID: &scope.feed11.Id})
stats = db.FeedStats()
statByFeed = make(map[int64]model.FeedStat)
for _, s := range stats {
statByFeed[s.FeedId] = s
}
if s := statByFeed[scope.feed11.Id]; s.UnreadCount != 0 {
t.Errorf("feed11 unread after mark-read: expected 0, got %d", s.UnreadCount)
}
if s := statByFeed[scope.feed11.Id]; s.StarredCount != 1 {
t.Errorf("feed11 starred after mark-read: expected 1, got %d", s.StarredCount)
}
})
}
func TestDeleteFeed(t *testing.T) { func TestDeleteFeed(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) { dbtest(t, func(t *testing.T, db storage.Storage) {
feed1 := db.CreateFeed(model.CreateFeedParams{Title: "title", Link: "http://example.com", FeedLink: "http://example.com/feed.xml"}) feed1 := db.CreateFeed(model.CreateFeedParams{Title: "title", Link: "http://example.com", FeedLink: "http://example.com/feed.xml"})

View File

@@ -7,6 +7,56 @@ import (
"github.com/nkanaev/yarr/src/storage/model" "github.com/nkanaev/yarr/src/storage/model"
) )
func TestCreateFolder(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
folder := db.CreateFolder("test-folder")
if folder == nil || folder.Id == 0 {
t.Fatal("expected folder with id")
}
if folder.Title != "test-folder" {
t.Errorf("expected title 'test-folder', got %s", folder.Title)
}
if !folder.IsExpanded {
t.Error("expected folder to be expanded by default")
}
// upsert: same title returns existing folder
folder2 := db.CreateFolder("test-folder")
if folder2 == nil || folder2.Id != folder.Id {
t.Errorf("expected same folder id on upsert, got %d != %d", folder2.Id, folder.Id)
}
folders := db.ListFolders()
if len(folders) != 1 || folders[0].Id != folder.Id {
t.Errorf("expected folder in ListFolders")
}
})
}
func TestDeleteFolder(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
// delete non-existent returns true (err == nil)
if !db.DeleteFolder(99999) {
t.Error("expected true when deleting non-existent folder")
}
folder := db.CreateFolder("test")
if !db.DeleteFolder(folder.Id) {
t.Fatal("delete failed")
}
folders := db.ListFolders()
if len(folders) != 0 {
t.Errorf("expected 0 folders, got %d", len(folders))
}
// deleting again returns true
if !db.DeleteFolder(folder.Id) {
t.Error("expected true when deleting already-deleted folder")
}
})
}
func TestUpdateFolder(t *testing.T) { func TestUpdateFolder(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) { dbtest(t, func(t *testing.T, db storage.Storage) {
folder := db.CreateFolder("old title") folder := db.CreateFolder("old title")

View File

@@ -428,6 +428,59 @@ func TestDeleteOldItems(t *testing.T) {
// }) // })
} }
func TestDeleteItem(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
feed := db.CreateFeed(model.CreateFeedParams{FeedLink: "http://test.com/feed.xml"})
db.CreateItems([]model.Item{{GUID: "i1", FeedId: feed.Id, Title: "item"}})
items := db.ListItems(model.ItemFilter{}, 10, false, false)
if len(items) != 1 {
t.Fatal("expected 1 item")
}
// delete non-existent returns true (err == nil)
if !db.DeleteItem(99999) {
t.Error("expected true when deleting non-existent item")
}
// delete existing
if !db.DeleteItem(items[0].Id) {
t.Fatal("delete failed")
}
items = db.ListItems(model.ItemFilter{}, 10, false, false)
if len(items) != 0 {
t.Errorf("expected 0 items, got %d", len(items))
}
})
}
func TestCountItems(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) {
if count := db.CountItems(); count != 0 {
t.Errorf("expected 0, got %d", count)
}
feed := db.CreateFeed(model.CreateFeedParams{FeedLink: "http://test.com/feed.xml"})
db.CreateItems([]model.Item{
{GUID: "i1", FeedId: feed.Id},
{GUID: "i2", FeedId: feed.Id},
{GUID: "i3", FeedId: feed.Id},
})
if count := db.CountItems(); count != 3 {
t.Errorf("expected 3, got %d", count)
}
items := db.ListItems(model.ItemFilter{}, 10, false, false)
db.DeleteItem(items[0].Id)
if count := db.CountItems(); count != 2 {
t.Errorf("expected 2, got %d", count)
}
})
}
func TestSearch(t *testing.T) { func TestSearch(t *testing.T) {
dbtest(t, func(t *testing.T, db storage.Storage) { 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"})