Ignore empty link when discovering feeds
This commit is contained in:
parent
bb5f3ec6a8
commit
aaa1625724
2 changed files with 293 additions and 4 deletions
|
@ -87,13 +87,13 @@ func parseWebPage(websiteURL string, data io.Reader) (Subscriptions, *errors.Loc
|
||||||
|
|
||||||
if title, exists := s.Attr("title"); exists {
|
if title, exists := s.Attr("title"); exists {
|
||||||
subscription.Title = title
|
subscription.Title = title
|
||||||
} else {
|
|
||||||
subscription.Title = "Feed"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if feedURL, exists := s.Attr("href"); exists {
|
if feedURL, exists := s.Attr("href"); exists {
|
||||||
|
if feedURL != "" {
|
||||||
subscription.URL, _ = url.AbsoluteURL(websiteURL, feedURL)
|
subscription.URL, _ = url.AbsoluteURL(websiteURL, feedURL)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if subscription.Title == "" {
|
if subscription.Title == "" {
|
||||||
subscription.Title = subscription.URL
|
subscription.Title = subscription.URL
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package subscription
|
package subscription
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestFindYoutubeChannelFeed(t *testing.T) {
|
func TestFindYoutubeChannelFeed(t *testing.T) {
|
||||||
scenarios := map[string]string{
|
scenarios := map[string]string{
|
||||||
|
@ -19,3 +22,289 @@ func TestFindYoutubeChannelFeed(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithRssFeed(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="http://example.org/rss" rel="alternate" type="application/rss+xml" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Some Title" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/rss" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "rss" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithAtomFeed(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="http://example.org/atom.xml" rel="alternate" type="application/atom+xml" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Some Title" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/atom.xml" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "atom" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithJSONFeed(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="http://example.org/feed.json" rel="alternate" type="application/feed+json" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Some Title" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "json" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithOldJSONFeedMimeType(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="http://example.org/feed.json" rel="alternate" type="application/json" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Some Title" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "json" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithRelativeFeedURL(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="/feed.json" rel="alternate" type="application/feed+json" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Some Title" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "json" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithEmptyTitle(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="/feed.json" rel="alternate" type="application/feed+json">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 1 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "json" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithMultipleFeeds(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="http://example.org/atom.xml" rel="alternate" type="application/atom+xml" title="Atom Feed">
|
||||||
|
<link href="http://example.org/feed.json" rel="alternate" type="application/feed+json" title="JSON Feed">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 2 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Title != "Atom Feed" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].URL != "http://example.org/atom.xml" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[0].Type != "atom" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[1].Title != "JSON Feed" {
|
||||||
|
t.Errorf(`Incorrect subscription title: %q`, subscriptions[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[1].URL != "http://example.org/feed.json" {
|
||||||
|
t.Errorf(`Incorrect subscription URL: %q`, subscriptions[0].URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if subscriptions[1].Type != "json" {
|
||||||
|
t.Errorf(`Incorrect subscription type: %q`, subscriptions[0].Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithEmptyFeedURL(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href rel="alternate" type="application/feed+json" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 0 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseWebPageWithNoHref(t *testing.T) {
|
||||||
|
htmlPage := `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="alternate" type="application/feed+json" title="Some Title">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
|
||||||
|
subscriptions, err := parseWebPage("http://example.org/", strings.NewReader(htmlPage))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing a correctly formatted HTML page should not return any error: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(subscriptions) != 0 {
|
||||||
|
t.Fatal(`Incorrect number of subscriptions returned`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue