diff --git a/integration/conntest/database_test.go b/integration/conntest/database_test.go index b613879088f..8b5f070dfda 100644 --- a/integration/conntest/database_test.go +++ b/integration/conntest/database_test.go @@ -224,7 +224,7 @@ func TestDiagnoseConnectionForPostgresDatabases(t *testing.T) { DialTimeout: time.Second, InsecureSkipVerify: true, } - respStatusCode, respBody := webPack.DoRequest(t, http.MethodPost, diagnoseConnectionEndpoint, diagnoseReq) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodPost, diagnoseConnectionEndpoint, diagnoseReq) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) var connectionDiagnostic ui.ConnectionDiagnostic @@ -310,7 +310,7 @@ func TestDiagnoseConnectionForPostgresDatabases(t *testing.T) { TOTPCode: validToken, }, } - respStatusCode, respBody := webPack.DoRequest(t, http.MethodPost, diagnoseConnectionEndpoint, diagnoseReq) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodPost, diagnoseConnectionEndpoint, diagnoseReq) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) var connectionDiagnostic ui.ConnectionDiagnostic diff --git a/integration/db/database_service_test.go b/integration/db/database_service_test.go index e83ecd8aa77..01398ac3f03 100644 --- a/integration/db/database_service_test.go +++ b/integration/db/database_service_test.go @@ -90,7 +90,7 @@ func TestDatabaseServiceHeartbeat(t *testing.T) { // List Database Services listDBServicesEndpoint := strings.Join([]string{"sites", "$site", "databaseservices"}, "/") - respStatusCode, respBody := webPack.DoRequest(t, http.MethodGet, listDBServicesEndpoint, nil) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodGet, listDBServicesEndpoint, nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) var listResp listDatabaseServicesResp diff --git a/integration/helpers/web.go b/integration/helpers/web.go index b953376bc36..47839f873d4 100644 --- a/integration/helpers/web.go +++ b/integration/helpers/web.go @@ -99,7 +99,7 @@ func LoginWebClient(t *testing.T, host, username, password string) *WebClientPac bearerToken: csResp.Token, } - respStatusCode, bs := webClient.DoRequest(t, http.MethodGet, "sites", nil) + respStatusCode, bs := webClient.DoWebAPIRequest(t, http.MethodGet, "sites", nil) require.Equal(t, http.StatusOK, respStatusCode, string(bs)) var clusters []ui.Cluster @@ -189,7 +189,7 @@ func LoginMFAWebClient(t *testing.T, host string, passwordlessDevice *mocku2f.Ke bearerToken: csResp.Token, } - respStatusCode, bs := webClient.DoRequest(t, http.MethodGet, "sites", nil) + respStatusCode, bs := webClient.DoWebAPIRequest(t, http.MethodGet, "sites", nil) require.Equal(t, http.StatusOK, respStatusCode, string(bs)) var clusters []ui.Cluster @@ -200,14 +200,12 @@ func LoginMFAWebClient(t *testing.T, host string, passwordlessDevice *mocku2f.Ke return webClient } -// DoRequest receives a method, endpoint and payload and sends an HTTP Request to the Teleport API. +// DoWebAPIRequest receives a method, endpoint and payload and sends an HTTP Request to the Teleport API. // The endpoint must not contain the host neither the base path ('/v1/webapi/'). // Status Code and Body are returned. // "$site" in the endpoint is substituted by the current site. -func (w *WebClientPack) DoRequest(t *testing.T, method, endpoint string, payload any) (int, []byte) { - endpoint = fmt.Sprintf("https://%s/v1/webapi/%s", w.host, endpoint) - endpoint = strings.ReplaceAll(endpoint, "$site", w.clusterName) - u, err := url.Parse(endpoint) +func (w *WebClientPack) DoWebAPIRequest(t *testing.T, method, endpoint string, payload any) (int, []byte) { + u, err := url.Parse(w.Endpoint("v1", "webapi", endpoint)) require.NoError(t, err) bs, err := json.Marshal(payload) @@ -216,14 +214,8 @@ func (w *WebClientPack) DoRequest(t *testing.T, method, endpoint string, payload req, err := http.NewRequest(method, u.String(), bytes.NewBuffer(bs)) require.NoError(t, err) - req.AddCookie(&http.Cookie{ - Name: websession.CookieName, - Value: w.webCookie, - }) - req.Header.Add("Authorization", fmt.Sprintf("Bearer %v", w.bearerToken)) req.Header.Add("Content-Type", "application/json") - - resp, err := w.clt.Do(req) + resp, err := w.Do(req) require.NoError(t, err) defer resp.Body.Close() @@ -234,6 +226,24 @@ func (w *WebClientPack) DoRequest(t *testing.T, method, endpoint string, payload return resp.StatusCode, body } +// Do sends an HTTP request with the web session cookie and bearer token. +func (w *WebClientPack) Do(req *http.Request) (*http.Response, error) { + req.AddCookie(&http.Cookie{ + Name: websession.CookieName, + Value: w.webCookie, + }) + req.Header.Add("Authorization", fmt.Sprintf("Bearer %v", w.bearerToken)) + + resp, err := w.clt.Do(req) + return resp, err +} + +// Endpoint returns a Teleport API endpoint URL. +func (w *WebClientPack) Endpoint(params ...string) string { + endpoint := fmt.Sprintf("%s://%s/%s", client.HTTPS, w.host, strings.Join(params, "/")) + return strings.ReplaceAll(endpoint, "$site", w.clusterName) +} + // OpenWebsocket opens a websocket on a given Teleport API endpoint. // The endpoint must not contain the host neither the base path ('/v1/webapi/'). // Raw websocket and HTTP response are returned. diff --git a/integration/integrations/integration_test.go b/integration/integrations/integration_test.go index fa198a04150..b4e4c4bb1d3 100644 --- a/integration/integrations/integration_test.go +++ b/integration/integrations/integration_test.go @@ -84,7 +84,7 @@ func TestIntegrationCRUD(t *testing.T) { webPack := helpers.LoginWebClient(t, proxyAddr.String(), username, userPassword) // List integrations should return empty - respStatusCode, respBody := webPack.DoRequest(t, http.MethodGet, integrationsEndpoint, nil) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodGet, integrationsEndpoint, nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) listResp := ui.IntegrationsListResponse{} @@ -103,7 +103,7 @@ func TestIntegrationCRUD(t *testing.T) { }, } - respStatusCode, respBody = webPack.DoRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationReq) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationReq) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) // Create Integration without S3 location @@ -115,11 +115,11 @@ func TestIntegrationCRUD(t *testing.T) { }, } - respStatusCode, respBody = webPack.DoRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationWithoutS3LocationReq) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationWithoutS3LocationReq) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) // Get One Integration by name - respStatusCode, respBody = webPack.DoRequest(t, http.MethodGet, integrationsEndpoint+"/my-aws-account", nil) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodGet, integrationsEndpoint+"/my-aws-account", nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) integrationResp := ui.Integration{} @@ -136,7 +136,7 @@ func TestIntegrationCRUD(t *testing.T) { }, integrationResp, string(respBody)) // Update the integration to another RoleARN - respStatusCode, respBody = webPack.DoRequest(t, http.MethodPut, integrationsEndpoint+"/my-aws-account", ui.UpdateIntegrationRequest{ + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodPut, integrationsEndpoint+"/my-aws-account", ui.UpdateIntegrationRequest{ AWSOIDC: &ui.IntegrationAWSOIDCSpec{ RoleARN: "arn:aws:iam::123456789012:role/OpsTeam", IssuerS3Bucket: "my-bucket", @@ -159,7 +159,7 @@ func TestIntegrationCRUD(t *testing.T) { }, integrationResp, string(respBody)) // Update the integration to remove the S3 Location - respStatusCode, respBody = webPack.DoRequest(t, http.MethodPut, integrationsEndpoint+"/my-aws-account", ui.UpdateIntegrationRequest{ + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodPut, integrationsEndpoint+"/my-aws-account", ui.UpdateIntegrationRequest{ AWSOIDC: &ui.IntegrationAWSOIDCSpec{ RoleARN: "arn:aws:iam::123456789012:role/OpsTeam2", }, @@ -178,7 +178,7 @@ func TestIntegrationCRUD(t *testing.T) { }, integrationResp, string(respBody)) // Delete resource - respStatusCode, respBody = webPack.DoRequest(t, http.MethodDelete, integrationsEndpoint+"/my-aws-account", nil) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodDelete, integrationsEndpoint+"/my-aws-account", nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) // Add multiple integrations to test pagination @@ -196,12 +196,12 @@ func TestIntegrationCRUD(t *testing.T) { }, } - respStatusCode, respBody := webPack.DoRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationReq) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodPost, integrationsEndpoint, createIntegrationReq) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) } // List integrations should return a full page - respStatusCode, respBody = webPack.DoRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10", nil) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10", nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) listResp = ui.IntegrationsListResponse{} @@ -210,7 +210,7 @@ func TestIntegrationCRUD(t *testing.T) { require.Len(t, listResp.Items, pageSize) // Requesting the 2nd page should return a full page - respStatusCode, respBody = webPack.DoRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10&startKey="+listResp.NextKey, nil) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10&startKey="+listResp.NextKey, nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) listResp = ui.IntegrationsListResponse{} @@ -219,7 +219,7 @@ func TestIntegrationCRUD(t *testing.T) { require.Len(t, listResp.Items, pageSize) // Requesting the 3rd page should return two items and empty StartKey - respStatusCode, respBody = webPack.DoRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10&startKey="+listResp.NextKey, nil) + respStatusCode, respBody = webPack.DoWebAPIRequest(t, http.MethodGet, integrationsEndpoint+"?limit=10&startKey="+listResp.NextKey, nil) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) listResp = ui.IntegrationsListResponse{} diff --git a/integration/web/web_test.go b/integration/web/web_test.go index d0c7e6a4e6d..7320907f2b8 100644 --- a/integration/web/web_test.go +++ b/integration/web/web_test.go @@ -196,7 +196,7 @@ func TestMFAAuthenticateChallenge_IsMFARequiredApp(t *testing.T) { }, } - respStatusCode, respBody := webPack.DoRequest(t, http.MethodPost, endpoint, req) + respStatusCode, respBody := webPack.DoWebAPIRequest(t, http.MethodPost, endpoint, req) require.Equal(t, http.StatusOK, respStatusCode, string(respBody)) var resp client.MFAAuthenticateChallenge