96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package rss
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
)
|
|
|
|
func Test_RSSFeed(t *testing.T) {
|
|
s := RSSServer()
|
|
defer s.Close()
|
|
cases := []struct {
|
|
itemFilter string
|
|
contentFilter string
|
|
itemsOut int
|
|
}{
|
|
{
|
|
itemFilter: "Blue",
|
|
contentFilter: "<img.*?/(img)?>",
|
|
itemsOut: 1,
|
|
},
|
|
{
|
|
itemFilter: "Blue",
|
|
itemsOut: 1,
|
|
},
|
|
{
|
|
itemsOut: 4,
|
|
},
|
|
}
|
|
for _, c := range cases {
|
|
feed, err := New(s.URL, c.itemFilter, c.contentFilter)
|
|
if err != nil {
|
|
t.Errorf("couldn't create new feed %v: %v", feed, err)
|
|
}
|
|
items, err := feed.Update()
|
|
if err != nil {
|
|
t.Errorf("cannot update feed %q: %v", s.URL, err)
|
|
}
|
|
if len(items) != c.itemsOut {
|
|
t.Errorf("couldn't get all items from feed: got %v, wanted %v", len(items), c.itemsOut)
|
|
}
|
|
for i := range items {
|
|
if len(items[i].Content) == 0 {
|
|
t.Errorf("Empty content for %v with filter %q %q", items[i].Name, c.itemFilter, c.contentFilter)
|
|
}
|
|
}
|
|
serialized, err := feed.Serialize()
|
|
if err != nil {
|
|
t.Fatalf("Cannot serialize feed: %v", err)
|
|
}
|
|
deserialized, err := Deserialize(serialized)
|
|
if err != nil {
|
|
t.Fatalf("Cannot deserialize feed: %v", err)
|
|
}
|
|
if feed.String() != deserialized.String() {
|
|
t.Fatalf("deserialized != feed: %s, expected %s", deserialized.String(), feed.String())
|
|
}
|
|
}
|
|
}
|
|
|
|
func RSSServer() *httptest.Server {
|
|
var content []byte
|
|
feedPath := "./testdata/feed.xml"
|
|
if _, err := os.Stat(feedPath); os.IsNotExist(err) {
|
|
resp, err := http.Get("https://xkcd.com/rss.xml")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := os.MkdirAll(path.Dir(feedPath), os.ModePerm); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := ioutil.WriteFile(feedPath, b, os.ModePerm); err != nil {
|
|
panic(err)
|
|
}
|
|
content = b
|
|
} else {
|
|
b, err := ioutil.ReadFile(feedPath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
content = b
|
|
}
|
|
|
|
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write(content)
|
|
}))
|
|
}
|