package deadlinks
import (
"bytes"
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestParser(t *testing.T) {
t.Parallel()
parser := NewParser()
tests := []struct {
mimeType string
body string
wantURLs []URL
wantErrs []string
}{
{
"image/jpg",
"ANYTHING",
nil,
nil,
},
{
"text/gemini",
``,
nil,
nil,
},
{
"text/gemini",
`
# HEADER
=> https://foo.com some link
=> empty/path
=> /foo/bar here's an absolute path
=> what.com a domain?
ok here's some text
`,
[]URL{
"https://foo.com",
"empty/path",
"/foo/bar",
"what.com",
},
nil,
},
{
"text/gemini",
`
# HEADER
=> https://foo.com some link
=> empty/path
=> /foo/bar here's an absolute path
=> what.com a domain?
ok here's some text
`,
[]URL{
"https://foo.com",
"empty/path",
"/foo/bar",
"what.com",
},
nil,
},
{
"text/gemini",
`
=> : NO FISH ALLOWED
=> /good/dog
`,
[]URL{"/good/dog"},
[]string{
`parsing URL from line "=> : NO FISH ALLOWED\n": parse ":": missing protocol scheme`,
},
},
{
"text/html",
`
OHAI
`,
[]URL{"foo.com", "/bar", "/bar/baz", "style.css"},
nil,
},
}
for i := range tests {
test := tests[i]
name := fmt.Sprintf(
"%d-%s", i, strings.ReplaceAll(test.mimeType, "/", "_"),
)
t.Run(name, func(t *testing.T) {
t.Parallel()
body := bytes.NewBufferString(test.body)
gotURLs, gotErr := parser.Parse(test.mimeType, body)
assert.Equal(t, test.wantURLs, gotURLs)
if len(test.wantErrs) == 0 {
assert.NoError(t, gotErr)
return
}
type joinedErr interface {
Unwrap() []error
}
var gotErrs []error
if joinedErr, ok := gotErr.(joinedErr); ok {
gotErrs = joinedErr.Unwrap()
} else if gotErr != nil {
gotErrs = []error{gotErr}
}
gotErrStrs := make([]string, len(gotErrs))
for i := range gotErrs {
gotErrStrs[i] = gotErrs[i].Error()
}
assert.Equal(t, test.wantErrs, gotErrStrs)
})
}
}