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: "", 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) })) }