rssmon3/rss/feed_test.go

214 lines
3.9 KiB
Go
Executable File

package rss
import (
"bytes"
"encoding/json"
"fmt"
"io"
"local/rssmon3/config"
"log"
"net/http"
"net/http/httptest"
"os"
"path"
"reflect"
"testing"
"time"
)
func initRSSFeed() {
os.Args = []string{"a", "-db", "map"}
if err := config.New(); err != nil {
panic(err)
}
}
type mockStruct struct{}
func mockRSS() *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var v mockStruct
base := reflect.TypeOf(v).PkgPath()
f, err := os.Open(path.Join(os.Getenv("GOPATH"), "src", base, "./testdata/rss.xml"))
if err != nil {
panic(err)
}
io.Copy(w, f)
}))
}
func TestRSSFeedEncodeDecode(t *testing.T) {
initRSSFeed()
f := newFeed("key")
f.Updated = time.Now()
f.TitleFilter = "a"
f.ContentFilter = "b"
f.Tags = []string{"c"}
b, err := f.Encode()
if err != nil {
t.Fatal(err)
}
g := newFeed("key")
if err := g.Decode(b); err != nil {
t.Fatal(err)
}
fb, _ := json.Marshal(f)
gb, _ := json.Marshal(f)
if string(fb) != string(gb) {
t.Errorf("%v => %v", *f, *g)
}
}
func TestRSSFeedSaveLoad(t *testing.T) {
initRSSFeed()
f := newFeed("key")
f.Updated = time.Now()
f.TitleFilter = "a"
f.ContentFilter = "b"
f.Tags = []string{"c"}
if err := f.save(); err != nil {
t.Fatal(err)
}
g := newFeed("key")
if err := g.Load(); err != nil {
t.Fatal(err)
}
fb, _ := json.Marshal(f)
gb, _ := json.Marshal(g)
if string(fb) != string(gb) {
t.Fatalf("%v != %v", f, g)
}
h := newFeed("key2")
if err := h.Load(); err == nil {
t.Fatal("can load nil feed")
}
}
func TestRSSFeedPull(t *testing.T) {
initRSSFeed()
s := mockRSS()
defer s.Close()
f := newFeed("key")
f.TitleFilter = "500"
f.ContentFilter = "b"
f.Tags = []string{"c"}
f.URL = s.URL
log.SetOutput(bytes.NewBuffer(nil))
defer log.SetOutput(os.Stderr)
if err := f.Pull(); err != nil {
t.Fatal(err)
}
log.SetOutput(os.Stderr)
if f.Updated.Format("2006-01-02 15:04:05") != "2019-06-18 19:00:00" {
t.Errorf("updated is wrong: %v", f)
}
keys, err := config.Values().DB.List([]string{nsItems, f.Key})
if err != nil {
t.Fatal(err)
}
if len(keys) < 1 {
t.Fatal(len(keys))
}
if keys[0] != "2018-07-10-19-00:https://roosterteeth.com/episode/rooster-teeth-podcast-2018-rooster-teeth-podcast-500" {
t.Fatal(keys[0])
}
log.SetOutput(bytes.NewBuffer(nil))
defer log.SetOutput(os.Stderr)
if err := f.Pull(); err != nil {
t.Fatal(err)
}
log.SetOutput(os.Stderr)
keysB, err := config.Values().DB.List([]string{nsItems, f.Key})
if err != nil {
t.Fatal(err)
}
if fmt.Sprintf("%v", keys) != fmt.Sprintf("%v", keysB) {
t.Fatalf("%v vs %v", keys, keysB)
}
itemKeys, err := f.List(5)
if err != nil {
t.Fatal(err)
}
if len(itemKeys) < 1 {
t.Fatal(len(itemKeys))
}
if len(itemKeys) > 5 {
t.Fatal(len(itemKeys))
}
if itemKeys[0] != "2018-07-10-19-00:https://roosterteeth.com/episode/rooster-teeth-podcast-2018-rooster-teeth-podcast-500" {
t.Fatal(itemKeys[0])
}
items, err := f.Items(1)
if err != nil {
t.Fatal(err)
}
if len(items) < 1 {
t.Fatal(len(items))
}
if items[0].ID() != itemKeys[0] {
t.Fatalf("%v vs %v", items[0].ID(), itemKeys[0])
}
i := &Item{}
if err := i.Load(itemKeys[0], f.Key); err != nil {
t.Fatal(err)
}
if *i == (Item{}) {
t.Fatal(i)
}
if i.Link == "" || i.Title == "" || i.Content == "" {
t.Fatal(i)
}
}
func TestRSSFeedListLimitedDescending(t *testing.T) {
initRSSFeed()
s := mockRSS()
defer s.Close()
f := newFeed("key")
f.TitleFilter = "50."
f.ContentFilter = "b"
f.Tags = []string{"c"}
f.URL = s.URL
log.SetOutput(bytes.NewBuffer(nil))
defer log.SetOutput(os.Stderr)
if err := f.Pull(); err != nil {
t.Fatal(err)
}
log.SetOutput(os.Stderr)
itemKeys, err := f.List(5)
if err != nil {
t.Fatal(err)
}
if len(itemKeys) != 5 {
t.Fatal(len(itemKeys))
}
for i := range itemKeys {
if i > 0 && itemKeys[i] > itemKeys[i-1] {
t.Error(itemKeys[i], ">", itemKeys[i-1])
}
}
}