Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions test/e2e/helpers_enterprise_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
//go:build e2e_tests || istio_tests || performance_tests

package e2e

import (
"context"
"io"
"net/http"
"net/http/httptest"
"testing"

"github.com/stretchr/testify/require"
)

func TestCreateEnterpriseWorkspace(t *testing.T) {
t.Parallel()

tests := []struct {
name string
statusCode int
wantOK bool
}{
{
name: "created response succeeds",
statusCode: http.StatusCreated,
wantOK: true,
},
{
name: "conflict response also succeeds",
statusCode: http.StatusConflict,
wantOK: true,
},
{
name: "unexpected response retries",
statusCode: http.StatusBadGateway,
wantOK: false,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()

server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPost, r.Method)
require.Equal(t, "/workspaces", r.URL.Path)
require.Equal(t, "secret", r.Header.Get("Kong-Admin-Token"))
require.Equal(t, "application/x-www-form-urlencoded", r.Header.Get("Content-Type"))

body, err := io.ReadAll(r.Body)
require.NoError(t, err)
require.Equal(t, "name=workspace-name", string(body))

w.WriteHeader(tt.statusCode)
_, err = w.Write([]byte("response-body"))
require.NoError(t, err)
}))
defer server.Close()

ok, response, err := createEnterpriseWorkspace(
context.Background(),
server.Client(),
server.URL+"/workspaces",
"secret",
"workspace-name",
)
require.NoError(t, err)
require.Equal(t, tt.wantOK, ok)
require.Contains(t, response, "response-body")
})
}
}
51 changes: 41 additions & 10 deletions test/e2e/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -648,21 +648,52 @@ func verifyEnterpriseWithPostgres(ctx context.Context, t *testing.T, env environ
require.Equal(t, 1, len(service.Status.LoadBalancer.Ingress))
adminIP := service.Status.LoadBalancer.Ingress[0].IP

t.Log("building a POST request to create a new kong workspace")
form := url.Values{"name": {"kic-e2e-tests"}}
req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("http://%s/workspaces", adminIP), strings.NewReader(form.Encode()))
require.NoError(t, err)
t.Log("creating a workspace to validate enterprise functionality")
workspaceName := fmt.Sprintf("kic-e2e-tests-%s", uuid.NewString())
adminURL := fmt.Sprintf("http://%s/workspaces", adminIP)
var lastResponse string
require.Eventually(t, func() bool {
success, response, err := createEnterpriseWorkspace(ctx, helpers.DefaultHTTPClient(), adminURL, adminPassword, workspaceName)
if err != nil {
lastResponse = err.Error()
return false
}
lastResponse = response
return success
}, adminAPIWait, time.Second, "failed creating enterprise workspace via admin API: %s", lastResponse)
}

func createEnterpriseWorkspace(
ctx context.Context,
client *http.Client,
adminURL, adminPassword, workspaceName string,
) (bool, string, error) {
form := url.Values{"name": {workspaceName}}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, adminURL, strings.NewReader(form.Encode()))
if err != nil {
return false, "", err
}
req.Header.Set("Kong-Admin-Token", adminPassword)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

t.Log("creating a workspace to validate enterprise functionality")

resp, err := helpers.DefaultHTTPClient().Do(req)
require.NoError(t, err)
resp, err := client.Do(req)
if err != nil {
return false, "", err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.Equal(t, http.StatusCreated, resp.StatusCode, fmt.Sprintf("STATUS=(%s), BODY=(%s)", resp.Status, string(body)))
if err != nil {
return false, "", err
}

response := fmt.Sprintf("STATUS=(%s), BODY=(%s)", resp.Status, string(body))
switch resp.StatusCode {
case http.StatusCreated, http.StatusConflict:
return true, response, nil
default:
return false, response, nil
}
}

// licenseOutput is the license section of the admin API root response.
Expand Down