From e62611f757d53b7d3f4b4fe78113f24a57e5bc1e Mon Sep 17 00:00:00 2001 From: Hynek Mlnarik Date: Wed, 24 Jan 2024 13:02:09 +0100 Subject: [PATCH] Updated account console treatment Fixes: #528 Signed-off-by: Hynek Mlnarik --- ...llianActionTokenWithAuthenticatorTest.java | 27 ++++++++++++++++++- .../quickstart/ArquillianActionTokenTest.java | 26 +++++++++++++++++- .../quickstart/ArquillianJpaStorageTest.java | 26 +++++++++++++++++- .../ArquillianSimpleStorageTest.java | 26 +++++++++++++++++- .../keycloak/quickstart/page/ConsolePage.java | 13 ++++----- 5 files changed, 108 insertions(+), 10 deletions(-) diff --git a/extension/action-token-authenticator/src/test/java/org/keycloak/quickstart/ArquillianActionTokenWithAuthenticatorTest.java b/extension/action-token-authenticator/src/test/java/org/keycloak/quickstart/ArquillianActionTokenWithAuthenticatorTest.java index cd9b98ad9..b600f20c3 100644 --- a/extension/action-token-authenticator/src/test/java/org/keycloak/quickstart/ArquillianActionTokenWithAuthenticatorTest.java +++ b/extension/action-token-authenticator/src/test/java/org/keycloak/quickstart/ArquillianActionTokenWithAuthenticatorTest.java @@ -1,3 +1,4 @@ + /* * JBoss, Home of Professional Open Source * Copyright 2017, Red Hat, Inc. and/or its affiliates, and individual @@ -53,10 +54,13 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.time.Duration; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.support.ui.FluentWait; import static java.lang.String.format; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; @@ -69,6 +73,8 @@ import static org.keycloak.test.TestsHelper.deleteRealm; import static org.keycloak.test.TestsHelper.importTestRealm; import static org.keycloak.test.TestsHelper.keycloakBaseUrl; +import static org.openqa.selenium.support.ui.ExpectedConditions.not; +import static org.openqa.selenium.support.ui.ExpectedConditions.urlToBe; @RunWith(Arquillian.class) public class ArquillianActionTokenWithAuthenticatorTest { @@ -155,7 +161,26 @@ public void setup() { webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - navigateTo("/realms/" + REALM_QUICKSTART_ACTION_TOKEN + "/account/#/personal-info"); + navigateTo("/realms/" + REALM_QUICKSTART_ACTION_TOKEN + "/account/#/"); + waitForPageToLoad(); + } + + public void waitForPageToLoad() { + // Taken from org.keycloak.testsuite.util.WaitUtils + + String currentUrl = null; + + // Ensure the URL is "stable", i.e. is not changing anymore; if it'd changing, some redirects are probably still in progress + for (int maxRedirects = 4; maxRedirects > 0; maxRedirects--) { + currentUrl = webDriver.getCurrentUrl(); + FluentWait wait = new FluentWait<>(webDriver).withTimeout(Duration.ofMillis(250)); + try { + wait.until(not(urlToBe(currentUrl))); + } + catch (TimeoutException e) { + break; // URL has not changed recently - ok, the URL is stable and page is current + } + } } @Test diff --git a/extension/action-token-required-action/src/test/java/org/keycloak/quickstart/ArquillianActionTokenTest.java b/extension/action-token-required-action/src/test/java/org/keycloak/quickstart/ArquillianActionTokenTest.java index 734015313..fccd34c31 100644 --- a/extension/action-token-required-action/src/test/java/org/keycloak/quickstart/ArquillianActionTokenTest.java +++ b/extension/action-token-required-action/src/test/java/org/keycloak/quickstart/ArquillianActionTokenTest.java @@ -50,10 +50,13 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.time.Duration; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.support.ui.FluentWait; import static java.lang.String.format; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; @@ -66,6 +69,8 @@ import static org.keycloak.test.TestsHelper.deleteRealm; import static org.keycloak.test.TestsHelper.importTestRealm; import static org.keycloak.test.TestsHelper.keycloakBaseUrl; +import static org.openqa.selenium.support.ui.ExpectedConditions.not; +import static org.openqa.selenium.support.ui.ExpectedConditions.urlToBe; @RunWith(Arquillian.class) public class ArquillianActionTokenTest { @@ -141,7 +146,26 @@ public void setup() { webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - navigateTo("/realms/" + REALM_QUICKSTART_ACTION_TOKEN + "/account/#/personal-info"); + navigateTo("/realms/" + REALM_QUICKSTART_ACTION_TOKEN + "/account/#/"); + waitForPageToLoad(); + } + + public void waitForPageToLoad() { + // Taken from org.keycloak.testsuite.util.WaitUtils + + String currentUrl = null; + + // Ensure the URL is "stable", i.e. is not changing anymore; if it'd changing, some redirects are probably still in progress + for (int maxRedirects = 4; maxRedirects > 0; maxRedirects--) { + currentUrl = webDriver.getCurrentUrl(); + FluentWait wait = new FluentWait<>(webDriver).withTimeout(Duration.ofMillis(250)); + try { + wait.until(not(urlToBe(currentUrl))); + } + catch (TimeoutException e) { + break; // URL has not changed recently - ok, the URL is stable and page is current + } + } } @Test diff --git a/extension/user-storage-jpa/src/test/java/org/keycloak/quickstart/ArquillianJpaStorageTest.java b/extension/user-storage-jpa/src/test/java/org/keycloak/quickstart/ArquillianJpaStorageTest.java index 54754f7b0..e5f71865c 100644 --- a/extension/user-storage-jpa/src/test/java/org/keycloak/quickstart/ArquillianJpaStorageTest.java +++ b/extension/user-storage-jpa/src/test/java/org/keycloak/quickstart/ArquillianJpaStorageTest.java @@ -32,12 +32,17 @@ import org.keycloak.test.FluentTestsHelper; import org.keycloak.test.page.LoginPage; import org.keycloak.quickstart.storage.user.MyExampleUserStorageProviderFactory; +import java.time.Duration; import org.openqa.selenium.WebDriver; import java.util.concurrent.TimeUnit; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.support.ui.FluentWait; import static java.lang.String.format; import static org.junit.Assert.assertEquals; +import static org.openqa.selenium.support.ui.ExpectedConditions.not; +import static org.openqa.selenium.support.ui.ExpectedConditions.urlToBe; @RunWith(Arquillian.class) public class ArquillianJpaStorageTest { @@ -117,7 +122,26 @@ private String addProvider() { } private void navigateToAccount(String user, String password) { - navigateTo(format("/realms/%s/account/#/personal-info", testsHelper.getTestRealmName())); + navigateTo(format("/realms/%s/account/#/", testsHelper.getTestRealmName())); + waitForPageToLoad(); loginPage.login(user, password); } + + public void waitForPageToLoad() { + // Taken from org.keycloak.testsuite.util.WaitUtils + + String currentUrl = null; + + // Ensure the URL is "stable", i.e. is not changing anymore; if it'd changing, some redirects are probably still in progress + for (int maxRedirects = 4; maxRedirects > 0; maxRedirects--) { + currentUrl = webDriver.getCurrentUrl(); + FluentWait wait = new FluentWait<>(webDriver).withTimeout(Duration.ofMillis(250)); + try { + wait.until(not(urlToBe(currentUrl))); + } + catch (TimeoutException e) { + break; // URL has not changed recently - ok, the URL is stable and page is current + } + } + } } diff --git a/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/ArquillianSimpleStorageTest.java b/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/ArquillianSimpleStorageTest.java index 5e21ec9d3..8dc92f148 100644 --- a/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/ArquillianSimpleStorageTest.java +++ b/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/ArquillianSimpleStorageTest.java @@ -36,15 +36,20 @@ import org.openqa.selenium.WebDriver; import java.io.IOException; +import java.time.Duration; import java.util.List; import java.util.concurrent.TimeUnit; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.support.ui.FluentWait; import static java.lang.String.format; import static org.junit.Assert.assertEquals; import static org.keycloak.quickstart.util.StorageManager.addUser; import static org.keycloak.quickstart.util.StorageManager.createStorage; import static org.keycloak.quickstart.util.StorageManager.deleteStorage; import static org.keycloak.quickstart.util.StorageManager.getPropertyFile; +import static org.openqa.selenium.support.ui.ExpectedConditions.not; +import static org.openqa.selenium.support.ui.ExpectedConditions.urlToBe; @RunWith(Arquillian.class) @@ -153,7 +158,26 @@ private void addProvider(String providerId) { } private void navigateToAccount(String user, String password) { - navigateTo(format("/realms/%s/account/#/personal-info", testsHelper.getTestRealmName())); + navigateTo(format("/realms/%s/account/#/", testsHelper.getTestRealmName())); + waitForPageToLoad(); loginPage.login(user, password); } + + public void waitForPageToLoad() { + // Taken from org.keycloak.testsuite.util.WaitUtils + + String currentUrl = null; + + // Ensure the URL is "stable", i.e. is not changing anymore; if it'd changing, some redirects are probably still in progress + for (int maxRedirects = 4; maxRedirects > 0; maxRedirects--) { + currentUrl = webDriver.getCurrentUrl(); + FluentWait wait = new FluentWait<>(webDriver).withTimeout(Duration.ofMillis(250)); + try { + wait.until(not(urlToBe(currentUrl))); + } + catch (TimeoutException e) { + break; // URL has not changed recently - ok, the URL is stable and page is current + } + } + } } \ No newline at end of file diff --git a/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/page/ConsolePage.java b/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/page/ConsolePage.java index d8e9a54aa..dd52689f6 100644 --- a/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/page/ConsolePage.java +++ b/extension/user-storage-simple/src/test/java/org/keycloak/quickstart/page/ConsolePage.java @@ -10,19 +10,20 @@ */ public class ConsolePage { - @FindBy(id = "user-name") - private WebElement username; - - @FindBy(id = "signOutButton") + @FindBy(xpath = "//a[text() = 'Sign out']") private WebElement logoutLink; + @FindBy(xpath = "//div[@data-testid='options']") + private WebElement profileMenu; + public void logout() { + profileMenu.click(); logoutLink.click(); } public String getUser() { - waitAjax().until().element(username).value().not().equalTo(""); - return username.getAttribute("value"); + waitAjax().until().element(profileMenu).text().not().equalTo(""); + return profileMenu.getText(); } }