beebo
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 160 lines 4.3 kB view raw
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}