package pingback
import (
"brainbaking.com/go-jamming/common"
"encoding/xml"
"github.com/stretchr/testify/assert"
"testing"
)
var conf *common.Config = &common.Config{
AllowedWebmentionSources: []string{
"brainbaking.com",
"jefklakscodex.com",
},
}
func TestValidate(t *testing.T) {
cases := []struct {
label string
xml string
expected bool
}{
{
"not valid if methodName is not pingback.ping",
`
ka.tsjing
https://cool.site
https://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
{
"not valid if less than two parameters",
`
pingback.ping
https://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
{
"not valid if more than two parameters",
`
pingback.ping
https://cool.site
https://brainbaking.com/post/2021/03/cool-ness
https://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
{
"not valid if target is not in trusted domains from config",
`
pingback.ping
https://cool.site
https://flashballz.com/post/2021/03/cool-ness
`,
false,
},
{
"not valid if target is not http(s)",
`
pingback.ping
https://cool.site
gemini://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
{
"not valid if source is not http(s)",
`
pingback.ping
gemini://cool.site
https://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
{
"is valid if pingback.ping and two http(s) parameters of which target is trusted",
`
pingback.ping
https://cool.site
https://brainbaking.com/post/2021/03/cool-ness
`,
true,
},
{
"is not valid if source and target are the same urls",
`
pingback.ping
https://brainbaking.com/post/2021/03/cool-ness
https://brainbaking.com/post/2021/03/cool-ness
`,
false,
},
}
for _, tc := range cases {
t.Run(tc.label, func(t *testing.T) {
var xmlObj XmlRPCMethodCall
err := xml.Unmarshal([]byte(tc.xml), &xmlObj)
assert.NoError(t, err, "XML invalid in test case")
result := validate(&xmlObj, conf)
assert.Equal(t, tc.expected, result)
})
}
}