106 lines
2.4 KiB
Go
106 lines
2.4 KiB
Go
// ©AngelaMos | 2026
|
|
// parse_test.go
|
|
|
|
package parse
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
const feedsDir = "../../testdata/feeds"
|
|
|
|
func loadFeed(t *testing.T, name string) []Item {
|
|
t.Helper()
|
|
f, err := os.Open(filepath.Join(feedsDir, name))
|
|
if err != nil {
|
|
t.Fatalf("open fixture %s: %v", name, err)
|
|
}
|
|
t.Cleanup(func() { _ = f.Close() })
|
|
items, err := Feed(f)
|
|
if err != nil {
|
|
t.Fatalf("Feed(%s): %v", name, err)
|
|
}
|
|
return items
|
|
}
|
|
|
|
func TestFeedGolden(t *testing.T) {
|
|
cases := []struct {
|
|
file string
|
|
wantItems int
|
|
fullBody bool
|
|
}{
|
|
{"krebs.xml", 3, true},
|
|
{"theregister.xml", 3, true},
|
|
{"thehackernews.xml", 3, false},
|
|
{"bleepingcomputer.xml", 3, false},
|
|
{"securityweek.xml", 3, false},
|
|
{"darkreading.xml", 3, false},
|
|
{"cisa.xml", 3, false},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.file, func(t *testing.T) {
|
|
items := loadFeed(t, tc.file)
|
|
if len(items) != tc.wantItems {
|
|
t.Fatalf("items = %d, want %d", len(items), tc.wantItems)
|
|
}
|
|
for i, it := range items {
|
|
if it.Title == "" {
|
|
t.Errorf("item %d: empty title", i)
|
|
}
|
|
if it.Link == "" {
|
|
t.Errorf("item %d: empty link", i)
|
|
}
|
|
if it.Published.IsZero() {
|
|
t.Errorf("item %d (%q): published time did not parse", i, it.Title)
|
|
}
|
|
if tc.fullBody && it.Body == "" {
|
|
t.Errorf("item %d (%q): expected full body, got empty", i, it.Title)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFeedExactPublishedTime(t *testing.T) {
|
|
cases := []struct {
|
|
file string
|
|
raw string
|
|
}{
|
|
{"thehackernews.xml", "Sat, 04 Jul 2026 18:17:53 +0530"},
|
|
{"krebs.xml", "Thu, 02 Jul 2026 19:27:33 +0000"},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.file, func(t *testing.T) {
|
|
want, err := time.Parse(time.RFC1123Z, tc.raw)
|
|
if err != nil {
|
|
t.Fatalf("parse expected time: %v", err)
|
|
}
|
|
items := loadFeed(t, tc.file)
|
|
if !items[0].Published.Equal(want) {
|
|
t.Errorf("published = %s, want %s", items[0].Published, want.UTC())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFeedExactTitles(t *testing.T) {
|
|
cases := []struct {
|
|
file string
|
|
title string
|
|
}{
|
|
{"krebs.xml", "FBI Seizes NetNut Proxy Platform, Popa Botnet"},
|
|
{"thehackernews.xml", "U.S. Government Entity Paid Kairos $1 Million in Data-Theft Extortion Case"},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.file, func(t *testing.T) {
|
|
items := loadFeed(t, tc.file)
|
|
if items[0].Title != tc.title {
|
|
t.Errorf("first title = %q, want %q", items[0].Title, tc.title)
|
|
}
|
|
})
|
|
}
|
|
}
|