feat: scaffold initial RSS reader project with Go backend and React frontend
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/haopengzhan/rsspipe/internal/models"
|
||||
)
|
||||
|
||||
func TestDatabaseOperations(t *testing.T) {
|
||||
tempDir, err := os.MkdirTemp("", "rsspipe-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create temp dir: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
dbPath := filepath.Join(tempDir, "test.db")
|
||||
database, err := InitDB(dbPath)
|
||||
if err != nil {
|
||||
t.Fatalf("InitDB failed: %v", err)
|
||||
}
|
||||
defer database.Close()
|
||||
|
||||
// 1. Test User
|
||||
u, err := database.CreateUser("admin", "$2a$10$dummyhashvalue")
|
||||
if err != nil {
|
||||
t.Fatalf("CreateUser failed: %v", err)
|
||||
}
|
||||
if u.Username != "admin" {
|
||||
t.Errorf("expected username admin, got %s", u.Username)
|
||||
}
|
||||
|
||||
// 2. Test Category
|
||||
cat, err := database.CreateCategory("Tech News", nil)
|
||||
if err != nil {
|
||||
t.Fatalf("CreateCategory failed: %v", err)
|
||||
}
|
||||
|
||||
// 3. Test Feed
|
||||
feed, err := database.CreateFeed("Hacker News", "https://news.ycombinator.com/rss", "https://news.ycombinator.com", &cat.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("CreateFeed failed: %v", err)
|
||||
}
|
||||
|
||||
// 4. Test Upsert Feed Entries
|
||||
entries := []models.FeedEntry{
|
||||
{
|
||||
GUID: "item-1",
|
||||
URL: "https://example.com/1",
|
||||
Title: "Post One",
|
||||
Author: "Alice",
|
||||
Content: "<p>Content 1</p>",
|
||||
PublishedAt: time.Now().Add(-1 * time.Hour),
|
||||
},
|
||||
{
|
||||
GUID: "item-2",
|
||||
URL: "https://example.com/2",
|
||||
Title: "Post Two",
|
||||
Author: "Bob",
|
||||
Content: "<p>Content 2</p>",
|
||||
PublishedAt: time.Now(),
|
||||
},
|
||||
}
|
||||
|
||||
inserted, err := database.UpsertFeedEntries(feed.ID, entries)
|
||||
if err != nil {
|
||||
t.Fatalf("UpsertFeedEntries failed: %v", err)
|
||||
}
|
||||
if inserted != 2 {
|
||||
t.Fatalf("expected 2 inserted entries, got %d", inserted)
|
||||
}
|
||||
|
||||
// 5. List entries
|
||||
list, total, err := database.ListEntries(EntryFilter{View: "inbox"})
|
||||
if err != nil {
|
||||
t.Fatalf("ListEntries failed: %v", err)
|
||||
}
|
||||
if total != 2 || len(list) != 2 {
|
||||
t.Errorf("expected 2 entries, got total %d, len %d", total, len(list))
|
||||
}
|
||||
|
||||
// 6. Update Read & Star
|
||||
firstID := list[0].ID
|
||||
if err := database.UpdateEntryRead(firstID, true); err != nil {
|
||||
t.Fatalf("UpdateEntryRead failed: %v", err)
|
||||
}
|
||||
if err := database.UpdateEntryStarred(firstID, true); err != nil {
|
||||
t.Fatalf("UpdateEntryStarred failed: %v", err)
|
||||
}
|
||||
|
||||
// 7. Verify Stats
|
||||
stats, err := database.GetStats()
|
||||
if err != nil {
|
||||
t.Fatalf("GetStats failed: %v", err)
|
||||
}
|
||||
if stats.TotalFeeds != 1 || stats.TotalUnread != 1 || stats.TotalStarred != 1 || stats.TotalCategories != 1 {
|
||||
t.Errorf("unexpected stats: %+v", stats)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user