internal/feed/writer/rss20/rss20_test.go

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)
			}
		})
	}
}