package parser import ( "reflect" "strings" "testing" "time" ) func TestAtom(t *testing.T) { have, _ := Parse(strings.NewReader(` Example Feed A subtitle. urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 2003-12-13T18:30:02Z Atom-Powered Robots Run Amok urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a 2003-12-13T18:30:02Z Some text.

This is the entry content.

John Doe johndoe@example.com
`)) want := &Feed{ Title: "Example Feed", SiteURL: "http://example.org/", Items: []Item{ { GUID: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", Date: time.Unix(1071340202, 0).UTC(), URL: "http://example.org/2003/12/13/atom03.html", Title: "Atom-Powered Robots Run Amok", Content: `

This is the entry content.

`, ImageURL: "", AudioURL: "", }, }, } if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.Fatal("invalid atom") } } func TestAtomClashingNamespaces(t *testing.T) { have, err := Parse(strings.NewReader(` atom content `)) want := &Feed{Items: []Item{{Content: "atom content"}}} if err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestAtomHTMLTitle(t *testing.T) { feed, _ := Parse(strings.NewReader(` say <code>what</code>?</entry> </feed> `)) have := feed.Items[0].Title want := "say what?" if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestAtomXHTMLTitle(t *testing.T) { feed, _ := Parse(strings.NewReader(` <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <entry><title type="xhtml">say <code>what</code>?</entry> </feed> `)) have := feed.Items[0].Title want := "say what?" if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestAtomXHTMLNestedTitle(t *testing.T) { feed, _ := Parse(strings.NewReader(` <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <entry> <title type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> <a href="https://example.com">Link to Example</a> </div> `)) have := feed.Items[0].Title want := "Link to Example" if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestAtomImageLink(t *testing.T) { feed, _ := Parse(strings.NewReader(` `)) have := feed.Items[0].ImageURL want := `https://example.com/image.png?width=100&height=100` if want != have { t.Fatalf("item.image_url doesn't match\nwant: %#v\nhave: %#v\n", want, have) } } // found in: https://www.reddit.com/r/funny.rss // items come with thumbnail urls which are also present in the content func TestAtomImageLinkDuplicated(t *testing.T) { feed, _ := Parse(strings.NewReader(` <img src="https://example.com/image.png?width=100&height=100"> `)) have := feed.Items[0].Content want := `` if want != have { t.Fatalf("want: %#v\nhave: %#v\n", want, have) } if feed.Items[0].ImageURL != "" { t.Fatal("item.image_url must be unset if present in the content") } } func TestAtomLinkInID(t *testing.T) { feed, _ := Parse(strings.NewReader(` one updated https://example.com/posts/1 2003-12-13T09:17:51 two urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 one https://example.com/posts/1 `)) have := feed.Items want := []Item{ Item{ GUID: "https://example.com/posts/1::2003-12-13T09:17:51", Date: time.Date(2003, time.December, 13, 9, 17, 51, 0, time.UTC), URL: "https://example.com/posts/1", Title: "one updated", }, Item{ GUID: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", Date: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), URL: "", Title: "two", }, Item{ GUID: "https://example.com/posts/1::", Date: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), URL: "https://example.com/posts/1", Title: "one", Content: "", }, } if !reflect.DeepEqual(want, have) { t.Fatalf("\nwant: %#v\nhave: %#v\n", want, have) } } func TestAtomDoesntEscapeHTMLTags(t *testing.T) { feed, _ := Parse(strings.NewReader(` &lt;script&gt;alert(1);&lt;/script&gt; `)) have := feed.Items[0].Content want := "<script>alert(1);</script>" if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } }