Rssmon2/rss/feed_test.go

97 lines
2.1 KiB
Go
Executable File

package rss
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
"path"
"testing"
"time"
)
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, nil, time.Minute)
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)
}))
}