60 lines
1.7 KiB
Go
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><p>Body <img src="https://example.com/fallback.png"/></p></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)
|
|
}
|
|
}
|