From 24cfd61ae58dac22b7b8dd12643bc9ab5674975d Mon Sep 17 00:00:00 2001 From: Rafaela Soares Date: Wed, 25 Mar 2026 17:20:12 +0000 Subject: [PATCH 1/4] test: adapt ui e2e tests to prod environment --- deploy/devsandbox-dashboard/ui-e2e-tests/.env | 5 +- make/devsandbox-dashboard.mk | 33 ++++++++- .../devsandbox-dashboard/fresh_signup_test.go | 69 ++++++++++++++----- testsupport/devsandbox-dashboard/login.go | 16 ++--- testsupport/devsandbox-dashboard/popup.go | 2 + testsupport/devsandbox-dashboard/setup.go | 13 ++-- testsupport/devsandbox-dashboard/trace.go | 55 ++++++++++++--- .../devsandbox-dashboard/usersignup.go | 67 +++++++++++++++++- 8 files changed, 215 insertions(+), 45 deletions(-) diff --git a/deploy/devsandbox-dashboard/ui-e2e-tests/.env b/deploy/devsandbox-dashboard/ui-e2e-tests/.env index d9851dd28..69abb813d 100644 --- a/deploy/devsandbox-dashboard/ui-e2e-tests/.env +++ b/deploy/devsandbox-dashboard/ui-e2e-tests/.env @@ -1,5 +1,6 @@ SSO_USERNAME=${SSO_USERNAME} SSO_PASSWORD=${SSO_PASSWORD} BASE_URL=${BASE_URL} -ENVIRONMENT=ui-e2e-tests -BROWSER=${BROWSER} \ No newline at end of file +ENVIRONMENT=${ENVIRONMENT} +BROWSER=${BROWSER} +KUBECONFIG=${KUBECONFIG} \ No newline at end of file diff --git a/make/devsandbox-dashboard.mk b/make/devsandbox-dashboard.mk index 26df499f3..9168c2b0e 100644 --- a/make/devsandbox-dashboard.mk +++ b/make/devsandbox-dashboard.mk @@ -41,8 +41,8 @@ e2e-run-devsandbox-dashboard: @echo "Running Developer Sandbox Dashboard setup e2e tests..." DEVSANDBOX_DASHBOARD_NS=${DEVSANDBOX_DASHBOARD_NS} go test "./test/e2e/devsandbox-dashboard/setup" -v -timeout=10m -failfast - @echo "Running Developer Sandbox Dashboard e2e tests in firefox..." - @SSO_USERNAME=$(SSO_USERNAME_READ) SSO_PASSWORD=$(SSO_PASSWORD_READ) BASE_URL=${RHDH} BROWSER=firefox envsubst < deploy/devsandbox-dashboard/ui-e2e-tests/.env > testsupport/devsandbox-dashboard/.env + @echo "Running Developer Sandbox Dashboard e2e tests in Firefox..." + @SSO_USERNAME=$(SSO_USERNAME_READ) SSO_PASSWORD=$(SSO_PASSWORD_READ) BASE_URL=${RHDH} BROWSER=firefox ENVIRONMENT=${UI_ENVIRONMENT} envsubst < deploy/devsandbox-dashboard/ui-e2e-tests/.env > testsupport/devsandbox-dashboard/.env @HOST_NS=$(HOST_NS) MEMBER_NS=$(MEMBER_NS) MEMBER_NS_2=$(MEMBER_NS_2) REGISTRATION_SERVICE_NS=$(HOST_NS) SECOND_MEMBER_MODE=$(SECOND_MEMBER) go test "./test/e2e/devsandbox-dashboard" -v -timeout=10m -failfast @echo "The Developer Sandbox Dashboard e2e tests successfully finished" @@ -99,3 +99,32 @@ endif -e PUBLISH_UI=false \ -e RUNNING_IN_CONTAINER=true \ $(E2E_TEST_IMAGE_NAME) make test-devsandbox-dashboard-e2e + +# Run Developer Sandbox Dashboard e2e tests against prod +.PHONY: test-devsandbox-dashboard-e2e-prod +test-devsandbox-dashboard-e2e-prod: ksctl + @echo "Installing Firefox browser for Playwright..." + go tool playwright install firefox + + @echo "Running Developer Sandbox Dashboard e2e tests in Firefox..." + @SSO_USERNAME=${SSO_USERNAME_READ} SSO_PASSWORD=${SSO_PASSWORD_READ} BASE_URL=https://sandbox.redhat.com/ BROWSER=firefox ENVIRONMENT=prod KUBECONFIG=${KUBECONFIG} envsubst < deploy/devsandbox-dashboard/ui-e2e-tests/.env > testsupport/devsandbox-dashboard/.env + @go test "./test/e2e/devsandbox-dashboard" -v -timeout=10m -failfast + + @echo "The Developer Sandbox Dashboard e2e tests successfully finished" + + +# Run Developer Sandbox Dashboard e2e tests against prod in container using podman +.PHONY: test-devsandbox-dashboard-in-container-prod +test-devsandbox-dashboard-in-container-prod: build-devsandbox-dashboard-e2e-tests + @rm -f build/_output/bin/ksctl + @echo "running the prod e2e tests in podman container..." + podman run --platform $(IMAGE_PLATFORM) --rm \ + -v $(KUBECONFIG):/root/.kube/config \ + -e KUBECONFIG=/root/.kube/config \ + -v ${PWD}:/root/toolchain-e2e \ + -e E2E_REPO_PATH=/root/toolchain-e2e \ + -e SSO_USERNAME=$(SSO_USERNAME) \ + -e SSO_PASSWORD=$(SSO_PASSWORD) \ + -e RUNNING_IN_CONTAINER=true \ + -e PATH=/app/build/_output/bin:$$PATH \ + $(E2E_TEST_IMAGE_NAME) make test-devsandbox-dashboard-e2e-prod \ No newline at end of file diff --git a/test/e2e/devsandbox-dashboard/fresh_signup_test.go b/test/e2e/devsandbox-dashboard/fresh_signup_test.go index 29def9d13..84761a0c8 100644 --- a/test/e2e/devsandbox-dashboard/fresh_signup_test.go +++ b/test/e2e/devsandbox-dashboard/fresh_signup_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "regexp" + "strings" "testing" "github.com/codeready-toolchain/toolchain-e2e/testsupport" @@ -52,6 +53,12 @@ func ensureNoUserSignup(t *testing.T, env, username string) { err := sandboxui.DeleteUserSignup(t, hostAwait, userSignup) require.NoError(t, err) } + } else if env == sandboxui.ProdEnv { + userSignup := sandboxui.GetUserSignupThroughKsctl(t, username) + if userSignup != nil { + // delete user signup + sandboxui.DeleteUserSignupThroughKsctl(t, username) + } } } @@ -132,10 +139,18 @@ func performSignup(t *testing.T, page playwright.Page, env, username string) { userSignup, err := sandboxui.WaitForUserSignup(t, hostAwait, username) require.NoError(t, err) cleanup.AddCleanTasks(t, hostAwait.Client, userSignup) + } else if env == sandboxui.ProdEnv { + // delete user signup through ksctl + t.Cleanup(func() { + sandboxui.DeleteUserSignupThroughKsctl(t, username) + }) } // wait for loading icon to disappear - err = loadingIcon.WaitFor(playwright.LocatorWaitForOptions{State: playwright.WaitForSelectorStateHidden}) + err = loadingIcon.WaitFor(playwright.LocatorWaitForOptions{ + State: playwright.WaitForSelectorStateHidden, + Timeout: playwright.Float(60000), // 1 minute timeout + }) require.NoError(t, err) // wait for network to be idle (ensures all updates are complete) @@ -187,23 +202,45 @@ func verifyDevSandboxAccess(t *testing.T, page playwright.Page, env, testName st devSandboxPage, err := sandboxui.ClickAndWaitForPopup(t, page, tryItBtn, testName) require.NoError(t, err) - img := devSandboxPage.GetByRole("img", playwright.PageGetByRoleOptions{ - Name: imgName, - }) - err = img.WaitFor(playwright.LocatorWaitForOptions{ - Timeout: playwright.Float(30000), - }) - require.NoError(t, err) + if env == sandboxui.ProdEnv { + // Wait for auth redirect to complete + if strings.Contains(devSandboxPage.URL(), "/oauth/authorize") { + err := devSandboxPage.WaitForURL("**/k8s/cluster/projects/**", playwright.PageWaitForURLOptions{ + Timeout: playwright.Float(30000), + }) + require.NoError(t, err) + } - h := devSandboxPage.GetByRole("heading", playwright.PageGetByRoleOptions{}) - hText, err := h.TextContent() - require.NoError(t, err) - require.Contains(t, hText, logMessage) + // Wait for modal + modal := devSandboxPage.Locator("[data-test='guided-tour-modal']") + err = modal.WaitFor(playwright.LocatorWaitForOptions{ + State: playwright.WaitForSelectorStateVisible, + Timeout: playwright.Float(180000), // 3 minutes + }) + require.NoError(t, err) - list := devSandboxPage.GetByRole("list", playwright.PageGetByRoleOptions{}) - listText, err := list.TextContent() - require.NoError(t, err) - require.Contains(t, listText, "DevSandbox") + modalText, err := modal.TextContent() + require.NoError(t, err) + require.Contains(t, modalText, "Welcome to the new OpenShift experience!") + } else { + img := devSandboxPage.GetByRole("img", playwright.PageGetByRoleOptions{ + Name: imgName, + }) + err = img.WaitFor(playwright.LocatorWaitForOptions{ + Timeout: playwright.Float(30000), + }) + require.NoError(t, err) + + h := devSandboxPage.GetByRole("heading", playwright.PageGetByRoleOptions{}) + hText, err := h.TextContent() + require.NoError(t, err) + require.Contains(t, hText, logMessage) + + list := devSandboxPage.GetByRole("list", playwright.PageGetByRoleOptions{}) + listText, err := list.TextContent() + require.NoError(t, err) + require.Contains(t, listText, "DevSandbox") + } require.NoError(t, devSandboxPage.Close()) } diff --git a/testsupport/devsandbox-dashboard/login.go b/testsupport/devsandbox-dashboard/login.go index bc349258f..a69314d85 100644 --- a/testsupport/devsandbox-dashboard/login.go +++ b/testsupport/devsandbox-dashboard/login.go @@ -26,7 +26,7 @@ func NewLoginPage(page playwright.Page, environment string) *LoginPage { } switch environment { - case DevEnv: + case DevEnv, ProdEnv: lp.LoginUsernameLoc = page.GetByRole("textbox", playwright.PageGetByRoleOptions{ Name: "Red Hat login", }) @@ -59,19 +59,19 @@ func NewLoginPage(page playwright.Page, environment string) *LoginPage { } func (lp *LoginPage) Navigate(t *testing.T, url string) { - _, err := lp.Page.Goto(url) + maskUsername(t, lp.Page) + + _, err := lp.Page.Goto(url, playwright.PageGotoOptions{ + Timeout: playwright.Float(60000), // 1 minute timeout + }) require.NoError(t, err) } func (lp *LoginPage) Login(t *testing.T, loginUsername, loginPw string) { - // Mask username field - _, err := lp.LoginUsernameLoc.Evaluate(`element => element.style.webkitTextSecurity = 'disc'`, nil) - require.NoError(t, err) - - err = lp.LoginUsernameLoc.Fill(loginUsername) + err := lp.LoginUsernameLoc.Fill(loginUsername) require.NoError(t, err) - if lp.Env == DevEnv { + if lp.Env == DevEnv || lp.Env == ProdEnv { err := lp.NextBtn.Click() require.NoError(t, err) } diff --git a/testsupport/devsandbox-dashboard/popup.go b/testsupport/devsandbox-dashboard/popup.go index bdf052f54..4f4b21912 100644 --- a/testsupport/devsandbox-dashboard/popup.go +++ b/testsupport/devsandbox-dashboard/popup.go @@ -16,6 +16,8 @@ func ClickAndWaitForPopup(t *testing.T, currentPage playwright.Page, locator pla var popup playwright.Page var err error + maskUsername(t, currentPage) + pollErr := wait.PollUntilContextTimeout(context.TODO(), time.Millisecond, 1*time.Minute, true, func(ctx context.Context) (bool, error) { popup, err = currentPage.ExpectPopup(func() error { return locator.Click() diff --git a/testsupport/devsandbox-dashboard/setup.go b/testsupport/devsandbox-dashboard/setup.go index 0ee25709b..d067e7e12 100644 --- a/testsupport/devsandbox-dashboard/setup.go +++ b/testsupport/devsandbox-dashboard/setup.go @@ -2,6 +2,7 @@ package sandboxui import ( "fmt" + "os" "path/filepath" "runtime" "sync" @@ -15,6 +16,7 @@ import ( const ( TestEnv = "ui-e2e-tests" DevEnv = "dev" + ProdEnv = "prod" ) var ( @@ -62,8 +64,11 @@ func Setup(t *testing.T, testName string) playwright.Page { context, err := browser.NewContext(opts) require.NoError(t, err) - // save trace - trace(t, context, testName) + // save trace only if not running in CI + // we do not want to expose sensitive information in CI + if artifactDir := os.Getenv("ARTIFACT_DIR"); artifactDir == "" { // not CI environment + trace(t, context, testName) + } page, err := context.NewPage() require.NoError(t, err) @@ -73,9 +78,9 @@ func Setup(t *testing.T, testName string) playwright.Page { login := NewLoginPage(page, env) login.Navigate(t, baseURL) - if env == DevEnv { + if env == DevEnv || env == ProdEnv { // handle cookie consent - // on dev environment, the cookie consent appears after the login page is loaded + // on dev and prod environments, the cookie consent appears after the login page is loaded handleCookiesConsent(t, page) } diff --git a/testsupport/devsandbox-dashboard/trace.go b/testsupport/devsandbox-dashboard/trace.go index 0c376f6e5..40a3f4b02 100644 --- a/testsupport/devsandbox-dashboard/trace.go +++ b/testsupport/devsandbox-dashboard/trace.go @@ -68,17 +68,8 @@ func handleRecordedVideo(t *testing.T, page playwright.Page, targetVideoPath str // Handle failed test - rename video if t.Failed() { - // For popup videos, rename with UUID to avoid conflicts when multiple popups exist in the same test - if strings.Contains(targetVideoPath, "popup") { - uuid := filepath.Base(videoPath) - uuid = strings.TrimSuffix(uuid, ".webm") - if len(uuid) > 8 { - uuid = uuid[:8] // Truncate to first 8 chars - } - targetVideoPath = strings.Replace(targetVideoPath, "popup", fmt.Sprintf("popup-%s", uuid), 1) - } - - if err := os.Rename(videoPath, targetVideoPath); err != nil { + finalPath := buildPopupVideoPath(targetVideoPath, videoPath) + if err := os.Rename(videoPath, finalPath); err != nil { t.Logf("failed to rename video %s: %v", videoPath, err) } return @@ -90,3 +81,45 @@ func handleRecordedVideo(t *testing.T, page playwright.Page, targetVideoPath str } }) } + +func buildPopupVideoPath(targetPath, videoPath string) string { + if !strings.Contains(targetPath, "popup") { + return targetPath + } + uuid := filepath.Base(videoPath) + uuid = strings.TrimSuffix(uuid, ".webm") + if len(uuid) > 8 { + uuid = uuid[:8] + } + return strings.Replace(targetPath, "popup", fmt.Sprintf("popup-%s", uuid), 1) +} + +func maskUsername(t *testing.T, page playwright.Page) { + err := page.Context().AddInitScript(playwright.Script{ + Content: playwright.String(` + const applyBlur = () => { + document.querySelectorAll('input[name="username"], span.co-username, span[data-test="username"], [data-test="username"]').forEach(el => { + el.style.filter = 'blur(5px)'; + el.style.userSelect = 'none'; + }); + }; + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + applyBlur(); + new MutationObserver(applyBlur).observe(document.documentElement, { + childList: true, + subtree: true + }); + }); + } else { + applyBlur(); + new MutationObserver(applyBlur).observe(document.documentElement, { + childList: true, + subtree: true + }); + } + `), + }) + require.NoError(t, err) +} diff --git a/testsupport/devsandbox-dashboard/usersignup.go b/testsupport/devsandbox-dashboard/usersignup.go index 1a8f89d45..0498ef3c6 100644 --- a/testsupport/devsandbox-dashboard/usersignup.go +++ b/testsupport/devsandbox-dashboard/usersignup.go @@ -2,12 +2,18 @@ package sandboxui import ( "context" + "os/exec" + "strings" "testing" "time" toolchainv1alpha1 "github.com/codeready-toolchain/api/api/v1alpha1" "github.com/codeready-toolchain/toolchain-e2e/testsupport/wait" + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" "k8s.io/apimachinery/pkg/api/errors" + k8swait "k8s.io/apimachinery/pkg/util/wait" ) // WaitForUserSignup retrieves the UserSignup for the configured SSO username @@ -22,7 +28,7 @@ func WaitForUserSignup(t *testing.T, hostAwait *wait.HostAwaitility, username st func DeleteUserSignup(t *testing.T, hostAwait *wait.HostAwaitility, userSignup *toolchainv1alpha1.UserSignup) error { username := userSignup.Name - t.Logf("Deleting UserSignup %s", username) + t.Log("Deleting UserSignup") if err := hostAwait.Client.Delete(context.TODO(), userSignup); err != nil { if !errors.IsNotFound(err) { @@ -31,6 +37,63 @@ func DeleteUserSignup(t *testing.T, hostAwait *wait.HostAwaitility, userSignup * } // Wait until deletion is complete - t.Logf("Waiting until UserSignup %s is completely deleted", username) + t.Log("Waiting until UserSignup is completely deleted") return hostAwait.WaitUntilUserSignupDeleted(t, username) } + +func GetUserSignupThroughKsctl(t *testing.T, username string) *toolchainv1alpha1.UserSignup { + t.Logf("Getting UserSignup through ksctl") + + // #nosec G204 -- username is from test config, not user input + cmd := exec.Command("ksctl", "get", "usersignup", username, "--config", viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") + output, err := cmd.CombinedOutput() + if err != nil { + // Check if it's a not found error + if strings.Contains(string(output), "Error from server (NotFound)") { + return nil + } + } + require.NoError(t, err) + + // parse the output as a UserSignup + userSignup := &toolchainv1alpha1.UserSignup{} + err = yaml.Unmarshal(output, userSignup) + require.NoError(t, err) + + return userSignup +} + +func DeleteUserSignupThroughKsctl(t *testing.T, username string) { + t.Log("Deleting UserSignup through ksctl") + + // #nosec G204 -- username is from test config, not user input + cmd := exec.Command("ksctl", "gdpr-delete", username, "--config", viper.GetString("KUBECONFIG")) + cmd.Stdin = strings.NewReader("y\n") // confirm deletion + output, err := cmd.CombinedOutput() + require.NoError(t, err) + require.Contains(t, string(output), "The deletion of the UserSignup has been triggered") + + // Wait until UserSignup is actually deleted + t.Log("Waiting for UserSignup to be completely deleted") + err = k8swait.PollUntilContextTimeout(context.TODO(), time.Second, 2*time.Minute, true, + func(ctx context.Context) (done bool, err error) { + // #nosec G204 -- username is from test config, not user input + cmd := exec.Command("ksctl", "get", "usersignup", username, "--config", viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") + output, err := cmd.CombinedOutput() + if err != nil { + // Check if error is because it's not found + if strings.Contains(string(output), "not found") || strings.Contains(err.Error(), "not found") { + t.Log("UserSignup successfully deleted") + return true, nil + } + // Some other error, keep trying + t.Log("Error checking UserSignup deletion") + return false, nil + } + // Still exists + return false, nil + }) + require.NoError(t, err, "UserSignup was not deleted within timeout") + + t.Log("UserSignup deleted and confirmed through ksctl") +} From d9169108d19a1bb1f43ccc5a0cfe36882f472bb1 Mon Sep 17 00:00:00 2001 From: Rafaela Soares Date: Wed, 25 Mar 2026 17:22:31 +0000 Subject: [PATCH 2/4] doc --- test/e2e/devsandbox-dashboard/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/e2e/devsandbox-dashboard/README.md b/test/e2e/devsandbox-dashboard/README.md index 12353906e..89a4ce93d 100644 --- a/test/e2e/devsandbox-dashboard/README.md +++ b/test/e2e/devsandbox-dashboard/README.md @@ -29,6 +29,10 @@ If you want to use your local devsandbox-dashboard, please: 1. Set the `QUAY_NAMESPACE` environment variable to your quay username: `export QUAY_NAMESPACE=` 2. Run `make test-devsandbox-dashboard-in-container SSO_USERNAME= SSO_PASSWORD= UI_REPO_PATH=${PWD}/../devsandbox-dashboard` +## Deploy Developer Sandbox Dashboard in Prod + +`make test-devsandbox-dashboard-e2e-prod SSO_USERNAME=${SSO_USERNAME} SSO_PASSWORD=${SSO_PASSWORD} KUBECONFIG=${KUBECONFIG}` + ## Deploy Developer Sandbox Dashboard in E2E mode Please note that OCP cluster does not have a valid CA, so when accessing the Developer Sandbox Dashboard, you need to: From 90600a08d2129a4284f08621db6862aa3b69266e Mon Sep 17 00:00:00 2001 From: Rafaela Soares Date: Wed, 25 Mar 2026 17:27:36 +0000 Subject: [PATCH 3/4] doc improvement --- test/e2e/devsandbox-dashboard/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/e2e/devsandbox-dashboard/README.md b/test/e2e/devsandbox-dashboard/README.md index 89a4ce93d..a43f3b012 100644 --- a/test/e2e/devsandbox-dashboard/README.md +++ b/test/e2e/devsandbox-dashboard/README.md @@ -33,6 +33,9 @@ If you want to use your local devsandbox-dashboard, please: `make test-devsandbox-dashboard-e2e-prod SSO_USERNAME=${SSO_USERNAME} SSO_PASSWORD=${SSO_PASSWORD} KUBECONFIG=${KUBECONFIG}` +The Developer Sandbox Dashboard E2E tests will run against the production environment at `https://sandbox.redhat.com/`. Note that this requires `ksctl` to manage usersignups in production. + + ## Deploy Developer Sandbox Dashboard in E2E mode Please note that OCP cluster does not have a valid CA, so when accessing the Developer Sandbox Dashboard, you need to: From b7acc0ffa1bb5d344066585d4f17078c4082bed5 Mon Sep 17 00:00:00 2001 From: Rafaela Soares Date: Wed, 25 Mar 2026 17:39:50 +0000 Subject: [PATCH 4/4] improvements --- test/e2e/devsandbox-dashboard/fresh_signup_test.go | 10 ++++++---- testsupport/devsandbox-dashboard/setup.go | 2 +- testsupport/devsandbox-dashboard/usersignup.go | 12 ++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/test/e2e/devsandbox-dashboard/fresh_signup_test.go b/test/e2e/devsandbox-dashboard/fresh_signup_test.go index 84761a0c8..bf214336b 100644 --- a/test/e2e/devsandbox-dashboard/fresh_signup_test.go +++ b/test/e2e/devsandbox-dashboard/fresh_signup_test.go @@ -41,7 +41,8 @@ func TestFreshSignup(t *testing.T) { } func ensureNoUserSignup(t *testing.T, env, username string) { - if env == sandboxui.TestEnv { + switch env { + case sandboxui.TestEnv: awaitilities := testsupport.WaitForDeployments(t) hostAwait := awaitilities.Host() userSignup, err := sandboxui.WaitForUserSignup(t, hostAwait, username) @@ -53,7 +54,7 @@ func ensureNoUserSignup(t *testing.T, env, username string) { err := sandboxui.DeleteUserSignup(t, hostAwait, userSignup) require.NoError(t, err) } - } else if env == sandboxui.ProdEnv { + case sandboxui.ProdEnv: userSignup := sandboxui.GetUserSignupThroughKsctl(t, username) if userSignup != nil { // delete user signup @@ -132,14 +133,15 @@ func performSignup(t *testing.T, page playwright.Page, env, username string) { err = tryItButton.Click() require.NoError(t, err) - if env == sandboxui.TestEnv { + switch env { + case sandboxui.TestEnv: // add signup to cleanup awaitilities := testsupport.WaitForDeployments(t) hostAwait := awaitilities.Host() userSignup, err := sandboxui.WaitForUserSignup(t, hostAwait, username) require.NoError(t, err) cleanup.AddCleanTasks(t, hostAwait.Client, userSignup) - } else if env == sandboxui.ProdEnv { + case sandboxui.ProdEnv: // delete user signup through ksctl t.Cleanup(func() { sandboxui.DeleteUserSignupThroughKsctl(t, username) diff --git a/testsupport/devsandbox-dashboard/setup.go b/testsupport/devsandbox-dashboard/setup.go index d067e7e12..b14be5f07 100644 --- a/testsupport/devsandbox-dashboard/setup.go +++ b/testsupport/devsandbox-dashboard/setup.go @@ -66,7 +66,7 @@ func Setup(t *testing.T, testName string) playwright.Page { // save trace only if not running in CI // we do not want to expose sensitive information in CI - if artifactDir := os.Getenv("ARTIFACT_DIR"); artifactDir == "" { // not CI environment + if os.Getenv("ARTIFACT_DIR") == "" { // not CI environment trace(t, context, testName) } diff --git a/testsupport/devsandbox-dashboard/usersignup.go b/testsupport/devsandbox-dashboard/usersignup.go index 0498ef3c6..0507b58f5 100644 --- a/testsupport/devsandbox-dashboard/usersignup.go +++ b/testsupport/devsandbox-dashboard/usersignup.go @@ -16,6 +16,10 @@ import ( k8swait "k8s.io/apimachinery/pkg/util/wait" ) +const ( + configFlag = "--config" +) + // WaitForUserSignup retrieves the UserSignup for the configured SSO username func WaitForUserSignup(t *testing.T, hostAwait *wait.HostAwaitility, username string) (*toolchainv1alpha1.UserSignup, error) { return hostAwait.WithRetryOptions(wait.TimeoutOption(time.Minute*2)).WaitForUserSignup(t, username, @@ -45,7 +49,7 @@ func GetUserSignupThroughKsctl(t *testing.T, username string) *toolchainv1alpha1 t.Logf("Getting UserSignup through ksctl") // #nosec G204 -- username is from test config, not user input - cmd := exec.Command("ksctl", "get", "usersignup", username, "--config", viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") + cmd := exec.Command("ksctl", "get", "usersignup", username, configFlag, viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") output, err := cmd.CombinedOutput() if err != nil { // Check if it's a not found error @@ -67,7 +71,7 @@ func DeleteUserSignupThroughKsctl(t *testing.T, username string) { t.Log("Deleting UserSignup through ksctl") // #nosec G204 -- username is from test config, not user input - cmd := exec.Command("ksctl", "gdpr-delete", username, "--config", viper.GetString("KUBECONFIG")) + cmd := exec.Command("ksctl", "gdpr-delete", username, configFlag, viper.GetString("KUBECONFIG")) cmd.Stdin = strings.NewReader("y\n") // confirm deletion output, err := cmd.CombinedOutput() require.NoError(t, err) @@ -78,10 +82,10 @@ func DeleteUserSignupThroughKsctl(t *testing.T, username string) { err = k8swait.PollUntilContextTimeout(context.TODO(), time.Second, 2*time.Minute, true, func(ctx context.Context) (done bool, err error) { // #nosec G204 -- username is from test config, not user input - cmd := exec.Command("ksctl", "get", "usersignup", username, "--config", viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") + cmd := exec.Command("ksctl", "get", "usersignup", username, configFlag, viper.GetString("KUBECONFIG"), "-t", "host", "-o", "yaml") output, err := cmd.CombinedOutput() if err != nil { - // Check if error is because it's not found + // Check if it's a not found error if strings.Contains(string(output), "not found") || strings.Contains(err.Error(), "not found") { t.Log("UserSignup successfully deleted") return true, nil