spark-server/internal/module/squarebot/logic/rss_test.go
2026-09-29 10:22:28 +08:00

60 lines
1.7 KiB
Go

package logic
import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestParseAtomFeedAndHelpers(t *testing.T) {
atom := []byte(`<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Atom News</title>
<entry>
<title>Entry One</title>
<id>https://example.com/e/1</id>
<link rel="alternate" href="https://example.com/e/1"/>
<link rel="enclosure" href="https://example.com/atom.jpg" type="image/jpeg"/>
<summary>&lt;p&gt;Body &lt;img src="https://example.com/fallback.png"/&gt;&lt;/p&gt;</summary>
</entry>
</feed>`)
items, err := parseFeed(atom, "https://example.com/atom")
if err != nil || len(items) != 1 {
t.Fatalf("%+v %v", items, err)
}
if items[0].ImageURL != "https://example.com/atom.jpg" {
t.Fatalf("image=%q", items[0].ImageURL)
}
long := strings.Repeat("字", 300)
if got := truncateRunes(long, 10); len([]rune(got)) != 10 {
t.Fatalf("truncate %q", got)
}
}
func TestRSSMediaContentAndFetchFeed(t *testing.T) {
rss := []byte(`<?xml version="1.0"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel><title>MRSS</title>
<item>
<title>Media item</title>
<link>https://example.com/m</link>
<description>no img tag</description>
<media:content url="https://example.com/m.jpg" medium="image"/>
</item>
</channel></rss>`)
items, err := parseFeed(rss, "https://example.com/mrss")
if err != nil || len(items) != 1 || items[0].ImageURL != "https://example.com/m.jpg" {
t.Fatalf("%+v %v", items, err)
}
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write(rss)
}))
defer srv.Close()
got, err := FetchFeed(context.Background(), srv.Client(), srv.URL)
if err != nil || len(got) != 1 {
t.Fatalf("%+v %v", got, err)
}
}