diff options
Diffstat (limited to 'workhorse/internal/api/api_test.go')
-rw-r--r-- | workhorse/internal/api/api_test.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/workhorse/internal/api/api_test.go b/workhorse/internal/api/api_test.go index 71a0b703cea..8f15e396516 100644 --- a/workhorse/internal/api/api_test.go +++ b/workhorse/internal/api/api_test.go @@ -1,6 +1,8 @@ package api import ( + "context" + "encoding/json" "fmt" "io" "net/http" @@ -10,6 +12,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb" "gitlab.com/gitlab-org/gitlab/workhorse/internal/helper" "gitlab.com/gitlab-org/gitlab/workhorse/internal/secret" @@ -130,3 +133,76 @@ func testRailsServer(url *regexp.Regexp, code int, body string) *httptest.Server fmt.Fprint(w, body) }) } + +func TestPreAuthorizeFixedPath(t *testing.T) { + var ( + upstreamHeaders http.Header + upstreamQuery url.Values + ) + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/my/api/path" { + return + } + + upstreamHeaders = r.Header + upstreamQuery = r.URL.Query() + w.Header().Set("Content-Type", ResponseContentType) + io.WriteString(w, `{"TempPath":"HELLO!!"}`) + })) + defer ts.Close() + + req, err := http.NewRequest("GET", "/original/request/path?q1=Q1&q2=Q2", nil) + require.NoError(t, err) + req.Header.Set("key1", "value1") + + api := NewAPI(helper.URLMustParse(ts.URL), "123", http.DefaultTransport) + resp, err := api.PreAuthorizeFixedPath(req, "POST", "/my/api/path") + require.NoError(t, err) + + require.Equal(t, "value1", upstreamHeaders.Get("key1"), "original headers must propagate") + require.Equal(t, url.Values{"q1": []string{"Q1"}, "q2": []string{"Q2"}}, upstreamQuery, + "original query must propagate") + require.Equal(t, "HELLO!!", resp.TempPath, "sanity check: successful API call") +} + +func TestSendGitAuditEvent(t *testing.T) { + testhelper.ConfigureSecret() + + var ( + requestHeaders http.Header + requestBody GitAuditEventRequest + ) + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/api/v4/internal/shellhorse/git_audit_event" { + return + } + + requestHeaders = r.Header + defer r.Body.Close() + b, err := io.ReadAll(r.Body) + require.NoError(t, err) + err = json.Unmarshal(b, &requestBody) + require.NoError(t, err) + })) + defer ts.Close() + + api := NewAPI(helper.URLMustParse(ts.URL), "123", http.DefaultTransport) + auditRequest := GitAuditEventRequest{ + Action: "git-receive-request", + Protocol: "http", + Repo: "project-1", + Username: "GitLab-Shell", + PackfileStats: &gitalypb.PackfileNegotiationStatistics{ + Wants: 3, + Haves: 23, + }, + } + err := api.SendGitAuditEvent(context.Background(), auditRequest) + require.NoError(t, err) + + require.NotEmpty(t, requestHeaders) + require.NotEmpty(t, requestHeaders["Gitlab-Workhorse-Api-Request"]) + require.Equal(t, auditRequest, requestBody) +} |