package opml import ( "testing" "git.pengzhan.dev/haopengzhan/rsspipe/internal/models" ) func TestParseAndGenerateOPML(t *testing.T) { sampleOPML := ` Miniflux Subscriptions ` feeds, err := ParseOPML([]byte(sampleOPML)) if err != nil { t.Fatalf("ParseOPML failed: %v", err) } if len(feeds) != 3 { t.Fatalf("expected 3 feeds, got %d", len(feeds)) } // Verify first feed with category if feeds[0].Title != "Hacker News" || feeds[0].FeedURL != "https://news.ycombinator.com/rss" || feeds[0].CategoryTitle != "Technology" { t.Errorf("unexpected feed 0: %+v", feeds[0]) } // Verify uncategorized feed if feeds[2].Title != "Ars Technica" || feeds[2].FeedURL != "https://feeds.arstechnica.com/arstechnica/index" || feeds[2].CategoryTitle != "" { t.Errorf("unexpected feed 2: %+v", feeds[2]) } // Test Export Generation catID := "cat-1" categories := []models.Category{ {ID: catID, Title: "Technology"}, } modelFeeds := []models.Feed{ {ID: "f-1", Title: "Hacker News", FeedURL: "https://news.ycombinator.com/rss", SiteURL: "https://news.ycombinator.com/", CategoryID: &catID}, {ID: "f-2", Title: "Ars Technica", FeedURL: "https://feeds.arstechnica.com/arstechnica/index", SiteURL: "https://arstechnica.com"}, } exportedXML, err := GenerateOPML(modelFeeds, categories) if err != nil { t.Fatalf("GenerateOPML failed: %v", err) } reParsed, err := ParseOPML(exportedXML) if err != nil { t.Fatalf("Failed to re-parse exported OPML: %v", err) } if len(reParsed) != 2 { t.Fatalf("expected 2 re-parsed feeds, got %d", len(reParsed)) } }