diff --git a/src/storage/tests/feed_test.go b/src/storage/tests/feed_test.go index 1fe41c0..0193ea9 100644 --- a/src/storage/tests/feed_test.go +++ b/src/storage/tests/feed_test.go @@ -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) { 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"}) diff --git a/src/storage/tests/folder_test.go b/src/storage/tests/folder_test.go index b475ef4..1aa0af2 100644 --- a/src/storage/tests/folder_test.go +++ b/src/storage/tests/folder_test.go @@ -7,6 +7,56 @@ import ( "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) { dbtest(t, func(t *testing.T, db storage.Storage) { folder := db.CreateFolder("old title") diff --git a/src/storage/tests/item_test.go b/src/storage/tests/item_test.go index 0dad182..09a0d9b 100644 --- a/src/storage/tests/item_test.go +++ b/src/storage/tests/item_test.go @@ -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) { dbtest(t, func(t *testing.T, db storage.Storage) { feed := db.CreateFeed(model.CreateFeedParams{Title: "f", FeedLink: "http://f.xml"})