diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRole.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRole.java deleted file mode 100644 index 4abdb67d44..0000000000 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRole.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.keycloak.testsuite.console.page.clients; - -import org.keycloak.testsuite.console.page.roles.*; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.FindBy; - -/** - * - * @author tkyjovsk - */ -public class ClientRole extends ClientRoles { - - public static final String ROLE_ID = "roleId"; - - @FindBy(xpath = "//i[contains(@class, 'delete')]") - private WebElement deleteIcon; - - @Override - public String getUriFragment() { - return super.getUriFragment() + "/{" + ROLE_ID + "}"; - } - - public void setRoleId(String id) { - setUriParameter(ROLE_ID, id); - } - - public String getRoleId() { - return getUriParameter(ROLE_ID).toString(); - } - - private RoleForm form; - - public RoleForm form() { - return form; - } - - public void backToClientRolesViaBreadcrumb() { - breadcrumb().clickItemOneLevelUp(); - } - - @Override - public void delete() { - deleteIcon.click(); - modalDialog.confirmDeletion(); - } - -} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRoles.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRoles.java deleted file mode 100644 index a8ee969bbf..0000000000 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientRoles.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.keycloak.testsuite.console.page.clients; - -import org.keycloak.admin.client.resource.RolesResource; -import org.keycloak.testsuite.console.page.roles.RolesTable; -import org.openqa.selenium.support.FindBy; - -/** - * - * @author tkyjovsk - */ -public class ClientRoles extends Client { - - @Override - public String getUriFragment() { - return super.getUriFragment() + "/roles"; - } - - @FindBy(css = "table[class*='table']") - private RolesTable table; - - public RolesTable roles() { - return table; - } - - public RolesResource rolesResource() { - return clientResource().roles(); - } - -} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMapper.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMapper.java new file mode 100644 index 0000000000..35df86663f --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMapper.java @@ -0,0 +1,63 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.page.clients.mappers; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +/** + * + * @author Vlastislav Ramik + */ +public class ClientMapper extends ClientMappers { + + public static final String MAPPER_ID = "mapperId"; + + @FindBy(xpath = "//i[contains(@class, 'delete')]") + private WebElement deleteIcon; + + @FindBy(tagName = "form") + private MapperSettingsForm form; + + @Override + public String getUriFragment() { + return super.getUriFragment() + "/{" + MAPPER_ID + "}"; + } + + public void setMapperId(String id) { + setUriParameter(MAPPER_ID, id); + } + + public String getMapperId() { + return getUriParameter(MAPPER_ID).toString(); + } + + @Override + public void delete() { + deleteIcon.click(); + modalDialog.confirmDeletion(); + } + + public MapperSettingsForm form() { + return form; + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientMappers.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMappers.java similarity index 86% rename from testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientMappers.java rename to testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMappers.java index 10fb7e5f89..21ae9f53d8 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/ClientMappers.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/ClientMappers.java @@ -1,4 +1,4 @@ -package org.keycloak.testsuite.console.page.clients; +package org.keycloak.testsuite.console.page.clients.mappers; import org.keycloak.representations.idm.ProtocolMapperRepresentation; import org.keycloak.testsuite.console.page.fragment.DataTable; @@ -8,6 +8,7 @@ import org.openqa.selenium.support.FindBy; import java.util.ArrayList; import java.util.List; +import org.keycloak.testsuite.console.page.clients.Client; /** * @@ -32,6 +33,9 @@ public class ClientMappers extends Client { public class ClientMapperTable extends DataTable { + @FindBy(xpath = "//button[text() = 'Add selected']") + private WebElement addSelectedButton; + public List searchMappings(String searchPattern) { search(searchPattern); return getMappingsFromRows(); @@ -80,6 +84,14 @@ public class ClientMappers extends Client { public void deleteMapper(ProtocolMapperRepresentation mapper) { clickMapperActionButton(mapper, DELETE); } + + public void checkBuiltinMapper(String mapperName) { + body().findElement(By.xpath("//td[text() = '" + mapperName + "']/..//input")).click(); + } + + public void clickAddSelectedBuiltinMapper() { + addSelectedButton.click(); + } public ProtocolMapperRepresentation getMappingFromRow(WebElement row) { if (!row.isDisplayed()) {return null;} // Is that necessary? @@ -96,7 +108,7 @@ public class ClientMappers extends Client { } public List getMappingsFromRows() { - List mappings = new ArrayList(); + List mappings = new ArrayList<>(); for (WebElement row : rows()) { ProtocolMapperRepresentation mapperRepresentation = getMappingFromRow(row); diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappers.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappers.java similarity index 87% rename from testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappers.java rename to testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappers.java index 962e7a51a1..aafe131295 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappers.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappers.java @@ -1,4 +1,4 @@ -package org.keycloak.testsuite.console.page.clients; +package org.keycloak.testsuite.console.page.clients.mappers; import org.jboss.arquillian.graphene.page.Page; import org.keycloak.testsuite.console.page.AdminConsoleCreate; diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappersForm.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappersForm.java similarity index 66% rename from testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappersForm.java rename to testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappersForm.java index 900b4d207a..5d54800372 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientMappersForm.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/CreateClientMappersForm.java @@ -1,15 +1,11 @@ -package org.keycloak.testsuite.console.page.clients; +package org.keycloak.testsuite.console.page.clients.mappers; -import org.jboss.arquillian.test.api.ArquillianResource; import org.keycloak.testsuite.console.page.fragment.OnOffSwitch; import org.keycloak.testsuite.page.Form; -import org.openqa.selenium.By; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.Select; -import java.util.List; /** * @author Vaclav Muzikar @@ -27,7 +23,12 @@ public class CreateClientMappersForm extends Form { public static final String USERS_FULL_NAME = "User's full name"; public static final String USER_ATTRIBUTE = "User Attribute"; public static final String USER_PROPERTY = "User Property"; + public static final String GROUP_MEMBERSHIP = "Group Membership"; + // Role types + public static final String REALM_ROLE = "realm"; + public static final String CLIENT_ROLE = "client"; + @FindBy(id = "name") private WebElement nameElement; @@ -52,7 +53,7 @@ public class CreateClientMappersForm extends Form { @FindBy(xpath = ".//div[@properties='mapperType.properties']//label[text()='Multivalued']//following-sibling::node()//div[@class='onoffswitch']") private OnOffSwitch multivaluedInput; - @FindBy(xpath = ".//div[@properties='mapperType.properties']//label[text()='Role']//following-sibling::node()//input[@type='text']") + @FindBy(xpath = ".//button[text() = 'Select Role']/../..//input") private WebElement roleInput; @FindBy(xpath = ".//div[@properties='mapperType.properties']//label[text()='New Role Name']//following-sibling::node()//input[@type='text']") @@ -72,7 +73,74 @@ public class CreateClientMappersForm extends Form { @FindBy(xpath = ".//div[@properties='mapperType.properties']//label[text()='Add to access token']//following-sibling::node()//div[@class='onoffswitch']") private OnOffSwitch addToAccessTokenInput; + + @FindBy(xpath = ".//div[@properties='mapperType.properties']//label[text()='Full group path']//following-sibling::node()//div[@class='onoffswitch']") + private OnOffSwitch fullGroupPath; + @FindBy(xpath = ".//button[text() = 'Select Role']") + private WebElement selectRoleButton; + + @FindBy(xpath = "//div[@class='modal-dialog']") + private RoleSelectorModalDialog roleSelectorModalDialog; + + public class RoleSelectorModalDialog { + @FindBy(id = "available") + private Select realmAvailable; + @FindBy(xpath = ".//button[@tooltip='Select realm role']") + private WebElement selectRealmRoleButton; + + @FindBy(id = "available-client") + private Select clientAvailable; + @FindBy(id = "clients") + private Select clientSelect; + @FindBy(xpath = ".//button[@tooltip='Select client role']") + private WebElement selectClientRoleButton; + @FindBy(xpath = ".//button[@class='close']") + private WebElement closeButton; + + public void closeRoleSelectorModalDialog() { + closeButton.click(); + } + + public void selectRealmRole(String roleName) { + if (roleName != null) { + realmAvailable.selectByVisibleText(roleName); + } + selectRealmRoleButton.click(); + } + + public void selectClientRole(String clientName, String roleName) { + if (roleName != null || clientName != null) { + clientSelect.selectByVisibleText(clientName); + clientAvailable.selectByVisibleText(roleName); + } + selectClientRoleButton.click(); + } + } + + public void selectRole(String roleType, String roleName, String clientName) { + selectRoleButton.click(); + switch (roleType) { + case REALM_ROLE: + roleSelectorModalDialog.selectRealmRole(roleName); + break; + case CLIENT_ROLE: + roleSelectorModalDialog.selectClientRole(clientName, roleName); + break; + default: + throw new IllegalArgumentException("No such role type, use \"" + + REALM_ROLE + "\" or \"" + CLIENT_ROLE + "\""); + } + } + + public void closeRoleSelectorModalDialog() { + roleSelectorModalDialog.closeRoleSelectorModalDialog(); + } + + public void setName(String value) { + setInputValue(nameElement, value); + } + public boolean isConsentRequired() { return consentRequiredSwitch.isOn(); } @@ -89,10 +157,6 @@ public class CreateClientMappersForm extends Form { setInputValue(consentTextElement, consentText); } - public String getMapperType() { - return mapperTypeSelect.getFirstSelectedOption().getText(); - } - public void setMapperType(String type) { mapperTypeSelect.selectByVisibleText(type); } @@ -184,4 +248,13 @@ public class CreateClientMappersForm extends Form { public void setAddToAccessToken(boolean value) { addToAccessTokenInput.setOn(value); } + + public boolean isFullGroupPath() { + return fullGroupPath.isOn(); + } + + public void setFullGroupPath(boolean value) { + fullGroupPath.setOn(value); + } + } diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/MapperSettingsForm.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/MapperSettingsForm.java new file mode 100644 index 0000000000..09a9ba92f8 --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/mappers/MapperSettingsForm.java @@ -0,0 +1,56 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.page.clients.mappers; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +/** + * @author Vlastislav Ramik + */ +public class MapperSettingsForm extends CreateClientMappersForm { + + @FindBy(id = "protocol") + private WebElement protocolInput; + @FindBy(id = "mapperId") + private WebElement mapperIdInput; + @FindBy(id = "name") + private WebElement nameInput; + @FindBy(id = "mapperType") + private WebElement mapperTypeInput; + + public String getProtocol() { + return getInputValue(protocolInput); + } + + public String getMapperId() { + return getInputValue(mapperIdInput); + } + + public String getName() { + return getInputValue(nameInput); + } + + public String getMapperType() { + return getInputValue(mapperTypeInput); + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/ClientRole.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/ClientRole.java index 472ef026bb..262199723a 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/ClientRole.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/ClientRole.java @@ -1,6 +1,8 @@ package org.keycloak.testsuite.console.page.clients.roles; import org.keycloak.testsuite.console.page.roles.*; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; /** * @@ -9,6 +11,9 @@ import org.keycloak.testsuite.console.page.roles.*; public class ClientRole extends ClientRoles { public static final String ROLE_ID = "roleId"; + + @FindBy(xpath = "//i[contains(@class, 'delete')]") + private WebElement deleteIcon; @Override public String getUriFragment() { @@ -32,5 +37,11 @@ public class ClientRole extends ClientRoles { public void backToClientRolesViaBreadcrumb() { breadcrumb().clickItemOneLevelUp(); } + + @Override + public void delete() { + deleteIcon.click(); + modalDialog.confirmDeletion(); + } } diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientRole.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/CreateClientRole.java similarity index 89% rename from testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientRole.java rename to testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/CreateClientRole.java index eef5c6bbe1..96e2f032d2 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/CreateClientRole.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/clients/roles/CreateClientRole.java @@ -1,4 +1,4 @@ -package org.keycloak.testsuite.console.page.clients; +package org.keycloak.testsuite.console.page.clients.roles; import static org.keycloak.testsuite.console.page.clients.Client.ID; import org.keycloak.testsuite.console.page.roles.CreateRole; diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/FlashMessage.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/FlashMessage.java index f78b66053e..f6638cd8da 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/FlashMessage.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/FlashMessage.java @@ -17,6 +17,7 @@ */ package org.keycloak.testsuite.console.page.fragment; +import java.util.concurrent.TimeUnit; import static org.jboss.arquillian.graphene.Graphene.waitGui; import org.jboss.arquillian.graphene.fragment.Root; @@ -42,7 +43,9 @@ public class FlashMessage { } public boolean isSuccess() { - waitGui().until("Flash message should be success") + waitGui().withTimeout(SCRIPT_TIMEOUT, TimeUnit.MILLISECONDS) + .pollingEvery(POLLING_INTERVAL, TimeUnit.MILLISECONDS) + .until("Flash message should be success") .element(root) .attribute("class") .contains("success"); @@ -50,7 +53,9 @@ public class FlashMessage { } public boolean isError() { - waitGui().until("Flash message should be error") + waitGui().withTimeout(SCRIPT_TIMEOUT, TimeUnit.MILLISECONDS) + .pollingEvery(POLLING_INTERVAL, TimeUnit.MILLISECONDS) + .until("Flash message should be error") .element(root) .attribute("class") .contains("error"); @@ -58,7 +63,9 @@ public class FlashMessage { } public boolean isDanger() { - waitGui().until("Flash message should be danger") + waitGui().withTimeout(SCRIPT_TIMEOUT, TimeUnit.MILLISECONDS) + .pollingEvery(POLLING_INTERVAL, TimeUnit.MILLISECONDS) + .until("Flash message should be danger") .element(root) .attribute("class") .contains("danger"); diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/ModalDialog.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/ModalDialog.java index 9bb95dd24a..09fbc1861d 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/ModalDialog.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/fragment/ModalDialog.java @@ -17,6 +17,8 @@ public class ModalDialog { @FindBy(xpath = ".//button[@ng-click='ok()']") private WebElement okButton; + @FindBy(id = "name") + private WebElement nameInput; public void ok() { waitAjaxForElement(okButton); @@ -33,4 +35,9 @@ public class ModalDialog { cancelButton.click(); } + public void setName(String name) { + waitAjaxForElement(nameInput); + nameInput.clear(); + nameInput.sendKeys(name); + } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/AbstractClientTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/AbstractClientTest.java index 1b253731f9..cb2388ffb9 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/AbstractClientTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/AbstractClientTest.java @@ -80,7 +80,7 @@ public abstract class AbstractClientTest extends AbstractConsoleTest { return client; } - public ClientRepresentation findClientRepByClientId(String clientId) { + public ClientRepresentation findClientByClientId(String clientId) { ClientRepresentation found = null; for (ClientRepresentation clientRepresentation : testRealmResource().clients().findAll()) { if (clientRepresentation.getClientId().equals(clientId)) { diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientCredentialsTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientCredentialsTest.java index a813f73c78..a12e68415e 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientCredentialsTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientCredentialsTest.java @@ -49,7 +49,7 @@ public class ClientCredentialsTest extends AbstractClientTest { newClient = createClientRepresentation(TEST_CLIENT_ID, TEST_REDIRECT_URIS); testRealmResource().clients().create(newClient).close(); - ClientRepresentation found = findClientRepByClientId(TEST_CLIENT_ID); + ClientRepresentation found = findClientByClientId(TEST_CLIENT_ID); assertNotNull("Client " + TEST_CLIENT_ID + " was not found.", found); clientCredentials.setId(found.getId()); clientCredentials.navigateTo(); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientMappersTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientMappersTest.java new file mode 100644 index 0000000000..a386d5f95f --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientMappersTest.java @@ -0,0 +1,389 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.clients; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.jboss.arquillian.graphene.page.Page; +import org.junit.Test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.keycloak.representations.idm.ClientRepresentation; +import org.keycloak.representations.idm.ProtocolMapperRepresentation; +import org.keycloak.testsuite.console.page.clients.mappers.ClientMapper; +import org.keycloak.testsuite.console.page.clients.mappers.ClientMappers; +import org.keycloak.testsuite.console.page.clients.mappers.CreateClientMappers; +import static org.keycloak.testsuite.console.page.clients.mappers.CreateClientMappersForm.*; + +/** + * + * @author Vlastislav Ramik + * + * TODO: saml mappers + */ +public class ClientMappersTest extends AbstractClientTest { + + private String id; + + @Page + private ClientMappers clientMappersPage; + @Page + private ClientMapper clientMapperPage; + + @Page + private CreateClientMappers createClientMappersPage; + + @Before + public void beforeClientMappersTest() { + ClientRepresentation newClient = createClientRepresentation(TEST_CLIENT_ID, TEST_REDIRECT_URIS); + testRealmResource().clients().create(newClient).close(); + + id = findClientByClientId(TEST_CLIENT_ID).getId(); + clientMappersPage.setId(id); + clientMappersPage.navigateTo(); + } + + private ProtocolMapperRepresentation findClientMapperByName(String mapperName) { + ProtocolMapperRepresentation found = null; + for (ProtocolMapperRepresentation mapper : testRealmResource().clients().get(id).getProtocolMappers().getMappers()) { + if (mapperName.equals(mapper.getName())) { + found = mapper; + } + } + return found; + } + + private void setInitialValues(String name, boolean consentRequired, String consentText) { + createClientMappersPage.form().setName(name); + createClientMappersPage.form().setConsentRequired(consentRequired); + if (consentRequired) { + createClientMappersPage.form().setConsentText(consentText); + } + } + + @Test + public void testOIDCHardcodedRole() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("hardcoded role", true, "Consent Text"); + createClientMappersPage.form().setMapperType(HARDCODED_ROLE); + createClientMappersPage.form().selectRole(REALM_ROLE, "offline_access", null); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("hardcoded role"); + assertNotNull(found); + + assertTrue(found.isConsentRequired()); + assertEquals("Consent Text", found.getConsentText()); + assertEquals("oidc-hardcoded-role-mapper", found.getProtocolMapper()); + Map config = found.getConfig(); + + assertEquals(1, config.size()); + assertEquals("offline_access", config.get("role")); + + //edit + createClientMappersPage.form().selectRole(CLIENT_ROLE, "view-profile", "account"); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + config = findClientMapperByName("hardcoded role").getConfig(); + assertEquals("account.view-profile", config.get("role")); + + //delete + clientMapperPage.setMapperId(found.getId()); + clientMapperPage.delete(); + assertFlashMessageSuccess(); + + //check + assertNull(findClientMapperByName("hardcoded role")); + } + + @Test + public void testOIDCHardcodedClaim() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("hardcoded claim", false, null); + createClientMappersPage.form().setMapperType(HARDCODED_CLAIM); + createClientMappersPage.form().setTokenClaimName("claim name"); + createClientMappersPage.form().setTokenClaimValue("claim value"); + createClientMappersPage.form().setClaimJSONType("long"); + createClientMappersPage.form().setAddToIDToken(true); + createClientMappersPage.form().setAddToAccessToken(true); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("hardcoded claim"); + assertNotNull(found); + + assertFalse(found.isConsentRequired()); + assertEquals("oidc-hardcoded-claim-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertEquals("true", config.get("id.token.claim")); + assertEquals("true", config.get("access.token.claim")); + assertEquals("claim name", config.get("claim.name")); + assertEquals("claim value", config.get("claim.value")); + assertEquals("long", config.get("jsonType.label")); + } + + @Test + public void testOIDCUserSessionNote() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("user session note", false, null); + createClientMappersPage.form().setMapperType(USER_SESSION_NOTE); + createClientMappersPage.form().setUserSessionNote("session note"); + createClientMappersPage.form().setTokenClaimName("claim name"); + createClientMappersPage.form().setClaimJSONType("int"); + createClientMappersPage.form().setAddToIDToken(false); + createClientMappersPage.form().setAddToAccessToken(false); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("user session note"); + assertNotNull(found); + + assertFalse(found.isConsentRequired()); + assertEquals("oidc-usersessionmodel-note-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertNull(config.get("id.token.claim")); + assertNull(config.get("access.token.claim")); + assertEquals("claim name", config.get("claim.name")); + assertEquals("session note", config.get("user.session.note")); + assertEquals("int", config.get("jsonType.label")); + } + + @Test + public void testOIDCRoleName() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("role name", false, null); + createClientMappersPage.form().setMapperType(ROLE_NAME_MAPPER); + createClientMappersPage.form().setRole("offline_access"); + createClientMappersPage.form().setNewRole("new role"); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("role name"); + assertEquals("oidc-role-name-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertEquals("offline_access", config.get("role")); + assertEquals("new role", config.get("new.role.name")); + } + + @Test + public void testOIDCUserAddress() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("user address", false, null); + createClientMappersPage.form().setMapperType(USERS_FULL_NAME); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("user address"); + assertEquals("oidc-full-name-mapper", found.getProtocolMapper()); + } + + @Test + public void testOIDCUserFullName() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("user full name", false, null); + createClientMappersPage.form().setMapperType(USERS_FULL_NAME); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("user full name"); + assertEquals("oidc-full-name-mapper", found.getProtocolMapper()); + } + + @Test + public void testOIDCUserAttribute() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("user attribute", false, null); + createClientMappersPage.form().setMapperType(USER_ATTRIBUTE); + createClientMappersPage.form().setUserAttribute("user attribute"); + createClientMappersPage.form().setMultivalued(true); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("user attribute"); + assertEquals("oidc-usermodel-attribute-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertEquals("true", config.get("multivalued")); + assertEquals("user attribute", config.get("user.attribute")); + } + + @Test + public void testOIDCUserProperty() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("user property", false, null); + createClientMappersPage.form().setMapperType(USER_PROPERTY); + createClientMappersPage.form().setProperty("property"); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("user property"); + assertEquals("oidc-usermodel-property-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertEquals("property", config.get("user.attribute")); + } + + @Test + public void testOIDCGroupMembership() { + //create + clientMappersPage.mapperTable().createMapper(); + setInitialValues("group membership", false, null); + createClientMappersPage.form().setMapperType(GROUP_MEMBERSHIP); + createClientMappersPage.form().setFullGroupPath(true); + createClientMappersPage.form().save(); + assertFlashMessageSuccess(); + + //check + ProtocolMapperRepresentation found = findClientMapperByName("group membership"); + assertEquals("oidc-group-membership-mapper", found.getProtocolMapper()); + + Map config = found.getConfig(); + assertEquals("true", config.get("full.path")); + } + + @Test + public void testOIDCEditMapper() { + //prepare data + ProtocolMapperRepresentation mapper = new ProtocolMapperRepresentation(); + mapper.setName("mapper name"); + mapper.setConsentRequired(true); + mapper.setConsentText("consent text"); + mapper.setProtocol("openid-connect"); + mapper.setProtocolMapper("oidc-usersessionmodel-note-mapper"); + + Map config = new HashMap<>(); + config.put("access.token.claim", "true"); + config.put("id.token.claim", "true"); + config.put("claim.name", "claim name"); + config.put("jsonType.label", "String"); + config.put("user.session.note", "session note"); + + mapper.setConfig(config); + + //insert data + testRealmResource().clients().get(id).getProtocolMappers().createMapper(mapper).close(); + + //check form + clientMapperPage.setId(id); + String mapperId = findClientMapperByName("mapper name").getId(); + clientMapperPage.setMapperId(mapperId); + clientMapperPage.navigateTo(); + + assertEquals("openid-connect", clientMapperPage.form().getProtocol()); + assertEquals(mapperId, clientMapperPage.form().getMapperId()); + assertEquals("mapper name", clientMapperPage.form().getName()); + assertTrue(clientMapperPage.form().isConsentRequired()); + assertEquals("consent text", clientMapperPage.form().getConsentText()); + assertEquals("User Session Note", clientMapperPage.form().getMapperType()); + assertEquals("session note", clientMapperPage.form().getUserSessionNote()); + assertEquals("claim name", clientMapperPage.form().getTokenClaimName()); + assertEquals("String", clientMapperPage.form().getClaimJSONType()); + assertTrue(clientMapperPage.form().isAddToIDToken()); + assertTrue(clientMapperPage.form().isAddToAccessToken()); + + //edit + clientMapperPage.form().setConsentRequired(false); + clientMapperPage.form().save(); + assertFlashMessageSuccess(); + + //check + assertFalse(findClientMapperByName("mapper name").isConsentRequired()); + } + + @Test + public void testAddBuiltin() { + clientMappersPage.mapperTable().addBuiltin(); + clientMappersPage.mapperTable().checkBuiltinMapper("locale"); + clientMappersPage.mapperTable().clickAddSelectedBuiltinMapper(); + assertFlashMessageSuccess(); + + assertTrue("Builtin mapper \"locale\" should be present.", isMapperPresent("locale")); + + clientMappersPage.mapperTable().deleteMapper("locale"); + modalDialog.confirmDeletion(); + assertFlashMessageSuccess(); + + assertFalse("Builtin mapper \"locale\" should not be present.", isMapperPresent("locale")); + } + + private boolean isMapperPresent(String name) { + List mappers = testRealmResource().clients().get(id).getProtocolMappers().getMappers(); + boolean found = false; + for (ProtocolMapperRepresentation mapper : mappers) { + if (name.equals(mapper.getName())) { + found = true; + } + } + return found; + } + + @Test + public void testCreateMapperInvalidValues() { + //empty mapper type + clientMappersPage.mapperTable().createMapper(); + createClientMappersPage.form().save(); + assertFlashMessageDanger(); + + //empty name + createClientMappersPage.form().setMapperType(HARDCODED_ROLE); + createClientMappersPage.form().save(); + assertFlashMessageDanger(); + + createClientMappersPage.form().setName(""); + createClientMappersPage.form().save(); + assertFlashMessageDanger(); + + createClientMappersPage.form().setName("name"); + createClientMappersPage.form().setName(""); + createClientMappersPage.form().save(); + assertFlashMessageDanger(); + + //existing name + createClientMappersPage.form().setName("email"); + createClientMappersPage.form().save(); + assertFlashMessageDanger(); + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientRolesTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientRolesTest.java index 7463c70d2a..f22b13d48f 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientRolesTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientRolesTest.java @@ -9,9 +9,9 @@ import static org.junit.Assert.*; import org.junit.Before; import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.RoleRepresentation; -import org.keycloak.testsuite.console.page.clients.ClientRole; -import org.keycloak.testsuite.console.page.clients.ClientRoles; -import org.keycloak.testsuite.console.page.clients.CreateClientRole; +import org.keycloak.testsuite.console.page.clients.roles.ClientRole; +import org.keycloak.testsuite.console.page.clients.roles.ClientRoles; +import org.keycloak.testsuite.console.page.clients.roles.CreateClientRole; import org.keycloak.testsuite.console.page.users.User; import org.keycloak.testsuite.util.URLAssert; @@ -41,7 +41,7 @@ public class ClientRolesTest extends AbstractClientTest { ClientRepresentation newClient = createClientRepresentation(TEST_CLIENT_ID, TEST_REDIRECT_URIS); testRealmResource().clients().create(newClient).close(); - id = findClientRepByClientId(TEST_CLIENT_ID).getId(); + id = findClientByClientId(TEST_CLIENT_ID).getId(); clientPage.setId(id); clientRolePage.setId(id); clientRolesPage.setId(id); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientSettingsTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientSettingsTest.java index 54782a86eb..85bc433bec 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientSettingsTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientSettingsTest.java @@ -53,7 +53,7 @@ public class ClientSettingsTest extends AbstractClientTest { assertFlashMessageSuccess(); // read & verify - ClientRepresentation found = findClientRepByClientId(newClient.getClientId()); + ClientRepresentation found = findClientByClientId(newClient.getClientId()); assertNotNull("Client " + newClient.getClientId() + " was not found.", found); assertClientSettingsEqual(newClient, found); @@ -80,14 +80,14 @@ public class ClientSettingsTest extends AbstractClientTest { clientSettingsPage.form().save(); assertFlashMessageSuccess(); - found = findClientRepByClientId(newClient.getClientId()); + found = findClientByClientId(newClient.getClientId()); assertNotNull("Client " + newClient.getClientId() + " was not found.", found); assertClientSettingsEqual(newClient, found); // delete clientPage.delete(); assertFlashMessageSuccess(); - found = findClientRepByClientId(newClient.getClientId()); + found = findClientByClientId(newClient.getClientId()); assertNull("Deleted client " + newClient.getClientId() + " was found.", found); } @@ -98,7 +98,7 @@ public class ClientSettingsTest extends AbstractClientTest { createClient(newClient); assertFlashMessageSuccess(); - ClientRepresentation found = findClientRepByClientId(newClient.getClientId()); + ClientRepresentation found = findClientByClientId(newClient.getClientId()); assertNotNull("Client " + newClient.getClientId() + " was not found.", found); assertClientSettingsEqual(newClient, found); } @@ -112,7 +112,7 @@ public class ClientSettingsTest extends AbstractClientTest { createClient(newClient); assertFlashMessageSuccess(); - ClientRepresentation found = findClientRepByClientId(newClient.getClientId()); + ClientRepresentation found = findClientByClientId(newClient.getClientId()); assertNotNull("Client " + newClient.getClientId() + " was not found.", found); assertClientSettingsEqual(newClient, found); } @@ -129,7 +129,7 @@ public class ClientSettingsTest extends AbstractClientTest { createClient(newClient); assertFlashMessageSuccess(); - ClientRepresentation found = findClientRepByClientId(newClient.getClientId()); + ClientRepresentation found = findClientByClientId(newClient.getClientId()); assertNotNull("Client " + newClient.getClientId() + " was not found.", found); assertClientSettingsEqual(newClient, found); assertClientSamlAttributes(getSAMLAttributes(), found.getAttributes()); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientsTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientsTest.java index c977dbe49e..14e690b8b7 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientsTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/clients/ClientsTest.java @@ -21,8 +21,6 @@ */ package org.keycloak.testsuite.console.clients; -import java.util.ArrayList; -import java.util.List; import org.jboss.arquillian.graphene.page.Page; import static org.junit.Assert.*; import org.junit.Before; @@ -30,8 +28,6 @@ import org.junit.Test; import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.testsuite.console.page.clients.settings.ClientSettings; import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlEquals; -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; /** * @@ -49,7 +45,7 @@ public class ClientsTest extends AbstractClientTest { newClient = createClientRepresentation(TEST_CLIENT_ID, TEST_REDIRECT_URIS); testRealmResource().clients().create(newClient).close(); - ClientRepresentation found = findClientRepByClientId(TEST_CLIENT_ID); + ClientRepresentation found = findClientByClientId(TEST_CLIENT_ID); assertNotNull("Client " + TEST_CLIENT_ID + " was not found.", found); clientSettingsPage.setId(found.getId()); } @@ -71,93 +67,7 @@ public class ClientsTest extends AbstractClientTest { modalDialog.confirmDeletion(); assertFlashMessageSuccess(); - ClientRepresentation found = findClientRepByClientId(TEST_CLIENT_ID); + ClientRepresentation found = findClientByClientId(TEST_CLIENT_ID); assertNull("Deleted client " + TEST_CLIENT_ID + " was found.", found); } - - @Test - public void tabs() { - clientSettingsPage.navigateTo(); - - //oidc-confidential - WebElement tabs = clientPage.tabs().getTabs(); - List visibleTabs = new ArrayList<>(); - visibleTabs.add("Settings"); - visibleTabs.add("Credentials"); - visibleTabs.add("Roles"); - visibleTabs.add("Mappers"); - visibleTabs.add("Scope"); - visibleTabs.add("Revocation"); - visibleTabs.add("Sessions"); - visibleTabs.add("Offline Access"); - visibleTabs.add("Clustering"); - visibleTabs.add("Installation"); - - List invisibleTabs = new ArrayList<>(); - invisibleTabs.add("SAML Keys"); - invisibleTabs.add("Service Account Roles"); - - assertVisibilityOfTabs(tabs, visibleTabs, invisibleTabs); - - //oidc-public - newClient.setPublicClient(true); - clientSettingsPage.form().setAccessType(newClient); - clientSettingsPage.form().save(); - assertFlashMessageSuccess(); - - tabs = clientPage.tabs().getTabs(); - visibleTabs.clear(); - invisibleTabs.clear(); - - visibleTabs.add("Settings"); - visibleTabs.add("Roles"); - visibleTabs.add("Mappers"); - visibleTabs.add("Scope"); - visibleTabs.add("Revocation"); - visibleTabs.add("Sessions"); - visibleTabs.add("Offline Access"); - visibleTabs.add("Installation"); - - invisibleTabs.add("Credentials"); - invisibleTabs.add("SAML Keys"); - invisibleTabs.add("Clustering"); - invisibleTabs.add("Service Account Roles"); - - assertVisibilityOfTabs(tabs, visibleTabs, invisibleTabs); - - //oidc-bearer-only - newClient.setPublicClient(false); - newClient.setBearerOnly(true); - clientSettingsPage.form().setAccessType(newClient); - clientSettingsPage.form().save(); - assertFlashMessageSuccess(); - - tabs = clientPage.tabs().getTabs(); - visibleTabs.clear(); - invisibleTabs.clear(); - - visibleTabs.add("Settings"); - visibleTabs.add("Credentials"); - visibleTabs.add("Roles"); - visibleTabs.add("Revocation"); - visibleTabs.add("Clustering"); - visibleTabs.add("Installation"); - - invisibleTabs.add("SAML Keys"); - invisibleTabs.add("Mappers"); - invisibleTabs.add("Scope"); - invisibleTabs.add("Sessions"); - invisibleTabs.add("Service Account Roles"); - - assertVisibilityOfTabs(tabs, visibleTabs, invisibleTabs); - } - - private void assertVisibilityOfTabs(WebElement tabs, List visible, List invisible) { - for (String visibleLink : visible) { - assertTrue(tabs.findElement(By.linkText(visibleLink)).isDisplayed()); - } - for (String invisibleLink : invisible) { - assertTrue(tabs.findElements(By.linkText(invisibleLink)).isEmpty()); - } - } }