package org.keycloak.testsuite.console.page.clients.mappers;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.keycloak.testsuite.console.page.fragment.OnOffSwitch;
import org.keycloak.testsuite.page.Form;
import org.keycloak.testsuite.util.WaitUtils;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.Select;
/**
* @author Vaclav Muzikar <vmuzikar@redhat.com>
*/
public class CreateClientMappersForm extends Form {
// Mappers types
public static final String HARDCODED_ROLE = "Hardcoded Role";
public static final String HARDCODED_CLAIM = "Hardcoded claim";
public static final String USER_SESSION_NOTE = "User Session Note";
public static final String ROLE_NAME_MAPPER = "Role Name Mapper";
public static final String USER_ADDRESS = "User Address";
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";
public static final String ROLE_LIST = "Role list";
public static final String HARDCODED_ATTRIBUTE = "Hardcoded attribute";
public static final String GROUP_LIST = "Group list";
public static final String HARDCODED_ROLE_SAML = "Hardcoded role";
// Role types
public static final String REALM_ROLE = "realm";
public static final String CLIENT_ROLE = "client";
@FindBy(id = "name")
private WebElement nameElement;
@FindBy(xpath = ".//div[@class='onoffswitch' and ./input[@id='consentRequired']]")
private OnOffSwitch consentRequiredSwitch;
@FindBy(id = "consentText")
private WebElement consentTextElement;
@FindBy(id = "mapperTypeCreate")
private Select mapperTypeSelect;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Property')]//following-sibling::node()//input[@type='text']")
private WebElement propertyInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'User Attribute')]//following-sibling::node()//input[@type='text']")
private WebElement userAttributeInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'User Session Note')]//following-sibling::node()//input[@type='text']")
private WebElement userSessionNoteInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Multivalued')]//following-sibling::node()//div[@class='onoffswitch']")
private OnOffSwitch multivaluedInput;
@FindBy(xpath = ".//button[text() = 'Select Role']/../..//input")
private WebElement roleInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'New Role Name')]//following-sibling::node()//input[@type='text']")
private WebElement newRoleInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Token Claim Name')]//following-sibling::node()//input[@type='text']")
private WebElement tokenClaimNameInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Claim value')]//following-sibling::node()//input[@type='text']")
private WebElement tokenClaimValueInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Claim JSON Type')]//following-sibling::node()//select")
private Select claimJSONTypeInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Add to ID token')]//following-sibling::node()//div[@class='onoffswitch']")
private OnOffSwitch addToIDTokenInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Add to access token')]//following-sibling::node()//div[@class='onoffswitch']")
private OnOffSwitch addToAccessTokenInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(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 {
@Drone
private WebDriver driver;
@FindBy(id = "available")
private Select realmAvailable;
@FindBy(xpath = ".//button[@tooltip='Select realm role' and not(@disabled)]")
private WebElement selectRealmRoleButton;
@FindBy(id = "available-client")
private Select clientAvailable;
@FindBy(id = "clients")
private Select clientSelect;
@FindBy(xpath = ".//button[@tooltip='Select client role' and not(@disabled)]")
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);
}
WaitUtils.pause(1000);
selectRealmRoleButton.click();
WaitUtils.waitForModalFadeOut(driver);
}
public void selectClientRole(String clientName, String roleName) {
if (roleName != null || clientName != null) {
clientSelect.selectByVisibleText(clientName);
clientAvailable.selectByVisibleText(roleName);
}
WaitUtils.pause(1000);
selectClientRoleButton.click();
WaitUtils.waitForModalFadeOut(driver);
}
}
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();
}
public void setConsentRequired(boolean consentRequired) {
consentRequiredSwitch.setOn(consentRequired);
}
public String getConsentText() {
return getInputValue(consentTextElement);
}
public void setConsentText(String consentText) {
setInputValue(consentTextElement, consentText);
}
public void setMapperType(String type) {
mapperTypeSelect.selectByVisibleText(type);
}
public String getProperty() {
return getInputValue(propertyInput);
}
public void setProperty(String value) {
setInputValue(propertyInput, value);
}
public String getUserAttribute() {
return getInputValue(userAttributeInput);
}
public void setUserAttribute(String value) {
setInputValue(userAttributeInput, value);
}
public String getUserSessionNote() {
return getInputValue(userSessionNoteInput);
}
public void setUserSessionNote(String value) {
setInputValue(userSessionNoteInput, value);
}
public boolean isMultivalued() {
return multivaluedInput.isOn();
}
public void setMultivalued(boolean value) {
multivaluedInput.setOn(value);
}
public String getRole() {
return getInputValue(roleInput);
}
public void setRole(String value) {
setInputValue(roleInput, value);
}
public String getNewRole() {
return getInputValue(newRoleInput);
}
public void setNewRole(String value) {
setInputValue(newRoleInput, value);
}
public String getTokenClaimName() {
return getInputValue(tokenClaimNameInput);
}
public void setTokenClaimName(String value) {
setInputValue(tokenClaimNameInput, value);
}
public String getTokenClaimValue() {
return getInputValue(tokenClaimValueInput);
}
public void setTokenClaimValue(String value) {
setInputValue(tokenClaimValueInput, value);
}
public String getClaimJSONType() {
return claimJSONTypeInput.getFirstSelectedOption().getText();
}
public void setClaimJSONType(String value) {
claimJSONTypeInput.selectByVisibleText(value);
}
public boolean isAddToIDToken() {
return addToIDTokenInput.isOn();
}
public void setAddToIDToken(boolean value) {
addToIDTokenInput.setOn(value);
}
public boolean isAddToAccessToken() {
return addToAccessTokenInput.isOn();
}
public void setAddToAccessToken(boolean value) {
addToAccessTokenInput.setOn(value);
}
public boolean isFullGroupPath() {
return fullGroupPath.isOn();
}
public void setFullGroupPath(boolean value) {
fullGroupPath.setOn(value);
}
//SAML
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Role attribute name')]//following-sibling::node()//input[@type='text']")
private WebElement roleAttributeNameInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Friendly Name')]//following-sibling::node()//input[@type='text']")
private WebElement friendlyNameInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'SAML Attribute NameFormat')]//following-sibling::node()//select")
private Select samlAttributeNameFormatSelect;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Single Role Attribute')]//following-sibling::node()//div[@class='onoffswitch']")
private OnOffSwitch singleRoleAttributeSwitch;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Attribute value')]//following-sibling::node()//input[@type='text']")
private WebElement attributeValueInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Group attribute name')]//following-sibling::node()//input[@type='text']")
private WebElement groupAttributeNameInput;
@FindBy(xpath = ".//div[@properties='model.mapperType.properties']//label[contains(text(),'Single Group Attribute')]//following-sibling::node()//div[@class='onoffswitch']")
private OnOffSwitch singleGroupAttributeSwitch;
public void setRoleAttributeName(String value) {
setInputValue(roleAttributeNameInput, value);
}
public void setFriendlyName(String value) {
setInputValue(friendlyNameInput, value);
}
public void setSamlAttributeNameFormat(String value) {
samlAttributeNameFormatSelect.selectByVisibleText(value);
}
public void setSingleRoleAttribute(boolean value) {
singleRoleAttributeSwitch.setOn(value);
}
public void setAttributeValue(String value) {
setInputValue(attributeValueInput, value);
}
public void setGroupAttributeName(String value) {
setInputValue(groupAttributeNameInput, value);
}
public void setSingleGroupAttribute(boolean value) {
singleGroupAttributeSwitch.setOn(value);
}
}