Prepare UI testing for PR
This commit is contained in:
parent
269f9fe860
commit
ba88cdce70
53 changed files with 4003 additions and 0 deletions
2
pom.xml
2
pom.xml
|
@ -1311,6 +1311,7 @@
|
||||||
<id>distribution</id>
|
<id>distribution</id>
|
||||||
<modules>
|
<modules>
|
||||||
<module>distribution</module>
|
<module>distribution</module>
|
||||||
|
<module>testsuite/integration-arquillian</module>
|
||||||
</modules>
|
</modules>
|
||||||
</profile>
|
</profile>
|
||||||
<profile>
|
<profile>
|
||||||
|
@ -1318,6 +1319,7 @@
|
||||||
<modules>
|
<modules>
|
||||||
<module>docbook</module>
|
<module>docbook</module>
|
||||||
<module>distribution</module>
|
<module>distribution</module>
|
||||||
|
<module>testsuite/integration-arquillian</module>
|
||||||
</modules>
|
</modules>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|
21
testsuite/integration-arquillian/README.md
Normal file
21
testsuite/integration-arquillian/README.md
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
Testing admin console with Arquillian
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
There are currently two ways of running the tests with help of Arquillian.
|
||||||
|
|
||||||
|
Remote mode
|
||||||
|
----------
|
||||||
|
|
||||||
|
Just simply typle `mvn verify` and you are all set. This requires the instance of Wildfly with embedded Keycloak to be already running.
|
||||||
|
|
||||||
|
Managed mode
|
||||||
|
------------
|
||||||
|
|
||||||
|
You need to pass two arguments to Maven, first is location of your Wildfly server with embedded Keycloak and the other is name of the profile.
|
||||||
|
|
||||||
|
mvn verify -Pwildfly-8-managed -DjbossHome=/your/server/location
|
||||||
|
|
||||||
|
Browser
|
||||||
|
-------
|
||||||
|
|
||||||
|
There are currently two supported browsers - PhantomJS and Firefox. PhantomJS is the default one, in order to use Firefox just specify `-Dbrowser=firefox` parameter in the Maven command.
|
182
testsuite/integration-arquillian/pom.xml
Normal file
182
testsuite/integration-arquillian/pom.xml
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-testsuite-pom</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>1.3.0.Final-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>arquillian-integration</artifactId>
|
||||||
|
<name>KeyCloak Admin UI TestSuite</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<browser>phantomjs</browser>
|
||||||
|
|
||||||
|
<arquillian-core.version>1.1.5.Final</arquillian-core.version>
|
||||||
|
<selenium.version>2.45.0</selenium.version>
|
||||||
|
<arquillian-drone.version>1.3.1.Final</arquillian-drone.version>
|
||||||
|
<arquillian-phantomjs.version>1.1.4.Final</arquillian-phantomjs.version>
|
||||||
|
<arquillian-graphene.version>2.0.3.Final</arquillian-graphene.version>
|
||||||
|
<arquillian-wildfly-container.version>8.1.0.Final</arquillian-wildfly-container.version>
|
||||||
|
|
||||||
|
<!-- Used in profile "wildfly-8-remote".
|
||||||
|
Set to "false" if admin password has already been updated after first login. -->
|
||||||
|
<firstAdminLogin>true</firstAdminLogin>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian.selenium</groupId>
|
||||||
|
<artifactId>selenium-bom</artifactId>
|
||||||
|
<version>${selenium.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian</groupId>
|
||||||
|
<artifactId>arquillian-bom</artifactId>
|
||||||
|
<version>${arquillian-core.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian.extension</groupId>
|
||||||
|
<artifactId>arquillian-drone-bom</artifactId>
|
||||||
|
<version>${arquillian-drone.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly</groupId>
|
||||||
|
<artifactId>wildfly-arquillian-container-remote</artifactId>
|
||||||
|
<version>${arquillian-wildfly-container.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly</groupId>
|
||||||
|
<artifactId>wildfly-arquillian-container-managed</artifactId>
|
||||||
|
<version>${arquillian-wildfly-container.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian.junit</groupId>
|
||||||
|
<artifactId>arquillian-junit-container</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian.graphene</groupId>
|
||||||
|
<artifactId>graphene-webdriver</artifactId>
|
||||||
|
<version>${arquillian-graphene.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.arquillian.extension</groupId>
|
||||||
|
<artifactId>arquillian-phantom-driver</artifactId>
|
||||||
|
<version>${arquillian-phantomjs.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>wildfly-8-remote</id>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly</groupId>
|
||||||
|
<artifactId>wildfly-arquillian-container-remote</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<shouldDeploy>false</shouldDeploy>
|
||||||
|
<arquillian.launch>wildfly-8-remote</arquillian.launch>
|
||||||
|
<browser>${browser}</browser>
|
||||||
|
<firstAdminLogin>${first.login}</firstAdminLogin>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
<id>wildfly-8-managed</id>
|
||||||
|
<activation>
|
||||||
|
<activeByDefault>true</activeByDefault>
|
||||||
|
</activation>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly</groupId>
|
||||||
|
<artifactId>wildfly-arquillian-container-managed</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<properties>
|
||||||
|
<install.directory>${project.build.directory}/install</install.directory>
|
||||||
|
<jbossHome>${install.directory}/keycloak-${project.version}</jbossHome>
|
||||||
|
</properties>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<version>2.10</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>unpack</id>
|
||||||
|
<phase>process-test-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>unpack</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<artifactItems>
|
||||||
|
<artifactItem>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-server-dist</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<type>zip</type>
|
||||||
|
<overWrite>false</overWrite>
|
||||||
|
</artifactItem>
|
||||||
|
</artifactItems>
|
||||||
|
<outputDirectory>${install.directory}</outputDirectory>
|
||||||
|
<overWriteReleases>false</overWriteReleases>
|
||||||
|
<overWriteSnapshots>true</overWriteSnapshots>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<shouldDeploy>false</shouldDeploy>
|
||||||
|
<arquillian.launch>wildfly-8-managed</arquillian.launch>
|
||||||
|
<browser>${browser}</browser>
|
||||||
|
<jbossHome>${jbossHome}</jbossHome>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import org.jboss.arquillian.graphene.page.Page;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
* @param <P>
|
||||||
|
*/
|
||||||
|
public abstract class AbstractKeyCloakTest<P extends AbstractPage> extends AbstractTest {
|
||||||
|
|
||||||
|
@Page
|
||||||
|
protected P page;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
|
||||||
|
driver.manage().window().maximize();
|
||||||
|
loginAsAdmin();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
logOut();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.drone.api.annotation.Drone;
|
||||||
|
import org.jboss.arquillian.graphene.page.Page;
|
||||||
|
import org.jboss.arquillian.junit.Arquillian;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.Navigation;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.MenuPage;
|
||||||
|
import org.keycloak.testsuite.ui.page.LoginPage;
|
||||||
|
import org.keycloak.testsuite.ui.page.account.PasswordPage;
|
||||||
|
import static org.keycloak.testsuite.ui.util.Constants.ADMIN_PSSWD;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.URL.BASE_URL;
|
||||||
|
import org.openqa.selenium.WebDriver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
@RunWith(Arquillian.class)
|
||||||
|
public abstract class AbstractTest {
|
||||||
|
|
||||||
|
private static boolean firstAdminLogin = Boolean.parseBoolean(
|
||||||
|
System.getProperty("firstAdminLogin", "true"));
|
||||||
|
|
||||||
|
@Page
|
||||||
|
protected LoginPage loginPage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
protected PasswordPage passwordPage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
protected MenuPage menuPage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
protected Navigation navigation;
|
||||||
|
|
||||||
|
@Drone
|
||||||
|
protected WebDriver driver;
|
||||||
|
|
||||||
|
public void logOut() {
|
||||||
|
menuPage.logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loginAsAdmin() {
|
||||||
|
driver.get(BASE_URL);
|
||||||
|
loginPage.loginAsAdmin();
|
||||||
|
if (firstAdminLogin) {
|
||||||
|
passwordPage.confirmNewPassword(ADMIN_PSSWD);
|
||||||
|
passwordPage.submit();
|
||||||
|
firstAdminLogin = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.drone.api.annotation.Drone;
|
||||||
|
import static org.openqa.selenium.By.id;
|
||||||
|
import org.openqa.selenium.WebDriver;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class CreateRealm {
|
||||||
|
|
||||||
|
@FindBy(css = ".btn-primary")
|
||||||
|
private WebElement primaryButton;
|
||||||
|
|
||||||
|
@Drone
|
||||||
|
private WebDriver driver;
|
||||||
|
|
||||||
|
public void importRealm(String filePath) {
|
||||||
|
driver.findElement(id("import-file")).sendKeys(filePath);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createRealm(String name, boolean on) {
|
||||||
|
driver.findElement(id("name")).sendKeys(name);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createRealm(String name) {
|
||||||
|
createRealm(name, true);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import static org.jboss.arquillian.graphene.Graphene.waitGui;
|
||||||
|
import org.jboss.arquillian.graphene.fragment.Root;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class FlashMessage {
|
||||||
|
|
||||||
|
@Root
|
||||||
|
private WebElement root;
|
||||||
|
|
||||||
|
public boolean isSuccess() {
|
||||||
|
waitGui().until("Flash message should be success")
|
||||||
|
.element(root)
|
||||||
|
.attribute("class")
|
||||||
|
.contains("success");
|
||||||
|
return root.getAttribute("class").contains("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isError() {
|
||||||
|
waitGui().until("Flash message should be error")
|
||||||
|
.element(root)
|
||||||
|
.attribute("class")
|
||||||
|
.contains("error");
|
||||||
|
return root.getAttribute("class").contains("error");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDanger() {
|
||||||
|
waitGui().until("Flash message should be danger")
|
||||||
|
.element(root)
|
||||||
|
.attribute("class")
|
||||||
|
.contains("danger");
|
||||||
|
return root.getAttribute("class").contains("danger");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return root.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void waitUntilPresent() {
|
||||||
|
waitGuiForElement(root, "Flash message should be visible.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class MenuPage {
|
||||||
|
|
||||||
|
private static final String MENU_LOCATOR = "ul[class='dropdown-menu']";
|
||||||
|
|
||||||
|
@FindBy(css = MENU_LOCATOR)
|
||||||
|
private List<WebElement> menuList;
|
||||||
|
|
||||||
|
@FindBy(css = ".dropdown-toggle")
|
||||||
|
private List<WebElement> toggle;
|
||||||
|
|
||||||
|
public void logOut() {
|
||||||
|
clickOnMenuElement(Menu.USER, "Sign Out");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToAccountManagement() {
|
||||||
|
clickOnMenuElement(Menu.USER, "Manage Account");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void switchRealm(String realmName) {
|
||||||
|
clickOnMenuElement(Menu.REALM, realmName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrentRealm() {
|
||||||
|
waitGuiForElement(By.cssSelector(MENU_LOCATOR));
|
||||||
|
return toggle.get(1).getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clickOnMenuElement(Menu menuType, String linkText) {
|
||||||
|
int menuOrder = 0;
|
||||||
|
switch(menuType) {
|
||||||
|
case REALM: menuOrder = 1; break;
|
||||||
|
case USER: menuOrder = 0; break;
|
||||||
|
}
|
||||||
|
waitGuiForElement(By.cssSelector(MENU_LOCATOR));
|
||||||
|
if (!menuList.get(menuOrder).isDisplayed())
|
||||||
|
toggle.get(menuOrder).click();
|
||||||
|
for (WebElement item : menuList.get(menuOrder).findElements(By.cssSelector(MENU_LOCATOR + " a"))) {
|
||||||
|
if (item.getText().contains(linkText)) {
|
||||||
|
item.click();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Could not find menu item containing \"" + linkText + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum Menu {
|
||||||
|
USER, REALM
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.drone.api.annotation.Drone;
|
||||||
|
import static org.jboss.arquillian.graphene.Graphene.waitModel;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebDriver;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class Navigation {
|
||||||
|
|
||||||
|
@Drone
|
||||||
|
private WebDriver driver;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Settings')")
|
||||||
|
private WebElement settingsLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Users')")
|
||||||
|
private WebElement usersLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Roles')")
|
||||||
|
private WebElement rolesLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Clients')")
|
||||||
|
private WebElement clientsLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('OAuth')")
|
||||||
|
private WebElement oauthLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Tokens')")
|
||||||
|
private WebElement tokensLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Sessions')")
|
||||||
|
private WebElement sessionLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Security Defenses')")
|
||||||
|
private WebElement securityLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Events')")
|
||||||
|
private WebElement eventsLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Login')")
|
||||||
|
private WebElement loginLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Themes')")
|
||||||
|
private WebElement themesLink;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Role Mappings')")
|
||||||
|
private WebElement usersRoleMappings;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Add Realm')")
|
||||||
|
private WebElement addRealm;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Credentials')")
|
||||||
|
private WebElement credentials;
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Attributes')")
|
||||||
|
private WebElement attributes;
|
||||||
|
|
||||||
|
@FindBy(css = "div h1")
|
||||||
|
private WebElement currentHeader;
|
||||||
|
|
||||||
|
public void selectRealm(String realmName) {
|
||||||
|
driver.findElement(By.linkText(realmName)).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void settings() {
|
||||||
|
openPage(settingsLink, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void users() {
|
||||||
|
openPage(usersLink, "Users");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void roles() {
|
||||||
|
openPage(rolesLink, "Roles");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clients() {
|
||||||
|
openPage(clientsLink, "Clients");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void oauth() {
|
||||||
|
openPage(oauthLink, "OAuth Clients");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tokens() {
|
||||||
|
openPage(tokensLink, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sessions() {
|
||||||
|
openPage(sessionLink, "Sessions");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void security() {
|
||||||
|
openPage(securityLink, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void events() {
|
||||||
|
openPage(eventsLink, "Events");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void login() {
|
||||||
|
openPage(loginLink, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void themes() {
|
||||||
|
openPage(themesLink, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void roleMappings() {
|
||||||
|
openPage(usersRoleMappings, "User");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addRealm() {
|
||||||
|
openPage(addRealm, "Add Realm");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void credentials() {
|
||||||
|
openPage(credentials, "Settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void attributes() {
|
||||||
|
openPage(attributes, "Attributes");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openPage(WebElement page, String headerText) {
|
||||||
|
waitGuiForElement(page);
|
||||||
|
page.click();
|
||||||
|
waitModel().until().element(currentHeader).text().contains(headerText);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.fragment.Root;
|
||||||
|
import org.jboss.arquillian.test.api.ArquillianResource;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.interactions.Actions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class OnOffSwitch {
|
||||||
|
|
||||||
|
@Root
|
||||||
|
private WebElement root;
|
||||||
|
|
||||||
|
@ArquillianResource
|
||||||
|
private Actions actions;
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return root.findElement(By.tagName("input")).isSelected();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void click() {
|
||||||
|
actions.moveToElement(root.findElements(By.tagName("span")).get(0))
|
||||||
|
.click().build().perform();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toggle() {
|
||||||
|
click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enable() {
|
||||||
|
if(!isEnabled()) {
|
||||||
|
click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disable() {
|
||||||
|
if(isEnabled()) {
|
||||||
|
click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.fragment;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.fragment.Root;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PickList {
|
||||||
|
|
||||||
|
@Root
|
||||||
|
private WebElement root;
|
||||||
|
|
||||||
|
private Select firstSelect;
|
||||||
|
private Select secondSelect;
|
||||||
|
|
||||||
|
@FindBy(className = "kc-icon-arrow-right")
|
||||||
|
private WebElement rightArrow;
|
||||||
|
|
||||||
|
@FindBy(className = "kc-icon-arrow-left")
|
||||||
|
private WebElement leftArrow;
|
||||||
|
|
||||||
|
public void addItems(String... values) {
|
||||||
|
for(String value : values) {
|
||||||
|
firstSelect.selectByVisibleText(value);
|
||||||
|
}
|
||||||
|
rightArrow.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstSelect(By locator) {
|
||||||
|
firstSelect = new Select(root.findElement(locator));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecondSelect(By locator) {
|
||||||
|
secondSelect = new Select(root.findElement(locator));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class Account {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
private String lastName;
|
||||||
|
|
||||||
|
private String firstName;
|
||||||
|
|
||||||
|
public Account(String username, String email, String lastName, String firstName) {
|
||||||
|
this.username = username;
|
||||||
|
this.email = email;
|
||||||
|
this.lastName = lastName;
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
Account account = (Account) o;
|
||||||
|
|
||||||
|
if (email != null ? !email.equals(account.email) : account.email != null) return false;
|
||||||
|
if (firstName != null ? !firstName.equals(account.firstName) : account.firstName != null) return false;
|
||||||
|
if (lastName != null ? !lastName.equals(account.lastName) : account.lastName != null) return false;
|
||||||
|
if (username != null ? !username.equals(account.username) : account.username != null) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = username != null ? username.hashCode() : 0;
|
||||||
|
result = 31 * result + (email != null ? email.hashCode() : 0);
|
||||||
|
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
|
||||||
|
result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class Client {
|
||||||
|
|
||||||
|
private String clientId;
|
||||||
|
private String name;
|
||||||
|
private boolean enabled;
|
||||||
|
private String accessType;
|
||||||
|
private String uri;
|
||||||
|
|
||||||
|
public Client(String clientId, String uri) {
|
||||||
|
this.name = clientId;
|
||||||
|
this.clientId = clientId;
|
||||||
|
this.uri = uri;
|
||||||
|
this.enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client(String clientId, String name, String uri) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
this.uri = uri;
|
||||||
|
this.enabled = true;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client(String name, String uri, String accessType, boolean enabled) {
|
||||||
|
this.name = name;
|
||||||
|
this.uri = uri;
|
||||||
|
this.accessType = accessType;
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() { return name; }
|
||||||
|
|
||||||
|
public void setName(String name) { this.name = name; }
|
||||||
|
|
||||||
|
public boolean isEnabled() { return enabled; }
|
||||||
|
|
||||||
|
public void setEnabled(boolean enabled) { this.enabled = enabled; }
|
||||||
|
|
||||||
|
public String getAccessType() { return accessType; }
|
||||||
|
|
||||||
|
public void setAccessType(String accessType) { this.accessType = accessType; }
|
||||||
|
|
||||||
|
public String getUri() { return uri; }
|
||||||
|
|
||||||
|
public void setUri(String uri) { this.uri = uri; }
|
||||||
|
|
||||||
|
public String getClientId() {
|
||||||
|
return clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientId(String clientId) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
Client that = (Client) o;
|
||||||
|
|
||||||
|
if (enabled != that.enabled) return false;
|
||||||
|
if (accessType != null ? !accessType.equals(that.accessType) : that.accessType != null) return false;
|
||||||
|
if (!name.equals(that.name)) return false;
|
||||||
|
if (!uri.equals(that.uri)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = name.hashCode();
|
||||||
|
result = 31 * result + (enabled ? 1 : 0);
|
||||||
|
result = 31 * result + (accessType != null ? accessType.hashCode() : 0);
|
||||||
|
result = 31 * result + uri.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public enum PasswordPolicy {
|
||||||
|
|
||||||
|
HASH_ITERATIONS("Hash Iterations"), LENGTH("Length"), DIGITS("Digits"), LOWER_CASE("Lower Case"),
|
||||||
|
UPPER_CASE("Upper Case"), SPECIAL_CHARS("Special Chars");
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private PasswordPolicy(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class Provider {
|
||||||
|
|
||||||
|
public SocialProvider providerName;
|
||||||
|
public String key;
|
||||||
|
public String secret;
|
||||||
|
|
||||||
|
public Provider() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Provider(SocialProvider providerName, String key, String secret) {
|
||||||
|
this.providerName = providerName;
|
||||||
|
this.key = key;
|
||||||
|
this.secret = secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class Role {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private boolean composite;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public Role() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Role(String name) {
|
||||||
|
this(name, false, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Role(String name, boolean composite) {
|
||||||
|
this(name, composite, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Role(String name, boolean composite, String description) {
|
||||||
|
this.name = name;
|
||||||
|
this.composite = composite;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isComposite() {
|
||||||
|
return composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComposite(boolean composite) {
|
||||||
|
this.composite = composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public enum SocialProvider {
|
||||||
|
|
||||||
|
FACEBOOK("Facebook"), GITHUB("Github"), GOOGLE("Google"), TWITTER("Twitter");
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private SocialProvider(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public enum Theme {
|
||||||
|
|
||||||
|
BASE("base"), KEYCLOAK("keycloak"), PATTERNFLY("patternfly");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private Theme(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,146 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class User {
|
||||||
|
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
private String firstName;
|
||||||
|
|
||||||
|
private String lastName;
|
||||||
|
|
||||||
|
private boolean userEnabled;
|
||||||
|
|
||||||
|
private boolean emailVerified;
|
||||||
|
|
||||||
|
private String requiredUserActions;
|
||||||
|
|
||||||
|
public User() {
|
||||||
|
this.userEnabled = true;
|
||||||
|
this.emailVerified = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(String userName) {
|
||||||
|
this();
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(String userName, String password) {
|
||||||
|
this(userName);
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(String userName, String password, String email) {
|
||||||
|
this(userName, password);
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(String userName, String password, String email, String firstName, String lastName) {
|
||||||
|
this(userName, password, email);
|
||||||
|
this.firstName = firstName;
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(String userName, String password, String email, String firstName, String lastName, boolean userEnabled, boolean emailVerified, String requiredUserActions) {
|
||||||
|
this(userName, password, email, firstName, lastName);
|
||||||
|
this.requiredUserActions = requiredUserActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(User user) {
|
||||||
|
this(user.userName, user.password, user.email, user.firstName, user.lastName,
|
||||||
|
user.userEnabled, user.emailVerified, user.requiredUserActions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserName() { return userName; }
|
||||||
|
|
||||||
|
public void setUserName(String userName) { this.userName = userName; }
|
||||||
|
|
||||||
|
public String getEmail() { return email; }
|
||||||
|
|
||||||
|
public void setEmail(String email) { this.email = email; }
|
||||||
|
|
||||||
|
public String getFirstName() { return firstName; }
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) { this.firstName = firstName; }
|
||||||
|
|
||||||
|
public String getLastName() { return lastName; }
|
||||||
|
|
||||||
|
public void setLastName(String lastName) { this.lastName = lastName; }
|
||||||
|
|
||||||
|
public boolean isUserEnabled() { return userEnabled; }
|
||||||
|
|
||||||
|
public void setUserEnabled(boolean userEnabled) { this.userEnabled = userEnabled; }
|
||||||
|
|
||||||
|
public boolean isEmailVerified() { return emailVerified; }
|
||||||
|
|
||||||
|
public void setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; }
|
||||||
|
|
||||||
|
public String getRequiredUserActions() { return requiredUserActions; }
|
||||||
|
|
||||||
|
public void setRequiredUserActions(String requiredUserActions) { this.requiredUserActions = requiredUserActions; }
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
User user = (User) o;
|
||||||
|
|
||||||
|
if (emailVerified != user.emailVerified) return false;
|
||||||
|
if (userEnabled != user.userEnabled) return false;
|
||||||
|
if (email != null ? !email.equals(user.email) : user.email != null) return false;
|
||||||
|
if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false;
|
||||||
|
if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false;
|
||||||
|
if (requiredUserActions != null ? !requiredUserActions.equals(user.requiredUserActions) : user.requiredUserActions != null)
|
||||||
|
return false;
|
||||||
|
if (!userName.equals(user.userName)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = userName.hashCode();
|
||||||
|
result = 31 * result + (email != null ? email.hashCode() : 0);
|
||||||
|
result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
|
||||||
|
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
|
||||||
|
result = 31 * result + (userEnabled ? 1 : 0);
|
||||||
|
result = 31 * result + (emailVerified ? 1 : 0);
|
||||||
|
result = 31 * result + (requiredUserActions != null ? requiredUserActions.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public enum UserAction {
|
||||||
|
|
||||||
|
UPDATE_PASSWORD("Update Password"), VERIFY_EMAIL("Verify Email"), UPDATE_PROFILE("Update Profile"), CONFIGURE_TOTP("Configure Totp");
|
||||||
|
|
||||||
|
private final String actionName;
|
||||||
|
|
||||||
|
private UserAction(String actionName) {
|
||||||
|
this.actionName = actionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getActionName() {
|
||||||
|
return actionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.jboss.arquillian.drone.api.annotation.Drone;
|
||||||
|
import org.keycloak.testsuite.ui.util.Constants;
|
||||||
|
import org.openqa.selenium.WebDriver;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class AbstractPage {
|
||||||
|
|
||||||
|
@Drone
|
||||||
|
protected WebDriver driver;
|
||||||
|
|
||||||
|
@FindBy(css = ".btn-danger")
|
||||||
|
protected WebElement dangerButton;
|
||||||
|
|
||||||
|
//@FindByJQuery(".btn-primary:visible")
|
||||||
|
@FindBy(css = ".btn-primary")
|
||||||
|
protected WebElement primaryButton;
|
||||||
|
|
||||||
|
@FindBy(css = ".btn-primary")
|
||||||
|
protected List<WebElement> primaryButtons;
|
||||||
|
|
||||||
|
|
||||||
|
@FindBy(css = ".ng-binding.btn.btn-danger")
|
||||||
|
protected WebElement deleteConfirmationButton;
|
||||||
|
|
||||||
|
public void goToPage(String page) {
|
||||||
|
driver.get(String.format(page, Constants.CURRENT_REALM));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.Constants.ADMIN_PSSWD;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class LoginPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "username")
|
||||||
|
private WebElement usernameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "password")
|
||||||
|
private WebElement passwordInput;
|
||||||
|
|
||||||
|
@FindBy(linkText = "Register")
|
||||||
|
private WebElement registerLink;
|
||||||
|
|
||||||
|
@FindBy(id = "kc-header")
|
||||||
|
private WebElement loginPageHeader;
|
||||||
|
|
||||||
|
public void login(String username, String password) {
|
||||||
|
waitGuiForElement(usernameInput, "Login form should be visible");
|
||||||
|
usernameInput.sendKeys(username);
|
||||||
|
passwordInput.sendKeys(password);
|
||||||
|
passwordInput.submit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loginAsAdmin() {
|
||||||
|
login("admin", ADMIN_PSSWD);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToUserRegistration() {
|
||||||
|
waitGuiForElement(usernameInput, "Login form should be visible");
|
||||||
|
registerLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLoginPageHeaderText() {
|
||||||
|
return loginPageHeader.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WebElement getLoginPageHeader() {
|
||||||
|
return loginPageHeader;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.model.User;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class RegisterPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "username")
|
||||||
|
private WebElement usernameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "email")
|
||||||
|
private WebElement emailInput;
|
||||||
|
|
||||||
|
@FindBy(id = "firstName")
|
||||||
|
private WebElement firstNameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "lastName")
|
||||||
|
private WebElement lastNameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "password")
|
||||||
|
private WebElement passwordInput;
|
||||||
|
|
||||||
|
@FindBy(id = "password-confirm")
|
||||||
|
private WebElement passwordConfirmInput;
|
||||||
|
|
||||||
|
@FindBy(css = "span.kc-feedback-text")
|
||||||
|
private WebElement feedbackError;
|
||||||
|
|
||||||
|
@FindBy(css = "div[id='kc-form-options'] span a")
|
||||||
|
private WebElement backToLoginForm;
|
||||||
|
|
||||||
|
public void registerNewUser(User user) {
|
||||||
|
registerNewUser(user, user.getPassword());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerNewUser(User user, String confirmPassword) {
|
||||||
|
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
|
||||||
|
waitGuiForElement(passwordConfirmInput, "Register form should be visible");
|
||||||
|
clearAndType(usernameInput, user.getUserName());
|
||||||
|
clearAndType(firstNameInput, user.getFirstName());
|
||||||
|
clearAndType(lastNameInput, user.getLastName());
|
||||||
|
clearAndType(emailInput, user.getEmail());
|
||||||
|
clearAndType(passwordInput, user.getPassword());
|
||||||
|
clearAndType(passwordConfirmInput, confirmPassword);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearAndType(WebElement webElement, String text) {
|
||||||
|
webElement.clear();
|
||||||
|
webElement.sendKeys(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInvalidEmail() {
|
||||||
|
waitGuiForElement(feedbackError, "Feedback message should be visible");
|
||||||
|
return feedbackError.getText().equals("Invalid email address.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAttributeSpecified(String attribute) {
|
||||||
|
waitGuiForElement(feedbackError, "Feedback message should be visible");
|
||||||
|
return !feedbackError.getText().contains("Please specify " + attribute + ".");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPasswordSame() {
|
||||||
|
waitGuiForElement(feedbackError, "Feedback message should be visible");
|
||||||
|
return !feedbackError.getText().equals("Password confirmation doesn't match.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void backToLoginPage() {
|
||||||
|
backToLoginForm.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.account;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.keycloak.testsuite.ui.model.Account;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class AccountPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "username")
|
||||||
|
private WebElement username;
|
||||||
|
|
||||||
|
@FindBy(id = "email")
|
||||||
|
private WebElement email;
|
||||||
|
|
||||||
|
@FindBy(id = "lastName")
|
||||||
|
private WebElement lastName;
|
||||||
|
|
||||||
|
@FindBy(id = "firstName")
|
||||||
|
private WebElement firstName;
|
||||||
|
|
||||||
|
@FindByJQuery("button[value='Save']")
|
||||||
|
private WebElement save;
|
||||||
|
|
||||||
|
@FindByJQuery(".nav li:eq(0) a")
|
||||||
|
private WebElement keyclockConsole;
|
||||||
|
|
||||||
|
@FindByJQuery(".nav li:eq(1) a")
|
||||||
|
private WebElement signOutLink;
|
||||||
|
|
||||||
|
@FindByJQuery(".bs-sidebar ul li:eq(0) a")
|
||||||
|
private WebElement accountLink;
|
||||||
|
|
||||||
|
@FindByJQuery(".bs-sidebar ul li:eq(1) a")
|
||||||
|
private WebElement passwordLink;
|
||||||
|
|
||||||
|
@FindByJQuery(".bs-sidebar ul li:eq(2) a")
|
||||||
|
private WebElement authenticatorLink;
|
||||||
|
|
||||||
|
@FindByJQuery(".bs-sidebar ul li:eq(3) a")
|
||||||
|
private WebElement sessionsLink;
|
||||||
|
|
||||||
|
|
||||||
|
public Account getAccount() {
|
||||||
|
return new Account(username.getAttribute("value"), email.getAttribute("value"), lastName.getAttribute("value"), firstName.getAttribute("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccount(Account account) {
|
||||||
|
email.clear();
|
||||||
|
email.sendKeys(account.getEmail());
|
||||||
|
lastName.clear();
|
||||||
|
lastName.sendKeys(account.getLastName());
|
||||||
|
firstName.clear();
|
||||||
|
firstName.sendKeys(account.getFirstName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
save.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void keycloakConsole() {
|
||||||
|
keyclockConsole.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void signOut() {
|
||||||
|
signOutLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void account() {
|
||||||
|
accountLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void password() {
|
||||||
|
passwordLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void authenticator() {
|
||||||
|
authenticatorLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sessions() {
|
||||||
|
sessionsLink.click();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.account;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class PasswordPage {
|
||||||
|
|
||||||
|
@FindBy(id = "password")
|
||||||
|
private WebElement passwordInput;
|
||||||
|
|
||||||
|
@FindBy(id = "password-new")
|
||||||
|
private WebElement newPasswordInput;
|
||||||
|
|
||||||
|
@FindBy(id = "password-confirm")
|
||||||
|
private WebElement confirmInput;
|
||||||
|
|
||||||
|
@FindByJQuery("button[value='Save']")
|
||||||
|
private WebElement save;
|
||||||
|
|
||||||
|
@FindBy(xpath = "//input[@value='Submit']")
|
||||||
|
private WebElement submit; // on "update password" page, after first login
|
||||||
|
|
||||||
|
public void setPassword(String oldPassword, String newPassword) {
|
||||||
|
passwordInput.clear();
|
||||||
|
passwordInput.sendKeys(oldPassword);
|
||||||
|
confirmNewPassword(newPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void confirmNewPassword(String newPassword) {
|
||||||
|
newPasswordInput.clear();
|
||||||
|
newPasswordInput.sendKeys(newPassword);
|
||||||
|
confirmInput.clear();
|
||||||
|
confirmInput.sendKeys(newPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOldPasswordField(String oldPassword) {
|
||||||
|
passwordInput.clear();
|
||||||
|
passwordInput.sendKeys(oldPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewPasswordField(String newPassword) {
|
||||||
|
newPasswordInput.clear();
|
||||||
|
newPasswordInput.sendKeys(newPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfirmField(String confirmPassword) {
|
||||||
|
confirmInput.clear();
|
||||||
|
confirmInput.sendKeys(confirmPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
save.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void submit() {
|
||||||
|
submit.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.session;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class SessionsPage extends AbstractPage {
|
||||||
|
|
||||||
|
public void logoutAllSessions() {
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.model.Client;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.jboss.arquillian.graphene.findby.ByJQuery;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitAjaxForElement;
|
||||||
|
import static org.openqa.selenium.By.cssSelector;
|
||||||
|
import static org.openqa.selenium.By.linkText;
|
||||||
|
import static org.openqa.selenium.By.tagName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kisss
|
||||||
|
*/
|
||||||
|
public class ClientPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "clientId")
|
||||||
|
private WebElement clientId;
|
||||||
|
|
||||||
|
@FindBy(id = "name")
|
||||||
|
private WebElement nameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "")
|
||||||
|
private WebElement enabledSwitchToggle;
|
||||||
|
|
||||||
|
@FindBy(id = "accessType")
|
||||||
|
private WebElement accessTypeDropDownMenu;
|
||||||
|
|
||||||
|
@FindBy(id = "newRedirectUri")
|
||||||
|
private WebElement redirectUriInput;
|
||||||
|
|
||||||
|
@FindBy(css = "table[class*='table']")
|
||||||
|
private WebElement dataTable;
|
||||||
|
|
||||||
|
@FindBy(css = "input[class*='search']")
|
||||||
|
private WebElement searchInput;
|
||||||
|
|
||||||
|
public void addClient(Client client) {
|
||||||
|
primaryButton.click();
|
||||||
|
waitAjaxForElement(clientId);
|
||||||
|
clientId.sendKeys(client.getClientId());
|
||||||
|
nameInput.sendKeys(client.getName());
|
||||||
|
if (!client.isEnabled()) {
|
||||||
|
enabledSwitchToggle.click();
|
||||||
|
}
|
||||||
|
accessTypeDropDownMenu.sendKeys(client.getAccessType());
|
||||||
|
redirectUriInput.sendKeys(client.getUri());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addUri(String uri) {
|
||||||
|
redirectUriInput.sendKeys(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeUri(Client client) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void confirmAddClient() {
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteClient(String clientName) {
|
||||||
|
searchInput.sendKeys(clientName);
|
||||||
|
driver.findElement(linkText(clientName)).click();
|
||||||
|
waitAjaxForElement(dangerButton);
|
||||||
|
dangerButton.click();
|
||||||
|
waitAjaxForElement(deleteConfirmationButton);
|
||||||
|
deleteConfirmationButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client findClient(String clientName) {
|
||||||
|
waitAjaxForElement(searchInput);
|
||||||
|
searchInput.sendKeys(clientName);
|
||||||
|
List<Client> clients = getAllRows();
|
||||||
|
if (clients.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
assertEquals(1, clients.size());
|
||||||
|
return clients.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Client> getAllRows() {
|
||||||
|
List<Client> rows = new ArrayList<Client>();
|
||||||
|
List<WebElement> allRows = dataTable.findElements(cssSelector("tbody tr"));
|
||||||
|
if (allRows.size() > 1) {
|
||||||
|
for (WebElement rowElement : allRows) {
|
||||||
|
if (rowElement.isDisplayed()) {
|
||||||
|
Client client = new Client();
|
||||||
|
List<WebElement> tds = rowElement.findElements(tagName("td"));
|
||||||
|
client.setClientId(tds.get(0).getText());
|
||||||
|
client.setUri(tds.get(2).getText());
|
||||||
|
rows.add(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToCreateClient() {
|
||||||
|
driver.findElements(ByJQuery.selector(".btn.btn-primary")).get(0).click();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.jboss.arquillian.graphene.findby.ByJQuery;
|
||||||
|
import org.keycloak.testsuite.ui.model.PasswordPolicy;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class CredentialsPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(tagName = "select")
|
||||||
|
private Select addPolicySelect;
|
||||||
|
|
||||||
|
@FindBy(css = "tr.ng-scope")
|
||||||
|
private List<WebElement> allRows;
|
||||||
|
|
||||||
|
public void addPolicy(PasswordPolicy policy, int value) {
|
||||||
|
addPolicySelect.selectByVisibleText(policy.getName());
|
||||||
|
setPolicyValue(policy, value);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removePolicy(PasswordPolicy policy) {
|
||||||
|
int policyInputLocation = findPolicy(policy);
|
||||||
|
allRows.get(policyInputLocation).findElements(By.tagName("i")).get(0).click();
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editPolicy(PasswordPolicy policy, int value) {
|
||||||
|
setPolicyValue(policy, value);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPolicyValue(PasswordPolicy policy, int value) {
|
||||||
|
int policyInputLocation = findPolicy(policy);
|
||||||
|
allRows.get(policyInputLocation).findElement(By.tagName("input")).sendKeys(String.valueOf(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int findPolicy(PasswordPolicy policy) {
|
||||||
|
for (int i = 0; i < allRows.size(); i++) {
|
||||||
|
String policyName = allRows.get(i).findElement(ByJQuery.selector("td:eq(0)")).getText();
|
||||||
|
if(policyName.equals(policy.getName()))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.PickList;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Role;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class DefaultRolesPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "")
|
||||||
|
private PickList realmDefaultRoles;
|
||||||
|
|
||||||
|
@FindBy(id = "")
|
||||||
|
private PickList applicationDefaultRoles;
|
||||||
|
|
||||||
|
@FindBy(id = "applications")
|
||||||
|
private Select applicationsSelect;
|
||||||
|
|
||||||
|
public void addDefaultRealmRoles(String... roles) {
|
||||||
|
realmDefaultRoles.addItems(roles);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addDefaultRealmRoles(Role... roles) {
|
||||||
|
List<String> roleList = new ArrayList<String>();
|
||||||
|
for(Role role : roles) {
|
||||||
|
roleList.add(role.getName());
|
||||||
|
}
|
||||||
|
addDefaultRealmRoles(((String []) roleList.toArray()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Theme;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class GeneralSettingsPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "name")
|
||||||
|
private WebElement realmName;
|
||||||
|
|
||||||
|
@FindBy(id = "enabled")
|
||||||
|
private WebElement realmEnabled;
|
||||||
|
|
||||||
|
@FindBy(id = "updateProfileOnInitialSocialLogin")
|
||||||
|
private WebElement updateProfileOnInitialSocialLogin;
|
||||||
|
|
||||||
|
@FindBy(id = "passwordCredentialGrantAllowed")
|
||||||
|
private WebElement passwordCredentialGrantAllowed;
|
||||||
|
|
||||||
|
@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(Theme theme) {
|
||||||
|
loginThemeSelect.selectByVisibleText(theme.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selecAccountTheme(Theme theme) {
|
||||||
|
accountThemeSelect.selectByVisibleText(theme.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectAdminTheme(Theme theme) {
|
||||||
|
adminThemeSelect.selectByVisibleText(theme.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectEmailTheme(Theme theme) {
|
||||||
|
emailThemeSelect.selectByVisibleText(theme.getName());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.OnOffSwitch;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class LoginSettingsPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(0)")
|
||||||
|
private OnOffSwitch registrationAllowed;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(1)")
|
||||||
|
private OnOffSwitch resetPasswordAllowed;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(2)")
|
||||||
|
private OnOffSwitch rememberMeEnabled;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(3)")
|
||||||
|
private OnOffSwitch verifyEmailEnabled;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(4)")
|
||||||
|
private OnOffSwitch directGrantApiEnabled;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']:eq(5)")
|
||||||
|
private OnOffSwitch requireSsl;
|
||||||
|
|
||||||
|
public boolean isUserRegistrationAllowed() {
|
||||||
|
return registrationAllowed.isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enableUserRegistration() {
|
||||||
|
registrationAllowed.enable();
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disableUserRegistration() {
|
||||||
|
registrationAllowed.disable();
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Role;
|
||||||
|
import static org.openqa.selenium.By.cssSelector;
|
||||||
|
import static org.openqa.selenium.By.linkText;
|
||||||
|
import static org.openqa.selenium.By.tagName;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.*;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class RolesPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(css = "input[class*='search']")
|
||||||
|
private WebElement searchInput;
|
||||||
|
|
||||||
|
@FindBy(css = "table[class*='table']")
|
||||||
|
private WebElement dataTable;
|
||||||
|
|
||||||
|
@FindBy(id = "name")
|
||||||
|
private WebElement nameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "description")
|
||||||
|
private WebElement descriptionInput;
|
||||||
|
|
||||||
|
@FindBy(id = "compositeSwitch")
|
||||||
|
private WebElement compositeSwitchToggle;
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isRoleComposite(String roleName) {
|
||||||
|
return findRole(roleName).isComposite();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addRole(Role role) {
|
||||||
|
primaryButton.click();
|
||||||
|
waitAjaxForElement(nameInput);
|
||||||
|
nameInput.sendKeys(role.getName());
|
||||||
|
if (role.isComposite()) {
|
||||||
|
compositeSwitchToggle.click();
|
||||||
|
}
|
||||||
|
descriptionInput.sendKeys(role.getDescription());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Role findRole(String roleName) {
|
||||||
|
searchInput.sendKeys(roleName);
|
||||||
|
List<Role> roles = getAllRows();
|
||||||
|
assertEquals(1, roles.size());
|
||||||
|
return roles.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editRole(Role role) {
|
||||||
|
driver.findElement(linkText(role.getName())).click();
|
||||||
|
waitAjaxForElement(nameInput);
|
||||||
|
nameInput.sendKeys(role.getName());
|
||||||
|
if (role.isComposite()) {
|
||||||
|
compositeSwitchToggle.click();
|
||||||
|
}
|
||||||
|
descriptionInput.sendKeys(role.getDescription());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteRole(Role role) {
|
||||||
|
driver.findElement(linkText(role.getName())).click();
|
||||||
|
waitAjaxForElement(dangerButton);
|
||||||
|
dangerButton.click();
|
||||||
|
deleteConfirmationButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteRole(String name) {
|
||||||
|
deleteRole(new Role(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Role> getAllRows() {
|
||||||
|
List<Role> rows = new ArrayList<Role>();
|
||||||
|
for (WebElement rowElement : dataTable.findElements(cssSelector("tbody tr"))) {
|
||||||
|
Role role = new Role();
|
||||||
|
List<WebElement> tds = rowElement.findElements(tagName("td"));
|
||||||
|
if(!(tds.isEmpty() || tds.get(0).getText().isEmpty())) {
|
||||||
|
role.setName(tds.get(0).getText());
|
||||||
|
role.setComposite(Boolean.valueOf(tds.get(1).getText()));
|
||||||
|
role.setDescription(tds.get(2).getText());
|
||||||
|
rows.add(role);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.OnOffSwitch;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.keycloak.testsuite.ui.util.SeleniumUtils;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class SecurityPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindByJQuery("a:contains('Brute Force Detection')")
|
||||||
|
private WebElement bruteForceProtectionLink;
|
||||||
|
|
||||||
|
@FindByJQuery("div[class='onoffswitch']")
|
||||||
|
private OnOffSwitch protectionEnabled;
|
||||||
|
|
||||||
|
@FindBy(id = "failureFactor")
|
||||||
|
private WebElement failureFactorInput;
|
||||||
|
|
||||||
|
@FindBy(id = "waitIncrement")
|
||||||
|
private WebElement waitIncrementInput;
|
||||||
|
|
||||||
|
@FindBy(id = "waitIncrementUnit")
|
||||||
|
private Select waitIncrementSelect;
|
||||||
|
|
||||||
|
@FindBy(id = "quickLoginCheckMilliSeconds")
|
||||||
|
private WebElement quickLoginCheckInput;
|
||||||
|
|
||||||
|
@FindBy(id = "minimumQuickLoginWait")
|
||||||
|
private WebElement minQuickLoginWaitInput;
|
||||||
|
|
||||||
|
@FindBy(id = "minimumQuickLoginWaitUnit")
|
||||||
|
private Select minQuickLoginWaitSelect;
|
||||||
|
|
||||||
|
@FindBy(id = "maxFailureWait")
|
||||||
|
private WebElement maxWaitInput;
|
||||||
|
|
||||||
|
@FindBy(id = "maxFailureWaitUnit")
|
||||||
|
private Select maxWaitSelect;
|
||||||
|
|
||||||
|
@FindBy(id = "maxDeltaTime")
|
||||||
|
private WebElement failureResetTimeInput;
|
||||||
|
|
||||||
|
@FindBy(id = "maxDeltaTimeUnit")
|
||||||
|
private Select failureResetTimeSelect;
|
||||||
|
|
||||||
|
public void goToAndEnableBruteForceProtectionTab() {
|
||||||
|
SeleniumUtils.waitGuiForElement(bruteForceProtectionLink);
|
||||||
|
bruteForceProtectionLink.click();
|
||||||
|
if(!protectionEnabled.isEnabled()){
|
||||||
|
protectionEnabled.enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFailureFactorInput(String value){
|
||||||
|
failureFactorInput.clear();
|
||||||
|
failureFactorInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWaitIncrementInput(String value){
|
||||||
|
waitIncrementInput.clear();
|
||||||
|
waitIncrementInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuickLoginCheckInput(String value){
|
||||||
|
quickLoginCheckInput.clear();
|
||||||
|
quickLoginCheckInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinQuickLoginWaitInput(String value){
|
||||||
|
minQuickLoginWaitInput.clear();
|
||||||
|
minQuickLoginWaitInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxWaitInput(String value){
|
||||||
|
maxWaitInput.clear();
|
||||||
|
maxWaitInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFailureResetTimeInput(String value){
|
||||||
|
failureResetTimeInput.clear();
|
||||||
|
failureResetTimeInput.sendKeys(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import org.keycloak.testsuite.ui.model.Provider;
|
||||||
|
import org.keycloak.testsuite.ui.model.SocialProvider;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import static org.openqa.selenium.By.tagName;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class SocialSettingsPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(tagName = "select")
|
||||||
|
private Select newProviderSelect;
|
||||||
|
|
||||||
|
@FindByJQuery("input[class*='form-control']:eq(1)")
|
||||||
|
private WebElement providerKey;
|
||||||
|
|
||||||
|
@FindByJQuery("input[class*='form-control']:eq(2)")
|
||||||
|
private WebElement providerSecret;
|
||||||
|
|
||||||
|
@FindBy(tagName = "tbody")
|
||||||
|
private WebElement providersTable;
|
||||||
|
|
||||||
|
public void addNewProvider(Provider provider) {
|
||||||
|
newProviderSelect.selectByVisibleText(provider.providerName.getName());
|
||||||
|
providerKey.sendKeys(provider.key);
|
||||||
|
providerSecret.sendKeys(provider.secret);
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editProvider(SocialProvider oldProvider, Provider newProvider) {
|
||||||
|
Provider p = find(oldProvider);
|
||||||
|
assertNotNull("Provider should have been found", p);
|
||||||
|
System.out.println(p.providerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Provider find(SocialProvider provider){
|
||||||
|
List<Provider> list = getAllRows();
|
||||||
|
for(Provider p : list) {
|
||||||
|
if(p.providerName == provider) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Provider> getAllRows() {
|
||||||
|
List<Provider> rows = new ArrayList<Provider>();
|
||||||
|
for (WebElement rowElement : providersTable.findElements(tagName("tr"))) {
|
||||||
|
Provider provider = new Provider();
|
||||||
|
List<WebElement> tds = rowElement.findElements(tagName("td"));
|
||||||
|
if(!(tds.isEmpty() || tds.get(0).getText().isEmpty())) {
|
||||||
|
provider.providerName = SocialProvider.valueOf(tds.get(0).getText());
|
||||||
|
provider.key = tds.get(1).getText();
|
||||||
|
provider.secret = tds.get(2).getText();
|
||||||
|
rows.add(provider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElementNotPresent;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class ThemesSettingsPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(css = "#loginTheme")
|
||||||
|
private Select loginThemeSelect;
|
||||||
|
|
||||||
|
@FindBy(css = "#accountTheme")
|
||||||
|
private Select accountThemeSelect;
|
||||||
|
|
||||||
|
@FindBy(css = "#adminTheme")
|
||||||
|
private Select adminConsoleThemeSelect;
|
||||||
|
|
||||||
|
@FindBy(css = "#emailTheme")
|
||||||
|
private Select emailThemeSelect;
|
||||||
|
|
||||||
|
@FindBy(css = "link[href*='login/keycloak/css/login.css']")
|
||||||
|
private WebElement keycloakTheme;
|
||||||
|
|
||||||
|
public void changeLoginTheme(String themeName){
|
||||||
|
waitGuiForElement(By.id("loginTheme"));
|
||||||
|
loginThemeSelect.selectByVisibleText(themeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeAccountTheme(String themeName){
|
||||||
|
accountThemeSelect.selectByVisibleText(themeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeAdminConsoleTheme(String themeName){
|
||||||
|
adminConsoleThemeSelect.selectByVisibleText(themeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeEmailTheme(String themeName){
|
||||||
|
emailThemeSelect.selectByVisibleText(themeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verifyBaseTheme(){
|
||||||
|
waitGuiForElementNotPresent(keycloakTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verifyKeycloakTheme(){
|
||||||
|
waitGuiForElement(keycloakTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveTheme() {
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
import static java.lang.String.valueOf;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
import static org.apache.commons.lang3.text.WordUtils.capitalize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class TokensPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "ssoSessionIdleTimeout")
|
||||||
|
private WebElement sessionTimeout;
|
||||||
|
|
||||||
|
@FindBy(name = "ssoSessionIdleTimeoutUnit")
|
||||||
|
private Select sessionTimeoutUnit;
|
||||||
|
|
||||||
|
@FindBy(id = "ssoSessionMaxLifespan")
|
||||||
|
private WebElement sessionLifespanTimeout;
|
||||||
|
|
||||||
|
@FindBy(name = "ssoSessionMaxLifespanUnit")
|
||||||
|
private Select sessionLifespanTimeoutUnit;
|
||||||
|
|
||||||
|
public void setSessionTimeout(int timeout, TimeUnit unit) {
|
||||||
|
setTimeout(sessionTimeoutUnit, sessionTimeout, timeout, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSessionTimeoutLifespan(int time, TimeUnit unit) {
|
||||||
|
setTimeout(sessionLifespanTimeoutUnit, sessionLifespanTimeout, time, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTimeout(Select timeoutElement, WebElement unitElement,
|
||||||
|
int timeout, TimeUnit unit) {
|
||||||
|
waitGuiForElement(sessionTimeout);
|
||||||
|
timeoutElement.selectByValue(capitalize(unit.name().toLowerCase()));
|
||||||
|
unitElement.clear();
|
||||||
|
unitElement.sendKeys(valueOf(timeout));
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.page.settings;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.keycloak.testsuite.ui.model.User;
|
||||||
|
import org.keycloak.testsuite.ui.page.AbstractPage;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.keycloak.testsuite.ui.model.UserAction;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitAjaxForElement;
|
||||||
|
import static org.openqa.selenium.By.*;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class UserPage extends AbstractPage {
|
||||||
|
|
||||||
|
@FindBy(id = "username")
|
||||||
|
private WebElement usernameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "email")
|
||||||
|
private WebElement emailInput;
|
||||||
|
|
||||||
|
@FindBy(id = "firstName")
|
||||||
|
private WebElement firstNameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "lastName")
|
||||||
|
private WebElement lastNameInput;
|
||||||
|
|
||||||
|
@FindBy(id = "emailVerified")
|
||||||
|
private WebElement emailVerifiedSwitchToggle;
|
||||||
|
|
||||||
|
@FindBy(css = "label[for='userEnabled']")
|
||||||
|
private WebElement userEnabledSwitchToggle;
|
||||||
|
|
||||||
|
@FindBy(css = "input[class*='select2-input']")
|
||||||
|
private WebElement requiredUserActionsInput;
|
||||||
|
|
||||||
|
@FindByJQuery(".select2-offscreen")
|
||||||
|
private Select actionsSelect;
|
||||||
|
|
||||||
|
@FindBy(id = "password")
|
||||||
|
private WebElement password;
|
||||||
|
|
||||||
|
@FindBy(id = "confirmPassword")
|
||||||
|
private WebElement confirmPassword;
|
||||||
|
|
||||||
|
@FindBy(css = "input[class*='search']")
|
||||||
|
private WebElement searchInput;
|
||||||
|
|
||||||
|
@FindBy(css = "table[class*='table']")
|
||||||
|
private WebElement dataTable;
|
||||||
|
|
||||||
|
@FindByJQuery("button[kc-cancel] ")
|
||||||
|
private WebElement cancel;
|
||||||
|
|
||||||
|
@FindBy(css = "div[class='input-group-addon'] i")
|
||||||
|
private WebElement searchButton;
|
||||||
|
|
||||||
|
public void addUser(User user) {
|
||||||
|
primaryButtons.get(1).click();
|
||||||
|
waitAjaxForElement(usernameInput);
|
||||||
|
usernameInput.sendKeys(user.getUserName());
|
||||||
|
emailInput.sendKeys(user.getEmail());
|
||||||
|
firstNameInput.sendKeys(user.getFirstName());
|
||||||
|
lastNameInput.sendKeys(user.getLastName());
|
||||||
|
if (!user.isUserEnabled()) {
|
||||||
|
userEnabledSwitchToggle.click();
|
||||||
|
}
|
||||||
|
if (user.isEmailVerified()) {
|
||||||
|
emailVerifiedSwitchToggle.click();
|
||||||
|
}
|
||||||
|
// requiredUserActionsInput.sendKeys(user.getRequiredUserActions());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addPasswordForUser(User user) {
|
||||||
|
password.sendKeys(user.getPassword());
|
||||||
|
confirmPassword.sendKeys(user.getPassword());
|
||||||
|
dangerButton.click();
|
||||||
|
waitAjaxForElement(deleteConfirmationButton);
|
||||||
|
deleteConfirmationButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public User findUser(String username) {
|
||||||
|
waitAjaxForElement(searchInput);
|
||||||
|
searchInput.sendKeys(username);
|
||||||
|
searchButton.click();
|
||||||
|
List<User> users = getAllRows();
|
||||||
|
if (users.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
assertEquals(1, users.size());
|
||||||
|
return users.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editUser(User user) {
|
||||||
|
goToUser(user);
|
||||||
|
waitAjaxForElement(usernameInput);
|
||||||
|
usernameInput.sendKeys(user.getUserName());
|
||||||
|
emailInput.sendKeys(user.getEmail());
|
||||||
|
if (!user.isUserEnabled()) {
|
||||||
|
userEnabledSwitchToggle.click();
|
||||||
|
}
|
||||||
|
if (user.isEmailVerified()) {
|
||||||
|
emailVerifiedSwitchToggle.click();
|
||||||
|
}
|
||||||
|
requiredUserActionsInput.sendKeys(user.getRequiredUserActions());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteUser(String username) {
|
||||||
|
searchInput.sendKeys(username);
|
||||||
|
searchButton.click();
|
||||||
|
driver.findElement(linkText(username)).click();
|
||||||
|
waitAjaxForElement(dangerButton);
|
||||||
|
dangerButton.click();
|
||||||
|
waitAjaxForElement(deleteConfirmationButton);
|
||||||
|
deleteConfirmationButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
cancel.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showAllUsers() {
|
||||||
|
primaryButtons.get(0).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToUser(User user) {
|
||||||
|
dataTable.findElement(linkText(user.getUserName())).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToUser(String name) {
|
||||||
|
goToUser(new User(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAction(UserAction action) {
|
||||||
|
actionsSelect.selectByValue(action.name());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeAction(UserAction action) {
|
||||||
|
actionsSelect.deselectByValue(action.name());
|
||||||
|
primaryButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<User> getAllRows() {
|
||||||
|
List<User> users = new ArrayList<User>();
|
||||||
|
List<WebElement> rows = dataTable.findElements(cssSelector("tbody tr"));
|
||||||
|
if (rows.size() > 1) {
|
||||||
|
for (WebElement rowElement : rows) {
|
||||||
|
if (rowElement.isDisplayed()) {
|
||||||
|
User user = new User();
|
||||||
|
List<WebElement> tds = rowElement.findElements(tagName("td"));
|
||||||
|
if (!(tds.isEmpty() || tds.get(0).getText().isEmpty())) {
|
||||||
|
user.setUserName(tds.get(0).getText());
|
||||||
|
user.setLastName(tds.get(1).getText());
|
||||||
|
user.setFirstName(tds.get(2).getText());
|
||||||
|
user.setEmail(tds.get(3).getText());
|
||||||
|
users.add(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.account;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.jboss.arquillian.graphene.page.Page;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.keycloak.testsuite.ui.util.Constants.ADMIN_PSSWD;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Account;
|
||||||
|
import org.keycloak.testsuite.ui.page.account.AccountPage;
|
||||||
|
import org.keycloak.testsuite.ui.page.account.PasswordPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class AccountManagementTest extends AbstractKeyCloakTest<AccountPage> {
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
private AccountPage accountPage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
private PasswordPage passwordPage;
|
||||||
|
|
||||||
|
private static final String USERNAME = "admin";
|
||||||
|
private static final String NEW_PASSWORD = "newpassword";
|
||||||
|
private static final String WRONG_PASSWORD = "wrongpassword";
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeAccountTest() {
|
||||||
|
menuPage.goToAccountManagement();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void afterAccountTest() {
|
||||||
|
accountPage.keycloakConsole();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void passwordPageValidationTest() {
|
||||||
|
page.password();
|
||||||
|
passwordPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isError());
|
||||||
|
|
||||||
|
passwordPage.setPassword(WRONG_PASSWORD, NEW_PASSWORD);
|
||||||
|
passwordPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isError());
|
||||||
|
|
||||||
|
passwordPage.setOldPasswordField(ADMIN_PSSWD);
|
||||||
|
passwordPage.setNewPasswordField("something");
|
||||||
|
passwordPage.setConfirmField("something else");
|
||||||
|
passwordPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isError());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void changePasswordTest() {
|
||||||
|
page.password();
|
||||||
|
passwordPage.setPassword(ADMIN_PSSWD, NEW_PASSWORD);
|
||||||
|
passwordPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
page.signOut();
|
||||||
|
loginPage.login(USERNAME, NEW_PASSWORD);
|
||||||
|
page.password();
|
||||||
|
passwordPage.setPassword(NEW_PASSWORD, ADMIN_PSSWD);
|
||||||
|
passwordPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void accountPageTest() {
|
||||||
|
page.account();
|
||||||
|
Account adminAccount = accountPage.getAccount();
|
||||||
|
assertEquals(adminAccount.getUsername(), USERNAME);
|
||||||
|
adminAccount.setEmail("a@b");
|
||||||
|
adminAccount.setFirstName("John");
|
||||||
|
adminAccount.setLastName("Smith");
|
||||||
|
accountPage.setAccount(adminAccount);
|
||||||
|
accountPage.save();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
|
||||||
|
page.signOut();
|
||||||
|
loginPage.login(USERNAME, ADMIN_PSSWD);
|
||||||
|
|
||||||
|
page.account();
|
||||||
|
assertEquals(adminAccount, accountPage.getAccount());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.client;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Client;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.ClientPage;
|
||||||
|
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class AddNewClientTest extends AbstractKeyCloakTest<ClientPage> {
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeClientTest() {
|
||||||
|
navigation.clients();
|
||||||
|
page.goToCreateClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addNewClientTest() {
|
||||||
|
Client newClient = new Client("testClient1", "http://example.com/*");
|
||||||
|
page.addClient(newClient);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.clients();
|
||||||
|
|
||||||
|
page.deleteClient(newClient.getName());
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
assertNull(page.findClient(newClient.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addNewClientWithBlankNameTest() {
|
||||||
|
Client newClient = new Client("", "http://example.com/*");
|
||||||
|
page.addClient(newClient);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addNewClientWithBlankUriTest() {
|
||||||
|
Client newClient = new Client("testClient2", "");
|
||||||
|
page.addClient(newClient);
|
||||||
|
page.confirmAddClient();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
|
||||||
|
page.addUri("http://testUri.com/*");
|
||||||
|
page.confirmAddClient();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
|
||||||
|
navigation.clients();
|
||||||
|
page.deleteClient(newClient.getName());
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
assertNull(page.findClient(newClient.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addNewClientWithTwoUriTest() {
|
||||||
|
Client newClient = new Client("testClient3", "");
|
||||||
|
page.addClient(newClient);
|
||||||
|
page.confirmAddClient();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
|
||||||
|
page.addUri("http://testUri.com/*");
|
||||||
|
page.addUri("http://example.com/*");
|
||||||
|
|
||||||
|
page.confirmAddClient();
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
|
||||||
|
navigation.clients();
|
||||||
|
page.deleteClient(newClient.getName());
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
assertNull(page.findClient(newClient.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.testsuite.ui.test.role;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.jboss.arquillian.graphene.page.Page;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.RolesPage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Role;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.UserPage;
|
||||||
|
import static org.openqa.selenium.By.id;
|
||||||
|
import org.openqa.selenium.support.ui.Select;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class AddNewRoleTest extends AbstractKeyCloakTest<RolesPage> {
|
||||||
|
|
||||||
|
@Page
|
||||||
|
private UserPage userPage;
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeTestAddNewRole() {
|
||||||
|
navigation.roles();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddNewRole() {
|
||||||
|
Role role = new Role("role1");
|
||||||
|
page.addRole(role);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.roles();
|
||||||
|
assertEquals("role1", page.findRole(role.getName()).getName());
|
||||||
|
page.deleteRole(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void testAddNewRoleWithLongName() {
|
||||||
|
String name = "hjewr89y1894yh98(*&*&$jhjkashd)*(&y8934h*&@#hjkahsdj";
|
||||||
|
page.addRole(new Role(name));
|
||||||
|
assertNotNull(page.findRole(name));
|
||||||
|
navigation.roles();
|
||||||
|
page.deleteRole(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddExistingRole() {
|
||||||
|
Role role = new Role("role2");
|
||||||
|
page.addRole(role);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.roles();
|
||||||
|
page.addRole(role);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
navigation.roles();
|
||||||
|
page.deleteRole(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRoleIsAvailableForUsers() {
|
||||||
|
Role role = new Role("User role");
|
||||||
|
page.addRole(role);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.users();
|
||||||
|
userPage.showAllUsers();
|
||||||
|
userPage.goToUser("admin");
|
||||||
|
navigation.roleMappings();
|
||||||
|
Select rolesSelect = new Select(driver.findElement(id("available")));
|
||||||
|
assertEquals("User role should be present in admin role mapping",
|
||||||
|
role.getName(), rolesSelect.getOptions().get(0).getText());
|
||||||
|
navigation.roles();
|
||||||
|
page.deleteRole(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.session;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.page.session.SessionsPage;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class SessionsTest extends AbstractKeyCloakTest<SessionsPage> {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeSessionTest() {
|
||||||
|
navigation.sessions();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogoutAllSessions() {
|
||||||
|
page.logoutAllSessions();
|
||||||
|
waitGuiForElement(loginPage.getLoginPageHeader(), "Home page should be visible after logout");
|
||||||
|
loginPage.loginAsAdmin();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.session;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.TokensPage;
|
||||||
|
|
||||||
|
import static org.jboss.arquillian.graphene.Graphene.waitModel;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import static org.keycloak.testsuite.ui.util.SeleniumUtils.waitGuiForElement;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class TokensTest extends AbstractKeyCloakTest<TokensPage> {
|
||||||
|
|
||||||
|
private static final int TIMEOUT = 10;
|
||||||
|
private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeTokensTest() {
|
||||||
|
navigation.tokens();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTimeoutForRealmSession() throws InterruptedException {
|
||||||
|
page.setSessionTimeout(TIMEOUT, TIME_UNIT);
|
||||||
|
TIME_UNIT.sleep(TIMEOUT + 2); //add 2 secs to timeout
|
||||||
|
driver.navigate().refresh();
|
||||||
|
waitGuiForElement(loginPage.getLoginPageHeader(), "Home page should be visible after session timeout");
|
||||||
|
loginPage.loginAsAdmin();
|
||||||
|
page.setSessionTimeout(30, TimeUnit.MINUTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLifespanOfRealmSession() {
|
||||||
|
page.setSessionTimeoutLifespan(TIMEOUT, TIME_UNIT);
|
||||||
|
logOut();
|
||||||
|
loginAsAdmin();
|
||||||
|
waitModel().withTimeout(TIMEOUT + 2, TIME_UNIT) //adds 2 seconds to the timeout
|
||||||
|
.pollingEvery(1, TIME_UNIT)
|
||||||
|
.until("Home page should be visible after session timeout")
|
||||||
|
.element(loginPage.getLoginPageHeader())
|
||||||
|
.is()
|
||||||
|
.present();
|
||||||
|
loginPage.loginAsAdmin();
|
||||||
|
navigation.tokens();
|
||||||
|
page.setSessionTimeoutLifespan(10, TimeUnit.HOURS);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.settings;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.model.PasswordPolicy;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.CredentialsPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class CredentialsTest extends AbstractKeyCloakTest<CredentialsPage> {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeCredentialsTest() {
|
||||||
|
navigation.credentials();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDigitsNumber() {
|
||||||
|
page.addPolicy(PasswordPolicy.HASH_ITERATIONS, 5);
|
||||||
|
page.removePolicy(PasswordPolicy.DIGITS);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.settings;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.SecurityPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class SecuritySettingsTest extends AbstractKeyCloakTest<SecurityPage>{
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void securitySettingsTest() {
|
||||||
|
navigation.security();
|
||||||
|
page.goToAndEnableBruteForceProtectionTab();
|
||||||
|
//TODO:
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.settings;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.SocialSettingsPage;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.model.Provider;
|
||||||
|
import org.keycloak.testsuite.ui.model.SocialProvider;
|
||||||
|
import org.keycloak.testsuite.ui.util.URL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class SocialSettingsTest extends AbstractKeyCloakTest<SocialSettingsPage> {
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
public void testAddNewProvider() {
|
||||||
|
page.addNewProvider(new Provider(SocialProvider.FACEBOOK, "klic", "secret"));
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue("Success message should be displayed", flashMessage.isSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test(expected = NoSuchElementException.class)
|
||||||
|
public void testDuplicitProvider() {
|
||||||
|
page.addNewProvider(new Provider(SocialProvider.FACEBOOK, "a", "b"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
public void testEditProvider() {
|
||||||
|
page.goToPage(URL.SETTINGS_SOCIAL);
|
||||||
|
page.editProvider(SocialProvider.FACEBOOK, new Provider(SocialProvider.FACEBOOK, "abc", "def"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
public void testDeleteProvider() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddMultipleProviders() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.settings;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.model.Theme;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.ThemesSettingsPage;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class ThemesSettingsTest extends AbstractKeyCloakTest<ThemesSettingsPage> {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeThemeTest() {
|
||||||
|
navigation.themes();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void changeLoginThemeTest() {
|
||||||
|
page.changeLoginTheme(Theme.BASE.getName());
|
||||||
|
page.saveTheme();
|
||||||
|
logOut();
|
||||||
|
page.verifyBaseTheme();
|
||||||
|
|
||||||
|
loginAsAdmin();
|
||||||
|
navigation.themes();
|
||||||
|
page.changeLoginTheme(Theme.KEYCLOAK.getName());
|
||||||
|
page.saveTheme();
|
||||||
|
logOut();
|
||||||
|
page.verifyKeycloakTheme();
|
||||||
|
|
||||||
|
loginAsAdmin();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.user;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.model.User;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.UserPage;
|
||||||
|
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import static org.keycloak.testsuite.ui.util.Users.TEST_USER1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Filip Kiss
|
||||||
|
*/
|
||||||
|
public class AddNewUserTest extends AbstractKeyCloakTest<UserPage> {
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeAddNewUserTest() {
|
||||||
|
navigation.users();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addUserWithInvalidEmailTest() {
|
||||||
|
String testUsername = "testUserInvEmail";
|
||||||
|
String invalidEmail = "user.redhat.com";
|
||||||
|
User testUser = new User(testUsername, "pass", invalidEmail);
|
||||||
|
page.addUser(testUser);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
navigation.users();
|
||||||
|
assertNull(page.findUser(testUsername));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addUserWithNoUsernameTest() {
|
||||||
|
User testUser = new User();
|
||||||
|
page.addUser(testUser);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void addUserWithLongNameTest() {
|
||||||
|
String longUserName = "thisisthelongestnameeveranditcannotbeusedwhencreatingnewuserinkeycloak";
|
||||||
|
User testUser = new User(longUserName);
|
||||||
|
navigation.users();
|
||||||
|
page.addUser(testUser);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
assertNull(page.findUser(testUser.getUserName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addDuplicatedUser() {
|
||||||
|
String testUsername = "test_duplicated_user";
|
||||||
|
User testUser = new User(testUsername);
|
||||||
|
page.addUser(testUser);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.users();
|
||||||
|
assertNotNull(page.findUser(testUsername));
|
||||||
|
|
||||||
|
User testUser2 = new User(testUsername);
|
||||||
|
page.addUser(testUser2);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isDanger());
|
||||||
|
navigation.users();
|
||||||
|
page.deleteUser(testUsername);
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
assertNull(page.findUser(testUser2.getUserName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addDisabledUser() {
|
||||||
|
page.addUser(TEST_USER1);
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
navigation.users();
|
||||||
|
page.deleteUser(TEST_USER1.getUserName());
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
assertNull(page.findUser(TEST_USER1.getUserName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.test.user;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.graphene.findby.FindByJQuery;
|
||||||
|
import org.jboss.arquillian.graphene.page.Page;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.testsuite.ui.fragment.FlashMessage;
|
||||||
|
import org.keycloak.testsuite.ui.model.User;
|
||||||
|
import org.keycloak.testsuite.ui.page.RegisterPage;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.UserPage;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.keycloak.testsuite.ui.AbstractKeyCloakTest;
|
||||||
|
import org.keycloak.testsuite.ui.page.settings.LoginSettingsPage;
|
||||||
|
import static org.keycloak.testsuite.ui.util.Users.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class RegisterNewUserTest extends AbstractKeyCloakTest<RegisterPage> {
|
||||||
|
|
||||||
|
@Page
|
||||||
|
private UserPage userPage;
|
||||||
|
|
||||||
|
@Page
|
||||||
|
private LoginSettingsPage loginSettingsPage;
|
||||||
|
|
||||||
|
@FindByJQuery(".alert")
|
||||||
|
private FlashMessage flashMessage;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeUserRegistration() {
|
||||||
|
navigation.settings();
|
||||||
|
navigation.login();
|
||||||
|
loginSettingsPage.enableUserRegistration();
|
||||||
|
logOut();
|
||||||
|
loginPage.goToUserRegistration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void afterUserRegistration() {
|
||||||
|
navigation.settings();
|
||||||
|
navigation.login();
|
||||||
|
loginSettingsPage.disableUserRegistration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerNewUserTest() {
|
||||||
|
page.registerNewUser(TEST_USER1);
|
||||||
|
logOut();
|
||||||
|
loginAsAdmin();
|
||||||
|
navigation.users();
|
||||||
|
userPage.deleteUser(TEST_USER1.getUserName());
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerNewUserWithWrongEmail() {
|
||||||
|
User testUser = new User(TEST_USER1);
|
||||||
|
testUser.setEmail("newUser.redhat.com");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertTrue(page.isInvalidEmail());
|
||||||
|
page.backToLoginPage();
|
||||||
|
loginAsAdmin();
|
||||||
|
navigation.users();
|
||||||
|
assertNull(userPage.findUser(testUser.getUserName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerNewUserWithWrongAttributes() {
|
||||||
|
User testUser = new User();
|
||||||
|
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertFalse(page.isAttributeSpecified("first name"));
|
||||||
|
testUser.setFirstName("name");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertFalse(page.isAttributeSpecified("last name"));
|
||||||
|
testUser.setLastName("surname");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertFalse(page.isAttributeSpecified("email"));
|
||||||
|
testUser.setEmail("mail@redhat.com");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertFalse(page.isAttributeSpecified("username"));
|
||||||
|
testUser.setUserName("user");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
assertFalse(page.isAttributeSpecified("password"));
|
||||||
|
testUser.setPassword("password");
|
||||||
|
page.registerNewUser(testUser);
|
||||||
|
logOut();
|
||||||
|
loginAsAdmin();
|
||||||
|
navigation.users();
|
||||||
|
userPage.deleteUser(TEST_USER1.getUserName());
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerNewUserWithNotMatchingPasswords() {
|
||||||
|
page.registerNewUser(TEST_USER1, "psswd");
|
||||||
|
assertFalse(page.isPasswordSame());
|
||||||
|
page.registerNewUser(TEST_USER1);
|
||||||
|
logOut();
|
||||||
|
loginAsAdmin();
|
||||||
|
navigation.users();
|
||||||
|
userPage.deleteUser(TEST_USER1.getUserName());
|
||||||
|
flashMessage.waitUntilPresent();
|
||||||
|
assertTrue(flashMessage.getText(), flashMessage.isSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public final class Constants {
|
||||||
|
|
||||||
|
private Constants() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String CURRENT_REALM = "master";
|
||||||
|
|
||||||
|
public static final String ADMIN_PSSWD = "admin";
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.util;
|
||||||
|
|
||||||
|
import static org.jboss.arquillian.graphene.Graphene.waitAjax;
|
||||||
|
import static org.jboss.arquillian.graphene.Graphene.waitGui;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public final class SeleniumUtils {
|
||||||
|
|
||||||
|
private SeleniumUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitAjaxForElement(By element) {
|
||||||
|
waitAjax().until()
|
||||||
|
.element(element)
|
||||||
|
.is()
|
||||||
|
.present();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitAjaxForElement(WebElement element) {
|
||||||
|
waitAjax().until()
|
||||||
|
.element(element)
|
||||||
|
.is()
|
||||||
|
.present();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitGuiForElement(By element, String message) {
|
||||||
|
waitGui().until(message)
|
||||||
|
.element(element)
|
||||||
|
.is()
|
||||||
|
.present();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitGuiForElement(By element) {
|
||||||
|
waitGuiForElement(element, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitGuiForElement(WebElement element) {
|
||||||
|
waitGuiForElement(element, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitGuiForElement(WebElement element, String message) {
|
||||||
|
waitGui().until(message)
|
||||||
|
.element(element)
|
||||||
|
.is()
|
||||||
|
.present();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitGuiForElementNotPresent(WebElement element) {
|
||||||
|
waitGui().until()
|
||||||
|
.element(element)
|
||||||
|
.is()
|
||||||
|
.not()
|
||||||
|
.present();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public class URL {
|
||||||
|
|
||||||
|
public static final String BASE_URL = "http://localhost:8080/auth/admin/master/console/index.html";
|
||||||
|
|
||||||
|
public static String SETTINGS_GENERAL_SETTINGS = BASE_URL + "#/realms/%s";
|
||||||
|
public static String SETTINGS_ROLES = BASE_URL + "#/realms/%s/roles";
|
||||||
|
public static String SETTINGS_LOGIN = BASE_URL + "#/realms/%s/login-settings";
|
||||||
|
public static String SETTINGS_SOCIAL = BASE_URL + "#/realms/%s/social-settings";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
*
|
||||||
|
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
|
||||||
|
*
|
||||||
|
* 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.ui.util;
|
||||||
|
|
||||||
|
import org.keycloak.testsuite.ui.model.User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Petr Mensik
|
||||||
|
*/
|
||||||
|
public final class Users {
|
||||||
|
|
||||||
|
private Users() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final User ADMIN = new User("admin", "admin");
|
||||||
|
public static final User EMPTY_USER = new User();
|
||||||
|
public static final User TEST_USER1 = new User("user", "password", "user@redhat.com", "user", "test");
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
<arquillian xmlns="http://jboss.org/schema/arquillian"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://jboss.org/schema/arquillian
|
||||||
|
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
|
||||||
|
|
||||||
|
|
||||||
|
<container qualifier="wildfly-8-remote">
|
||||||
|
<protocol type="jmx-as7">
|
||||||
|
<property name="executionType">REMOTE</property>
|
||||||
|
</protocol>
|
||||||
|
</container>
|
||||||
|
|
||||||
|
<container qualifier="wildfly-8-managed">
|
||||||
|
<configuration>
|
||||||
|
<property name="jbossHome">${jbossHome}</property>
|
||||||
|
<property name="serverConfig">standalone.xml</property>
|
||||||
|
</configuration>
|
||||||
|
</container>
|
||||||
|
|
||||||
|
<extension qualifier="webdriver">
|
||||||
|
<property name="browser">${browser}</property>
|
||||||
|
</extension>
|
||||||
|
</arquillian>
|
Loading…
Reference in a new issue