diff --git a/parsers/web/parser_test.go b/parsers/web/parser_test.go new file mode 100644 index 0000000..3788133 --- /dev/null +++ b/parsers/web/parser_test.go @@ -0,0 +1,118 @@ +package web + +import ( + "net/url" + "testing" + "time" + + "github.com/icedream/irc-medialink/parsers" + "github.com/stretchr/testify/assert" +) + +func mustNewParser(t *testing.T) *Parser { + p := new(Parser) + if !assert.Nil(t, p.Init(), "Parser.Init must throw no errors") { + panic("Can't run test without a proper parser") + } + return p +} + +func parseWithTimeout(p *Parser, t *testing.T, timeout time.Duration, u *url.URL, ref *url.URL) (retval parsers.ParseResult) { + resultChan := make(chan parsers.ParseResult) + go func(resultChan chan<- parsers.ParseResult, p *Parser, u *url.URL, ref *url.URL) { + resultChan <- p.Parse(u, ref) + }(resultChan, p, u, ref) + + select { + case r := <-resultChan: + retval = r + return + case <-time.After(timeout): + t.Fatal("Didn't succeed parsing URL in time") + return + } +} + +func Test_Parser_Parse_IRCBotScience_NoTitle(t *testing.T) { + p := mustNewParser(t) + result := p.Parse(&url.URL{ + Scheme: "https", + Host: "irc-bot-science.clsr.net", + Path: "notitle", + }, nil) + + t.Logf("Result: %+v", result) + assert.False(t, result.Ignored) + assert.Nil(t, result.Error) + assert.Nil(t, result.UserError) + assert.Len(t, result.Information, 1) + assert.Equal(t, noTitleStr, result.Information[0]["Title"]) +} + +func Test_Parser_Parse_IRCBotScience_LongHeaders(t *testing.T) { + p := mustNewParser(t) + result := parseWithTimeout(p, t, 5*time.Second, &url.URL{ + Scheme: "https", + Host: "irc-bot-science.clsr.net", + Path: "longheaders", + }, nil) + for result.FollowUrl != nil { + result = parseWithTimeout(p, t, 5*time.Second, result.FollowUrl, nil) + } + + t.Logf("Result: %+v", result) + assert.True(t, result.Ignored) +} + +func Test_Parser_Parse_IRCBotScience_BigHeader(t *testing.T) { + p := mustNewParser(t) + result := parseWithTimeout(p, t, 5*time.Second, &url.URL{ + Scheme: "https", + Host: "irc-bot-science.clsr.net", + Path: "bigheader", + }, nil) + for result.FollowUrl != nil { + result = parseWithTimeout(p, t, 5*time.Second, result.FollowUrl, nil) + } + + t.Logf("Result: %+v", result) + assert.True(t, result.Ignored) +} + +func Test_Parser_Parse_IRCBotScience_Large(t *testing.T) { + p := mustNewParser(t) + + result := parseWithTimeout(p, t, 5*time.Second, &url.URL{ + Scheme: "https", + Host: "irc-bot-science.clsr.net", + Path: "large", + }, nil) + for result.FollowUrl != nil { + result = parseWithTimeout(p, t, 5*time.Second, result.FollowUrl, nil) + } + + t.Logf("Result: %+v", result) + assert.False(t, result.Ignored) + assert.Nil(t, result.Error) + assert.Nil(t, result.UserError) + assert.Len(t, result.Information, 1) + assert.Equal(t, "If this title is printed, it works correctly.", result.Information[0]["Title"]) + +} + +func Test_Parser_Parse_IRCBotScience_Redirect(t *testing.T) { + p := mustNewParser(t) + originalUrl := &url.URL{ + Scheme: "https", + Host: "irc-bot-science.clsr.net", + Path: "redirect", + } + result := p.Parse(originalUrl, nil) + + t.Logf("Result: %+v", result) + assert.False(t, result.Ignored) + assert.Nil(t, result.Error) + assert.Nil(t, result.UserError) + assert.NotNil(t, result.FollowUrl) + assert.Equal(t, *originalUrl, *result.FollowUrl) +}