package rss20
import (
"bytes"
"encoding/xml"
"strings"
"testing"
"time"
"mercemay.top/src/tilstream/internal/feed"
)
func TestWriterBasicFeed(t *testing.T) {
t.Parallel()
ch := Channel{
Title: "TIL",
Link: "https://example.com/",
Description: "My daily notes",
Language: "en-us",
Generator: "tilstream",
LastBuild: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),
}
items := []feed.Item{
{
Title: "Hello",
Link: "https://example.com/hello",
GUID: "https://example.com/hello",
Summary: "greeting",
Published: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC),
Categories: []string{"intro", "meta"},
},
}
var buf bytes.Buffer
if err := NewWriter().Write(&buf, ch, items); err != nil {
t.Fatalf("Write: %v", err)
}
out := buf.String()
checks := []string{
`<?xml version="1.0"`,
`<rss version="2.0"`,
`<title>TIL</title>`,
`<link>https://example.com/</link>`,
`<generator>tilstream</generator>`,
`<category>intro</category>`,
`<category>meta</category>`,
}
for _, w := range checks {
if !strings.Contains(out, w) {
t.Errorf("want %q in output:\n%s", w, out)
}
}
}
func TestWriterEmitsValidXML(t *testing.T) {
t.Parallel()
var buf bytes.Buffer
ch := Channel{Title: "T", Link: "L", Description: "D"}
if err := NewWriter().Write(&buf, ch, nil); err != nil {
t.Fatalf("Write: %v", err)
}
var doc document
dec := xml.NewDecoder(&buf)
if err := dec.Decode(&doc); err != nil {
t.Fatalf("decode: %v", err)
}
if doc.Version != "2.0" {
t.Errorf("version = %s", doc.Version)
}
}
func TestFormatRFC1123Z(t *testing.T) {
t.Parallel()
t.Helper()
cases := []struct {
name string
in time.Time
want string
}{
{"zero", time.Time{}, ""},
{"known", time.Date(2025, 1, 2, 3, 4, 5, 0, time.UTC), "Thu, 02 Jan 2025 03:04:05 +0000"},
}
for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
if got := formatRFC1123Z(tc.in); got != tc.want {
t.Errorf("got %q, want %q", got, tc.want)
}
})
}
}