Files
atlantis/server/events/webhooks/http_test.go
Piotr Pawluk 46e181e725 feat: add http webhook (#5233)
Signed-off-by: Piotr Pawluk <piotr.pawluk@zendesk.com>
Co-authored-by: PePe Amengual <2208324+jamengual@users.noreply.github.com>
2025-01-22 19:39:20 -08:00

128 lines
3.3 KiB
Go

package webhooks_test
import (
"net/http"
"net/http/httptest"
"regexp"
"testing"
"github.com/runatlantis/atlantis/server/events/models"
"github.com/runatlantis/atlantis/server/events/webhooks"
"github.com/runatlantis/atlantis/server/logging"
. "github.com/runatlantis/atlantis/testing"
)
var httpApplyResult = webhooks.ApplyResult{
Workspace: "production",
Repo: models.Repo{
FullName: "runatlantis/atlantis",
},
Pull: models.PullRequest{
Num: 1,
URL: "url",
BaseBranch: "main",
},
User: models.User{
Username: "lkysow",
},
Success: true,
}
func TestHttpWebhookWithHeaders(t *testing.T) {
expectedHeaders := map[string][]string{
"Authorization": {"Bearer token"},
"X-Custom-Header": {"value1", "value2"},
}
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Equals(t, r.Header.Get("Content-Type"), "application/json")
for k, v := range expectedHeaders {
Equals(t, r.Header.Values(k), v)
}
w.WriteHeader(http.StatusOK)
}))
defer server.Close()
webhook := webhooks.HttpWebhook{
Client: &webhooks.HttpClient{Client: http.DefaultClient, Headers: expectedHeaders},
URL: server.URL,
WorkspaceRegex: regexp.MustCompile(".*"),
BranchRegex: regexp.MustCompile(".*"),
}
err := webhook.Send(logging.NewNoopLogger(t), httpApplyResult)
Ok(t, err)
}
func TestHttpWebhookNoHeaders(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Equals(t, r.Header.Get("Content-Type"), "application/json")
w.WriteHeader(http.StatusOK)
}))
defer server.Close()
webhook := webhooks.HttpWebhook{
Client: &webhooks.HttpClient{Client: http.DefaultClient},
URL: server.URL,
WorkspaceRegex: regexp.MustCompile(".*"),
BranchRegex: regexp.MustCompile(".*"),
}
err := webhook.Send(logging.NewNoopLogger(t), httpApplyResult)
Ok(t, err)
}
func TestHttpWebhook500(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
}))
defer server.Close()
webhook := webhooks.HttpWebhook{
Client: &webhooks.HttpClient{Client: http.DefaultClient},
URL: server.URL,
WorkspaceRegex: regexp.MustCompile(".*"),
BranchRegex: regexp.MustCompile(".*"),
}
err := webhook.Send(logging.NewNoopLogger(t), httpApplyResult)
ErrContains(t, "sending webhook", err)
}
func TestHttpNoRegexMatch(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Assert(t, false, "webhook should not be sent")
}))
defer server.Close()
tt := []struct {
name string
wr *regexp.Regexp
br *regexp.Regexp
}{
{
name: "no workspace match",
wr: regexp.MustCompile("other"),
br: regexp.MustCompile(".*"),
},
{
name: "no branch match",
wr: regexp.MustCompile(".*"),
br: regexp.MustCompile("other"),
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
webhook := webhooks.HttpWebhook{
Client: &webhooks.HttpClient{Client: http.DefaultClient},
URL: server.URL,
WorkspaceRegex: tc.wr,
BranchRegex: tc.br,
}
err := webhook.Send(logging.NewNoopLogger(t), httpApplyResult)
Ok(t, err)
})
}
}