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}}