242 lines
6.1 KiB
Go
242 lines
6.1 KiB
Go
package webhooks
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/tls"
|
|
"net/http"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
. "gopkg.in/go-playground/assert.v1"
|
|
)
|
|
|
|
// NOTES:
|
|
// - Run "go test" to run tests
|
|
// - Run "gocov test | gocov report" to report on test converage by file
|
|
// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
|
|
//
|
|
// or
|
|
//
|
|
// -- may be a good idea to change to output path to somewherelike /tmp
|
|
// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
|
|
//
|
|
|
|
type FakeWebhook struct {
|
|
provider Provider
|
|
}
|
|
|
|
func (fhook FakeWebhook) Provider() Provider {
|
|
return fhook.provider
|
|
}
|
|
|
|
func (fhook FakeWebhook) ParsePayload(w http.ResponseWriter, r *http.Request) {
|
|
}
|
|
|
|
var fakeHook Webhook
|
|
|
|
func TestMain(m *testing.M) {
|
|
|
|
// setup
|
|
fakeHook = &FakeWebhook{
|
|
provider: GitHub,
|
|
}
|
|
|
|
os.Exit(m.Run())
|
|
|
|
// teardown
|
|
}
|
|
|
|
func TestRun(t *testing.T) {
|
|
|
|
go Run(fakeHook, "127.0.0.1:3006", "/webhooks")
|
|
time.Sleep(5000)
|
|
|
|
payload := "{}"
|
|
|
|
req, err := http.NewRequest("POST", "http://127.0.0.1:3006/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
client := &http.Client{}
|
|
resp, err := client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusOK)
|
|
|
|
// While HTTP Server is running test some bad input
|
|
|
|
// Test BAD URL
|
|
req, err = http.NewRequest("POST", "http://127.0.0.1:3006", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusNotFound)
|
|
|
|
// Test BAD METHOD
|
|
req, err = http.NewRequest("GET", "http://127.0.0.1:3006/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusMethodNotAllowed)
|
|
}
|
|
|
|
func TestRunServer(t *testing.T) {
|
|
|
|
server := &http.Server{Addr: "127.0.0.1:3007", Handler: nil}
|
|
go RunServer(server, fakeHook, "/webhooks")
|
|
time.Sleep(5000)
|
|
|
|
payload := "{}"
|
|
|
|
req, err := http.NewRequest("POST", "http://127.0.0.1:3007/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
client := &http.Client{}
|
|
resp, err := client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusOK)
|
|
|
|
// While HTTP Server is running test some bad input
|
|
|
|
// Test BAD URL
|
|
req, err = http.NewRequest("POST", "http://127.0.0.1:3007", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusNotFound)
|
|
|
|
// Test BAD METHOD
|
|
req, err = http.NewRequest("GET", "http://127.0.0.1:3007/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusMethodNotAllowed)
|
|
}
|
|
|
|
func TestRunTLSServer(t *testing.T) {
|
|
|
|
var err error
|
|
|
|
// can have certificates in static variables or load from disk
|
|
cert := `-----BEGIN CERTIFICATE-----
|
|
MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
|
|
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
|
|
aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
|
|
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
|
|
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
|
|
hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
|
|
rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
|
|
zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
|
|
MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
|
|
r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
|
|
-----END CERTIFICATE-----
|
|
`
|
|
key := `-----BEGIN RSA PRIVATE KEY-----
|
|
MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
|
|
k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
|
|
6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
|
|
MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
|
|
SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
|
|
xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
|
|
D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
|
|
-----END RSA PRIVATE KEY-----
|
|
`
|
|
|
|
server := &http.Server{Addr: "127.0.0.1:3008", Handler: nil, TLSConfig: &tls.Config{}}
|
|
server.TLSConfig.Certificates = make([]tls.Certificate, 1)
|
|
|
|
server.TLSConfig.Certificates[0], err = tls.X509KeyPair([]byte(cert), []byte(key))
|
|
Equal(t, err, nil)
|
|
|
|
go RunTLSServer(server, fakeHook, "/webhooks")
|
|
time.Sleep(5000)
|
|
|
|
payload := "{}"
|
|
|
|
req, err := http.NewRequest("POST", "https://127.0.0.1:3008/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
tr := &http.Transport{
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
}
|
|
|
|
client := &http.Client{Transport: tr}
|
|
resp, err := client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusOK)
|
|
|
|
// While HTTP Server is running test some bad input
|
|
|
|
// Test BAD URL
|
|
req, err = http.NewRequest("POST", "https://127.0.0.1:3008", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusNotFound)
|
|
|
|
// Test BAD METHOD
|
|
req, err = http.NewRequest("GET", "https://127.0.0.1:3008/webhooks", bytes.NewBuffer([]byte(payload)))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
Equal(t, err, nil)
|
|
|
|
resp, err = client.Do(req)
|
|
Equal(t, err, nil)
|
|
|
|
defer resp.Body.Close()
|
|
|
|
Equal(t, resp.StatusCode, http.StatusMethodNotAllowed)
|
|
}
|
|
|
|
func TestProviderString(t *testing.T) {
|
|
|
|
Equal(t, GitHub.String(), "GitHub")
|
|
Equal(t, Bitbucket.String(), "Bitbucket")
|
|
Equal(t, GitLab.String(), "GitLab")
|
|
Equal(t, Provider(999999).String(), "Unknown")
|
|
}
|