diff options
Diffstat (limited to 'workhorse/internal/api/api_test.go')
-rw-r--r-- | workhorse/internal/api/api_test.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/workhorse/internal/api/api_test.go b/workhorse/internal/api/api_test.go new file mode 100644 index 00000000000..5ab677c4233 --- /dev/null +++ b/workhorse/internal/api/api_test.go @@ -0,0 +1,74 @@ +package api + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/labkit/log" + + "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/secret" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/testhelper" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/upstream/roundtripper" +) + +func TestGetGeoProxyURLWhenGeoSecondary(t *testing.T) { + geoProxyURL, err := getGeoProxyURLGivenResponse(t, `{"geo_proxy_url":"http://primary"}`) + + require.NoError(t, err) + require.NotNil(t, geoProxyURL) + require.Equal(t, "http://primary", geoProxyURL.String()) +} + +func TestGetGeoProxyURLWhenGeoPrimaryOrNonGeo(t *testing.T) { + geoProxyURL, err := getGeoProxyURLGivenResponse(t, "{}") + + require.Error(t, err) + require.Equal(t, ErrNotGeoSecondary, err) + require.Nil(t, geoProxyURL) +} + +func getGeoProxyURLGivenResponse(t *testing.T, givenInternalApiResponse string) (*url.URL, error) { + t.Helper() + ts := testRailsServer(regexp.MustCompile(`/api/v4/geo/proxy`), 200, givenInternalApiResponse) + defer ts.Close() + backend := helper.URLMustParse(ts.URL) + version := "123" + rt := roundtripper.NewTestBackendRoundTripper(backend) + testhelper.ConfigureSecret() + + apiClient := NewAPI(backend, version, rt) + + geoProxyURL, err := apiClient.GetGeoProxyURL() + + return geoProxyURL, err +} + +func testRailsServer(url *regexp.Regexp, code int, body string) *httptest.Server { + return testhelper.TestServerWithHandler(url, func(w http.ResponseWriter, r *http.Request) { + // return a 204 No Content response if we don't receive the JWT header + if r.Header.Get(secret.RequestHeader) == "" { + w.WriteHeader(204) + return + } + + w.Header().Set("Content-Type", ResponseContentType) + + logEntry := log.WithFields(log.Fields{ + "method": r.Method, + "url": r.URL, + }) + logEntryWithCode := logEntry.WithField("code", code) + + // Write pure string + logEntryWithCode.Info("UPSTREAM") + + w.WriteHeader(code) + fmt.Fprint(w, body) + }) +} |