// Golden test for the RSS renderer: fixed runs in, exact XML out. Also // pins batch ordering (newest first) and XML escaping of item text. package cmds import ( "testing" "time" "fluxrec/core" ) func TestRenderRSSGolden(t *testing.T) { at := func(day, h, m int) time.Time { return time.Date(2024, 3, day, h, m, 0, 0, time.UTC) } med := 0.55 // over all scored entries in the first batch, not just kept runs := []core.RunRow{ { RanAt: at(1, 6, 0), EntriesSeen: 40, ScoreMedian: &med, Kept: []core.KeptItem{ {EntryID: 101, URL: "https://example.com/a?x=1&y=2", Title: "Alpha & Omega", FeedTitle: "Feed A", PublishedAt: at(1, 5, 0), Content: "x < y", Score: 0.9, Kind: core.KindRanked}, {EntryID: 102, URL: "https://example.com/b", Title: "Beta", FeedTitle: "A Feed With An Extremely Long And Descriptive Title Here", PublishedAt: at(1, 5, 30), Content: "second body", Score: 0.2, Kind: core.KindRandom}, }, }, { RanAt: at(1, 12, 0), EntriesSeen: 12, // nil median: pre-field run row Kept: []core.KeptItem{ {EntryID: 103, URL: "https://example.com/c", Title: "Gamma", FeedTitle: "Feed A", PublishedAt: at(1, 11, 0), Content: "", Score: 0.8, Kind: core.KindRunnerUp}, }, }, } got, err := RenderRSS(runs) if err != nil { t.Fatalf("RenderRSS: %v", err) } want := ` fluxrec recommendations Top-scored Miniflux entries, refreshed on a schedule. Gamma — Feed A https://example.com/c mf:103 Fri, 01 Mar 2024 11:00:00 +0000 <p><em>Feed A · score 0.80</em></p> Alpha & Omega — Feed A https://example.com/a?x=1&y=2 mf:101 Fri, 01 Mar 2024 05:00:00 +0000 <p><em>Feed A · score 0.90 · batch median 0.55</em></p> x < y Beta — A Feed With An Extremely Long And Descri… https://example.com/b mf:102 Fri, 01 Mar 2024 05:30:00 +0000 <p><em>A Feed With An Extremely Long And Descriptive Title Here · score 0.20 · batch median 0.55</em></p> second body ` if string(got) != want { t.Errorf("RSS mismatch.\ngot:\n%s", got) } }