beebo
1package rss
2
3import (
4 "encoding/json"
5 "errors"
6 "io/ioutil"
7 "net/http"
8 "os"
9 "path/filepath"
10 "reflect"
11 "testing"
12)
13
14func TestParseTitle(t *testing.T) {
15 tests := map[string]string{
16 "rss_0.92": "Dave Winer: Grateful Dead",
17 "rss_1.0": "Golem.de",
18 "rss_2.0": "RSS Title",
19 "rss_2.0-1": "Liftoff News",
20 "atom_1.0": "Titel des Weblogs",
21 "atom_1.0-1": "Golem.de",
22 }
23
24 for test, want := range tests {
25 name := filepath.Join("testdata", test)
26 data, err := ioutil.ReadFile(name)
27 if err != nil {
28 t.Fatalf("Reading %s: %v", name, err)
29 }
30
31 feed, err := Parse(data)
32 if err != nil {
33 t.Fatalf("Parsing %s: %v", name, err)
34 }
35
36 if feed.Title != want {
37 t.Errorf("%s: got %q, want %q", name, feed.Title, want)
38 }
39 }
40}
41
42func TestEnclosure(t *testing.T) {
43 tests := map[string]Enclosure{
44 "rss_1.0": Enclosure{URL: "http://foo.bar/baz.mp3", Type: "audio/mpeg", Length: 65535},
45 "rss_2.0": Enclosure{URL: "http://example.com/file.mp3", Type: "audio/mpeg", Length: 65535},
46 "rss_2.0-1": Enclosure{URL: "http://gdb.voanews.com/6C49CA6D-C18D-414D-8A51-2B7042A81010_cx0_cy29_cw0_w800_h450.jpg", Type: "image/jpeg", Length: 3123},
47 "atom_1.0": Enclosure{URL: "http://example.org/audio.mp3", Type: "audio/mpeg", Length: 1234},
48 }
49
50 for test, want := range tests {
51 name := filepath.Join("testdata", test+"_enclosure")
52 data, err := ioutil.ReadFile(name)
53 if err != nil {
54 t.Fatalf("Reading %s: %v", name, err)
55 }
56
57 feed, err := Parse(data)
58 if err != nil {
59 t.Fatalf("Parsing %s: %v", name, err)
60 }
61
62 enclosureFound := false
63 for _, item := range feed.Items {
64 for _, enc := range item.Enclosures {
65 enclosureFound = true
66 if !reflect.DeepEqual(*enc, want) {
67 t.Errorf("%s: got %#v, want %#v", name, *enc, want)
68 }
69 }
70 }
71 if !enclosureFound {
72 t.Errorf("No enclosures parsed in %s", name)
73 }
74 }
75}
76
77func MakeTestdataFetchFunc(file string) FetchFunc {
78 return func(url string) (resp *http.Response, err error) {
79 // Create mock http.Response
80 resp = new(http.Response)
81 resp.Body, err = os.Open("testdata/" + file)
82
83 return resp, err
84 }
85}
86
87func TestFeedUnmarshalUpdate(t *testing.T) {
88 fetch1 := MakeTestdataFetchFunc("rssupdate-1")
89 fetch2 := MakeTestdataFetchFunc("rssupdate-2")
90 feed, err := FetchByFunc(fetch1, "http://localhost/dummyrss")
91 if err != nil {
92 t.Fatalf("Failed fetching testdata 'rssupdate-2': %v", err)
93 }
94
95 if 1 != feed.Unread {
96 t.Errorf("Expected one unread item initially, got %v", feed.Unread)
97 }
98
99 jsonBlob, err := json.Marshal(feed)
100 if err != nil {
101 t.Fatalf("Failed to marshal Feed %+v\n", feed)
102 }
103
104 var unmarshalledFeed Feed
105 err = json.Unmarshal(jsonBlob, &unmarshalledFeed)
106
107 var defaultFetchFuncCalled = 0
108 DefaultFetchFunc = func(url string) (resp *http.Response, err error) {
109 defaultFetchFuncCalled++
110 return nil, errors.New("No network in test")
111 }
112
113 err = unmarshalledFeed.Update()
114 if err != nil {
115 t.Logf("Expected failure updating via http in test: %v", err)
116 }
117
118 if defaultFetchFuncCalled < 1 {
119 t.Error("DefaultFetchFunc was not called during Update()")
120 }
121
122 err = unmarshalledFeed.UpdateByFunc(fetch2)
123 if err != nil {
124 t.Fatalf("Failed updating the feed from testdata 'rssupdate-2': %v", err)
125 }
126
127 if 2 != unmarshalledFeed.Unread {
128 t.Errorf("Expected two unread items after update, got %v", unmarshalledFeed.Unread)
129 }
130}
131
132func TestItemGUIDs(t *testing.T) {
133 feed1, err := FetchByFunc(MakeTestdataFetchFunc("rss_2.0"), "http://localhost/dummyfeed1")
134 if err != nil {
135 t.Fatalf("Failed fetching testdata 'rss_2.0': %v", err)
136 }
137
138 if len(feed1.Items) != 2 {
139 t.Errorf("Expected one item in feed 'rss_2.0', got %v", len(feed1.Items))
140 }
141
142 feed2, err := FetchByFunc(MakeTestdataFetchFunc("rssupdate-1"), "http://localhost/dummyfeed2")
143 if err != nil {
144 t.Fatalf("Failed fetching testdata 'rssupdate-1': %v", err)
145 }
146
147 if len(feed2.Items) != 1 {
148 t.Errorf("Expected one item in feed 'rssupdate' after step 1, got %v", len(feed2.Items))
149 }
150
151 err = feed2.UpdateByFunc(MakeTestdataFetchFunc("rssupdate-2"))
152 if err != nil {
153 t.Fatalf("Failed fetching testdata 'rssupdate-2': %v", err)
154 }
155
156 // rssupdate-2 contains two items, one new item and one old item from rssupdate-1
157 if len(feed2.Items) != 2 {
158 t.Errorf("Expected two items in feed 'rssupdate' after step 2, got %v", len(feed2.Items))
159 }
160}