/*
* Copyright 2016 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.adapter.page;
import org.jboss.arquillian.container.test.api.OperateOnDeployment;
import org.jboss.arquillian.graphene.page.Page;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.keycloak.testsuite.auth.page.login.OIDCLogin;
import org.keycloak.testsuite.page.AbstractPageWithInjectedUrl;
import org.keycloak.testsuite.page.Form;
import org.keycloak.testsuite.pages.ConsentPage;
import org.keycloak.testsuite.util.URLUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import java.net.URL;
import static org.keycloak.testsuite.util.WaitUtils.pause;
import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad;
import static org.keycloak.testsuite.util.WaitUtils.waitUntilElement;
/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
* @author Vaclav Muzikar <vmuzikar@redhat.com>
*/
public class PhotozClientAuthzTestApp extends AbstractPageWithInjectedUrl {
public static final String DEPLOYMENT_NAME = "photoz-html5-client";
public static final int WAIT_AFTER_OPERATION = 2000;
@ArquillianResource
@OperateOnDeployment(DEPLOYMENT_NAME)
private URL url;
@Page
protected OIDCLogin loginPage;
@Page
protected ConsentPage consentPage;
@FindBy(xpath = "//a[@ng-click = 'Identity.logout()']")
private WebElement signOutButton;
@FindBy(id = "entitlement")
private WebElement entitlement;
@FindBy(id = "entitlements")
private WebElement entitlements;
@FindBy(id = "output")
private WebElement output;
public void createAlbum(String name) {
createAlbum(name, "save-album");
}
public void createAlbum(String name, String buttonId) {
navigateTo();
this.driver.findElement(By.id("create-album")).click();
Form.setInputValue(this.driver.findElement(By.id("album.name")), name);
pause(200); // We need to wait a bit for the form to "accept" the input (otherwise it registers the input as empty)
this.driver.findElement(By.id(buttonId)).click();
pause(WAIT_AFTER_OPERATION);
}
public void createAlbumWithInvalidUser(String name) {
createAlbum(name, "save-album-invalid");
}
@Override
public URL getInjectedUrl() {
return this.url;
}
public void deleteAlbum(String name) {
driver.findElements(By.xpath("//a[text()='" + name + "']/following-sibling::a[text()='X']")).forEach(WebElement::click);
pause(WAIT_AFTER_OPERATION);
}
public void navigateToAdminAlbum() {
URLUtils.navigateToUri(driver, toString() + "/#/admin/album", true);
driver.navigate().refresh(); // This is sometimes necessary for loading the new policy settings
waitForPageToLoad(driver);
pause(WAIT_AFTER_OPERATION);
}
public void logOut() {
waitUntilElement(signOutButton); // Sometimes doesn't work in PhantomJS!
signOutButton.click();
pause(WAIT_AFTER_OPERATION);
}
public void requestEntitlement() {
entitlement.click();
pause(WAIT_AFTER_OPERATION);
pause(WAIT_AFTER_OPERATION);
}
public void requestEntitlements() {
entitlements.click();
pause(WAIT_AFTER_OPERATION);
pause(WAIT_AFTER_OPERATION);
}
public void login(String username, String password, String... scopes) throws InterruptedException {
if (this.driver.getCurrentUrl().startsWith(getInjectedUrl().toString())) {
Thread.sleep(2000);
logOut();
navigateTo();
}
Thread.sleep(2000);
if (scopes.length > 0) {
StringBuilder scopesValue = new StringBuilder();
for (String scope : scopes) {
if (scopesValue.length() != 0) {
scopesValue.append(" ");
}
scopesValue.append(scope);
}
URLUtils.navigateToUri(driver, this.driver.getCurrentUrl() + " " + scopesValue, true);
}
this.loginPage.form().login(username, password);
// simple check if we are at the consent page, if so just click 'Yes'
if (this.consentPage.isCurrent()) {
consentPage.confirm();
}
pause(WAIT_AFTER_OPERATION);
}
public boolean wasDenied() {
return this.driver.findElement(By.id("output")).getText().contains("You can not access");
}
public void viewAlbum(String name) throws InterruptedException {
this.driver.findElement(By.xpath("//a[text() = '" + name + "']")).click();
waitForPageToLoad(driver);
driver.navigate().refresh(); // This is sometimes necessary for loading the new policy settings
pause(WAIT_AFTER_OPERATION);
}
public WebElement getOutput() {
return output;
}
@Override
public void navigateTo(boolean waitForMatch) {
super.navigateTo(waitForMatch);
pause(WAIT_AFTER_OPERATION);
}
@Override
public boolean isCurrent() {
return URLUtils.currentUrlStartWith(driver, toString());
}
}