package parser import ( "reflect" "strings" "testing" ) func TestSniff(t *testing.T) { testcases := []struct { input string want feedProbe }{ { ``, feedProbe{feedType: "rdf", callback: ParseRDF}, }, { ``, feedProbe{feedType: "rss", callback: ParseRSS, encoding: "iso-8859-1"}, }, { ``, feedProbe{feedType: "rss", callback: ParseRSS}, }, { ``, feedProbe{feedType: "atom", callback: ParseAtom, encoding: "utf-8"}, }, { `{}`, feedProbe{feedType: "json", callback: ParseJSON}, }, { ``, feedProbe{}, }, } for _, testcase := range testcases { want := testcase.want have := sniff(testcase.input) if want.encoding != have.encoding || want.feedType != have.feedType { t.Errorf("Invalid output\n---\n%s\n---\n\nwant=%#v\nhave=%#v", testcase.input, want, have) } } } func TestParse(t *testing.T) { have, _ := Parse(strings.NewReader(` Title Item 1 content]]> `)) want := &Feed{ Title: "Title", Items: []Item{ { Title: "Item 1", Content: "
content
", }, }, } if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.Fatal("invalid content") } } func TestParseShortFeed(t *testing.T) { have, err := Parse(strings.NewReader( ``, )) want := &Feed{} if err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestParseFeedWithBOM(t *testing.T) { have, err := Parse(strings.NewReader( "\xEF\xBB\xBF" + ``, )) want := &Feed{} if err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, have) { t.Logf("want: %#v", want) t.Logf("have: %#v", have) t.FailNow() } } func TestParseCleanIllegalCharsInUTF8(t *testing.T) { data := ` ` + "\a" + `title ` feed, err := Parse(strings.NewReader(data)) if err != nil { t.Fatal(err) } if len(feed.Items) != 1 || feed.Items[0].Title != "title" { t.Fatalf("invalid feed, got: %v", feed) } } func TestParseCleanIllegalCharsInNonUTF8(t *testing.T) { // echo привет | iconv -f utf8 -t cp1251 | hexdump -C data := ` ` + "\a \xef\xf0\xe8\xe2\xe5\xf2\x0a \a" + ` ` feed, err := Parse(strings.NewReader(data)) if err != nil { t.Fatal(err) } if len(feed.Items) != 1 || feed.Items[0].Title != "привет" { t.Fatalf("invalid feed, got: %v", feed) } } func TestParseMissingGUID(t *testing.T) { data := ` foo bar ` feed, err := ParseAndFix(strings.NewReader(data), "", "") if err != nil { t.Fatal(err) } if len(feed.Items) != 2 { t.Fatalf("expected 2 items, got %d", len(feed.Items)) } if feed.Items[0].GUID == "" || feed.Items[1].GUID == "" { t.Fatalf("item GUIDs are missing, got %#v", feed.Items) } if feed.Items[0].GUID == feed.Items[1].GUID { t.Fatalf("item GUIDs are not unique, got %#v", feed.Items) } }