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) }) } }