diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/AdminConsoleRealm.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/AdminConsoleRealm.java
index 9d4e16c1b85..52768e53cc1 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/AdminConsoleRealm.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/AdminConsoleRealm.java
@@ -17,10 +17,14 @@
package org.keycloak.testsuite.console.page;
+import org.keycloak.testsuite.util.UIUtils;
import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
+import java.util.Optional;
+
import static org.keycloak.testsuite.auth.page.AuthRealm.TEST;
import static org.keycloak.testsuite.util.WaitUtils.waitUntilElement;
@@ -58,16 +62,14 @@ public class AdminConsoleRealm extends AdminConsoleRealmsRoot {
return configureMenu;
}
-// public RealmResource realmResource() {
-// return realmsResource().realm(getConsoleRealm());
-// }
-
public static class ConfigureMenu {
@FindBy(partialLinkText = "Realm Settings")
private WebElement realmSettingsLink;
@FindBy(partialLinkText = "Clients")
private WebElement clientsLink;
+ @FindBy(partialLinkText = "Client Scopes")
+ private WebElement clientScopesLink;
@FindBy(partialLinkText = "Roles")
private WebElement rolesLink;
@FindBy(partialLinkText = "Identity Providers")
@@ -78,29 +80,61 @@ public class AdminConsoleRealm extends AdminConsoleRealmsRoot {
private WebElement authenticationLink;
public void realmSettings() {
- realmSettingsLink.click();
+ navigateToTab(realmSettingsLink);
}
public void clients() {
- clientsLink.click();
+ navigateToTab(clientsLink);
+ }
+
+ public void clientScopesLink() {
+ navigateToTab(clientScopesLink);
}
public void roles() {
- rolesLink.click();
+ navigateToTab(rolesLink);
}
public void identityProviders() {
- identityProvidersLink.click();
+ navigateToTab(identityProvidersLink);
}
public void userFederation() {
- userFederationLink.click();
+ navigateToTab(userFederationLink);
}
public void authentication() {
- authenticationLink.click();
+ navigateToTab(authenticationLink);
}
+ // Elements
+ public WebElement getRealmSettingsTab() {
+ return realmSettingsLink;
+ }
+
+ public WebElement getClientsTab() {
+ return clientsLink;
+ }
+
+ public WebElement getClientScopesTab() {
+ return clientScopesLink;
+ }
+
+ public WebElement getRolesTab() {
+ return rolesLink;
+ }
+
+ public WebElement getUserFederationTab() {
+ return userFederationLink;
+ }
+
+ public WebElement getIdentityProvidersTab() {
+ return identityProvidersLink;
+ }
+
+ public WebElement getAuthenticationTab() {
+ return authenticationLink;
+ }
}
@FindBy(xpath = "//div[./h2[text()='Manage']]")
@@ -112,25 +146,83 @@ public class AdminConsoleRealm extends AdminConsoleRealmsRoot {
}
public static class ManageMenu {
-
+ @FindBy(partialLinkText = "Groups")
+ private WebElement groupsLink;
@FindBy(partialLinkText = "Users")
private WebElement usersLink;
@FindBy(partialLinkText = "Sessions")
private WebElement sessionsLink;
@FindBy(partialLinkText = "Events")
private WebElement eventsLink;
+ @FindBy(partialLinkText = "Import")
+ private WebElement importLink;
+ @FindBy(partialLinkText = "Export")
+ private WebElement exportLink;
+
+ public void groups() {
+ navigateToTab(groupsLink);
+ }
public void users() {
- usersLink.click();
+ navigateToTab(usersLink);
}
public void sessions() {
- sessionsLink.click();
+ navigateToTab(sessionsLink);
}
public void events() {
- eventsLink.click();
+ navigateToTab(eventsLink);
+ }
+
+ public void importTab() {
+ navigateToTab(importLink);
+ }
+
+ public void exportTab() {
+ navigateToTab(exportLink);
+ }
+
+ // Elements
+ public WebElement getGroupsTab() {
+ return groupsLink;
+ }
+
+ public WebElement getUsersTab() {
+ return groupsLink;
+ }
+
+ public WebElement getSessionsTab() {
+ return groupsLink;
+ }
+
+ public WebElement getEventsTab() {
+ return groupsLink;
+ }
+
+ public WebElement getImportTab() {
+ return groupsLink;
+ }
+
+ public WebElement getExportTab() {
+ return groupsLink;
}
}
+ public static void navigateToTab(WebElement tab) {
+ if (tab == null) return;
+ UIUtils.clickLink(tab);
+ }
+
+ public static boolean isTabActive(WebElement tab) {
+ try {
+ final WebElement parent = tab != null ? tab.findElement(By.xpath("./..")) : null;
+
+ return parent != null && Optional.ofNullable(parent.getAttribute("class"))
+ .map(f -> f.equals("active"))
+ .orElse(false);
+ } catch (NoSuchElementException e) {
+ return false;
+ }
+ }
}
diff --git a/testsuite/integration-arquillian/tests/other/console/src/main/java/org/keycloak/testsuite/console/page/realm/GeneralSettings.java b/testsuite/integration-arquillian/tests/other/console/src/main/java/org/keycloak/testsuite/console/page/realm/GeneralSettings.java
index 32387a59a83..edae41de39c 100644
--- a/testsuite/integration-arquillian/tests/other/console/src/main/java/org/keycloak/testsuite/console/page/realm/GeneralSettings.java
+++ b/testsuite/integration-arquillian/tests/other/console/src/main/java/org/keycloak/testsuite/console/page/realm/GeneralSettings.java
@@ -18,58 +18,56 @@
package org.keycloak.testsuite.console.page.realm;
+import org.keycloak.testsuite.page.Form;
+import org.keycloak.testsuite.util.UIUtils;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.Select;
/**
- *
* @author Petr Mensik
*/
-public class GeneralSettings extends RealmSettings {
+public class GeneralSettings extends Form {
@FindBy(id = "name")
private WebElement realmName;
-
+
@FindBy(id = "enabled")
private WebElement realmEnabled;
-
+
@FindBy(id = "updateProfileOnInitialSocialLogin")
private WebElement updateProfileOnInitialSocialLogin;
@FindBy(id = "loginTheme")
private Select loginThemeSelect;
-
+
@FindBy(id = "accountTheme")
private Select accountThemeSelect;
-
+
@FindBy(id = "adminTheme")
private Select adminThemeSelect;
-
+
@FindBy(id = "emailTheme")
private Select emailThemeSelect;
-
- @FindBy(className = "btn btn-primary btn-lg")
- private WebElement saveButton;
-
- public void saveSettings() {
- saveButton.click();
- }
-
+
public void selectLoginTheme(String theme) {
loginThemeSelect.selectByVisibleText(theme);
}
-
- public void selecAccountTheme(String theme) {
+
+ public void selectAccountTheme(String theme) {
accountThemeSelect.selectByVisibleText(theme);
}
-
+
public void selectAdminTheme(String theme) {
adminThemeSelect.selectByVisibleText(theme);
}
-
+
public void selectEmailTheme(String theme) {
emailThemeSelect.selectByVisibleText(theme);
}
+
+ public void setRealmName(String name) {
+ UIUtils.setTextInputValue(realmName, name);
+ }
}
diff --git a/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/other/ConsoleActiveMenuTest.java b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/other/ConsoleActiveMenuTest.java
new file mode 100644
index 00000000000..c8abe508611
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/other/ConsoleActiveMenuTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2021 Red Hat, Inc. and/or its affiliates
+ * and other contributors as indicated by the @author tags.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.keycloak.testsuite.console.other;
+
+import org.hamcrest.CoreMatchers;
+import org.jboss.arquillian.graphene.page.Page;
+import org.junit.Test;
+import org.keycloak.testsuite.console.AbstractConsoleTest;
+import org.keycloak.testsuite.console.page.AdminConsoleRealm;
+import org.keycloak.testsuite.console.page.realm.GeneralSettings;
+import org.openqa.selenium.WebElement;
+
+import java.util.function.Supplier;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.keycloak.testsuite.console.page.AdminConsoleRealm.isTabActive;
+import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad;
+
+/**
+ * @author Martin Bartos
+ */
+public class ConsoleActiveMenuTest extends AbstractConsoleTest {
+
+ @Page
+ GeneralSettings generalSettings;
+
+ @Test
+ public void clientsActive() {
+ checkActiveTab("client", () -> adminConsoleRealmPage.configure().getClientsTab());
+ }
+
+ @Test
+ public void clientScopesActive() {
+ checkActiveTab("client-scope", () -> adminConsoleRealmPage.configure().getClientScopesTab());
+ }
+
+ @Test
+ public void rolesActive() {
+ checkActiveTab("role", () -> adminConsoleRealmPage.configure().getRolesTab());
+ }
+
+ @Test
+ public void identityProvidersActive() {
+ checkActiveTab("identity-provider", () -> adminConsoleRealmPage.configure().getIdentityProvidersTab());
+ }
+
+ @Test
+ public void userFederationActive() {
+ checkActiveTab("user-storage", () -> adminConsoleRealmPage.configure().getUserFederationTab());
+ }
+
+ @Test
+ public void authenticationActive() {
+ checkActiveTab("authentication", () -> adminConsoleRealmPage.configure().getAuthenticationTab());
+ }
+
+ // Manage
+ @Test
+ public void groupsActive() {
+ checkActiveTab("group", () -> adminConsoleRealmPage.manage().getGroupsTab());
+ }
+
+ @Test
+ public void usersActive() {
+ checkActiveTab("user", () -> adminConsoleRealmPage.manage().getUsersTab());
+ }
+
+ private void checkActiveTab(String realmName, Supplier getElement) {
+ adminConsoleRealmPage.navigateTo();
+ adminConsoleRealmPage.assertCurrent();
+ adminConsoleRealmPage.configure().realmSettings();
+
+ generalSettings.setRealmName(realmName);
+ try {
+ generalSettings.save();
+ waitForPageToLoad();
+
+ final WebElement tab = getElement.get();
+ assertThat(isTabActive(tab), CoreMatchers.is(false));
+
+ AdminConsoleRealm.navigateToTab(tab);
+ waitForPageToLoad();
+ assertThat(isTabActive(getElement.get()), CoreMatchers.is(true));
+ } finally {
+ adminConsoleRealmPage.configure().realmSettings();
+ generalSettings.setRealmName("test");
+ generalSettings.save();
+ }
+ }
+}
diff --git a/themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js b/themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
index c10c12db6f6..8df1028b28e 100644
--- a/themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
+++ b/themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
@@ -187,6 +187,10 @@ module.controller('RealmDropdownCtrl', function($scope, Realm, Current, Auth, $l
// Current.realms = Realm.get();
$scope.current = Current;
+ $scope.isCreateEndpoint = function(endpoint) {
+ return $scope.path.length > 1 && $scope.path[0] === 'create' && $scope.path[1] === endpoint;
+ }
+
$scope.changeRealm = function(selectedRealm) {
$location.url("/realms/" + selectedRealm);
}
diff --git a/themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html b/themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html
index d2baf360ce1..4edc7684133 100755
--- a/themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html
+++ b/themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html
@@ -34,26 +34,26 @@
|| path[2] == 'keys-settings' || path[2] == 'smtp-settings' || path[2] == 'ldap-settings' || path[2] == 'auth-settings') && path[3] != 'clients') && 'active'">
{{:: 'realm-settings' | translate}}
- {{:: 'clients' | translate}}
- {{:: 'client-scopes' | translate}}
- {{:: 'roles' | translate}}
- {{:: 'identity-providers' | translate}}
+ {{:: 'clients' | translate}}
+ {{:: 'client-scopes' | translate}}
+ {{:: 'roles' | translate}}
+ {{:: 'identity-providers' | translate}}
{{:: 'user-federation' | translate}}
- {{:: 'authentication' | translate}}
+ {{:: 'authentication' | translate}}
{{:: 'manage' | translate}}