internal/feed/writer/jsonfeed/jsonfeed_test.go

package jsonfeed

import (
	"bytes"
	"testing"
	"time"

	"mercemay.top/src/tilstream/internal/feed"
)

func TestWriteAndDecode(t *testing.T) {
	t.Parallel()
	f := Feed{
		Title:       "TIL",
		HomePageURL: "https://example.com/",
		FeedURL:     "https://example.com/feed.json",
	}
	items := []feed.Item{
		{
			Title:      "Hello",
			Link:       "https://example.com/hello",
			GUID:       "https://example.com/hello",
			Summary:    "intro",
			Content:    "<p>hi</p>",
			Published:  time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
			Author:     "me",
			Categories: []string{"intro"},
		},
	}
	var buf bytes.Buffer
	if err := NewWriter().Write(&buf, f, items); err != nil {
		t.Fatalf("Write: %v", err)
	}
	got, err := Decode(&buf)
	if err != nil {
		t.Fatalf("Decode: %v", err)
	}
	if got.Version != "https://jsonfeed.org/version/1.1" {
		t.Errorf("version = %s", got.Version)
	}
	if len(got.Items) != 1 {
		t.Fatalf("items = %d", len(got.Items))
	}
	item := got.Items[0]
	if item.Title != "Hello" {
		t.Errorf("title = %s", item.Title)
	}
	if len(item.Authors) != 1 || item.Authors[0].Name != "me" {
		t.Errorf("author mapping wrong: %+v", item.Authors)
	}
}

func TestFromFeedItem(t *testing.T) {
	t.Parallel()
	cases := []struct {
		name string
		in   feed.Item
		want string
	}{
		{"zero_time_no_date", feed.Item{GUID: "id"}, ""},
		{"with_time", feed.Item{GUID: "id", Published: time.Date(2024, 5, 1, 0, 0, 0, 0, time.UTC)}, "2024-05-01T00:00:00Z"},
	}
	for _, tc := range cases {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()
			got := FromFeedItem(tc.in)
			if got.DatePublished != tc.want {
				t.Errorf("DatePublished = %q, want %q", got.DatePublished, tc.want)
			}
		})
	}
}