/* * Copyright 2017 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.page.clients.authorization.resource; import java.util.HashSet; import java.util.List; import java.util.Set; import org.jboss.arquillian.graphene.fragment.Root; import org.keycloak.representations.idm.authorization.ResourceRepresentation; import org.keycloak.representations.idm.authorization.ScopeRepresentation; import org.keycloak.testsuite.page.Form; import org.keycloak.testsuite.util.WaitUtils; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; /** * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a> */ public class ResourceForm extends Form { @FindBy(id = "name") private WebElement name; @FindBy(id = "type") private WebElement type; @FindBy(id = "uri") private WebElement uri; @FindBy(id = "iconUri") private WebElement iconUri; @FindBy(id = "resource.owner.name") private WebElement owner; @FindBy(xpath = "//i[contains(@class,'pficon-delete')]") private WebElement deleteButton; @FindBy(xpath = ACTIVE_DIV_XPATH + "/button[text()='Delete']") private WebElement confirmDelete; @FindBy(id = "s2id_scopes") private ScopesInput scopesInput; public void populate(ResourceRepresentation expected) { setInputValue(name, expected.getName()); setInputValue(type, expected.getType()); setInputValue(uri, expected.getUri()); setInputValue(iconUri, expected.getIconUri()); Set<ScopeRepresentation> scopes = expected.getScopes(); for (ScopeRepresentation scope : scopes) { scopesInput.select(scope.getName()); } Set<ScopeRepresentation> selection = scopesInput.getSelected(); for (ScopeRepresentation selected : selection) { boolean isSelected = false; for (ScopeRepresentation scope : scopes) { if (selected.getName().equals(scope.getName())) { isSelected = true; break; } } if (!isSelected) { scopesInput.unSelect(selected.getName(), driver); } } save(); } public void delete() { deleteButton.click(); confirmDelete.click(); } public ResourceRepresentation toRepresentation() { ResourceRepresentation representation = new ResourceRepresentation(); representation.setName(getInputValue(name)); representation.setType(getInputValue(type)); representation.setUri(getInputValue(uri)); representation.setIconUri(getInputValue(iconUri)); representation.setScopes(scopesInput.getSelected()); return representation; } public class ScopesInput { @Root private WebElement root; @FindBy(xpath = "//input[contains(@class,'select2-input')]") private WebElement search; @FindBy(xpath = "//div[contains(@class,'select2-result-label')]") private List<WebElement> result; @FindBy(xpath = "//li[contains(@class,'select2-search-choice')]") private List<WebElement> selection; public void select(String name) { setInputValue(search, name); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } for (WebElement result : result) { if (result.getText().equalsIgnoreCase(name)) { result.click(); return; } } } public Set<ScopeRepresentation> getSelected() { HashSet<ScopeRepresentation> values = new HashSet<>(); for (WebElement selected : selection) { values.add(new ScopeRepresentation(selected.findElements(By.tagName("div")).get(0).getText())); } return values; } public void unSelect(String name, WebDriver driver) { for (WebElement selected : selection) { if (name.equals(selected.findElements(By.tagName("div")).get(0).getText())) { WebElement element = selected.findElement(By.xpath("//a[contains(@class,'select2-search-choice-close')]")); JavascriptExecutor executor = (JavascriptExecutor) driver; executor.executeScript("arguments[0].click();", element); WaitUtils.pause(1000); return; } } } } }