keycloak-uncached

Merge pull request #2329 from mbaluch/master KPR-87 - Agreement

3/8/2016 9:50:49 AM

Details

diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/auth/page/login/TermsAndConditions.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/auth/page/login/TermsAndConditions.java
new file mode 100644
index 0000000..a4c425e
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/auth/page/login/TermsAndConditions.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * and other contributors as indicated by the @author tags.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.keycloak.testsuite.auth.page.login;
+
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class TermsAndConditions extends LoginActions {
+
+    @FindBy(id = "kc-accept")
+    private WebElement acceptButton;
+
+    @FindBy(id = "kc-decline")
+    private WebElement declineButton;
+
+    @FindBy(id = "kc-terms-text")
+    private WebElement textElem;
+    
+    @Override
+    public boolean isCurrent() {
+        return driver.getTitle().equals("Terms and Conditions");
+    }
+
+    public void acceptTerms() {
+        acceptButton.click();
+    }
+    public void declineTerms() {
+        declineButton.click();
+    }
+
+    public String getAcceptButtonText() {
+        return acceptButton.getAttribute("value");
+    }
+    
+    public String getDeclineButtonText() {
+        return declineButton.getAttribute("value");
+    }
+    
+    public String getText() {
+        return textElem.getText();
+    }
+    
+}
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
index 1e5145c..bbab450 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
@@ -16,9 +16,9 @@
  */
 package org.keycloak.testsuite;
 
-import java.io.File;
 import org.keycloak.testsuite.arquillian.TestContext;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import javax.ws.rs.NotFoundException;
@@ -32,11 +32,16 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.runner.RunWith;
 import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.resource.AuthenticationManagementResource;
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.RealmsResource;
+import org.keycloak.admin.client.resource.UserResource;
+import org.keycloak.admin.client.resource.UsersResource;
 import org.keycloak.models.Constants;
 import org.keycloak.representations.idm.RealmRepresentation;
+import org.keycloak.representations.idm.RequiredActionProviderRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
+import org.keycloak.testsuite.admin.ApiUtil;
 import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
 import org.keycloak.testsuite.arquillian.SuiteContext;
 import org.keycloak.testsuite.auth.page.WelcomePage;
@@ -50,10 +55,8 @@ import static org.keycloak.testsuite.auth.page.AuthRealm.MASTER;
 import org.keycloak.testsuite.auth.page.account.Account;
 import org.keycloak.testsuite.auth.page.login.OIDCLogin;
 import org.keycloak.testsuite.auth.page.login.UpdatePassword;
-import org.keycloak.testsuite.util.Timer;
 import org.keycloak.testsuite.util.WaitUtils;
 import static org.keycloak.testsuite.admin.Users.setPasswordFor;
-import static org.keycloak.testsuite.admin.Users.setPasswordFor;
 
 /**
  *
@@ -206,4 +209,63 @@ public abstract class AbstractKeycloakTest {
         return adminClient.realms();
     }
 
+    public void createRealm(String realm) {
+        try {
+            RealmResource realmResource = adminClient.realms().realm(realm);
+            // Throws NotFoundException in case the realm does not exist! Ugly but there
+            // does not seem to be a way to this just by asking.
+            RealmRepresentation realmRepresentation = realmResource.toRepresentation();
+        } catch (NotFoundException ex) {
+            RealmRepresentation realmRepresentation = new RealmRepresentation();
+            realmRepresentation.setRealm(realm);
+            realmRepresentation.setEnabled(true);
+            realmRepresentation.setRegistrationAllowed(true);
+            adminClient.realms().create(realmRepresentation);
+            
+//            List<RequiredActionProviderRepresentation> requiredActions = adminClient.realm(realm).flows().getRequiredActions();
+//            for (RequiredActionProviderRepresentation a : requiredActions) {
+//                a.setEnabled(false);
+//                a.setDefaultAction(false);
+//                adminClient.realm(realm).flows().updateRequiredAction(a.getAlias(), a);
+//            }
+        }
+    }
+    
+    public String createUser(String realm, String username, String password, String ... requiredActions) {
+        List<String> requiredUserActions = Arrays.asList(requiredActions);
+        
+        UserRepresentation homer = new UserRepresentation();
+        homer.setEnabled(true);
+        homer.setUsername(username);
+        homer.setRequiredActions(requiredUserActions);
+        
+        return ApiUtil.createUserAndResetPasswordWithAdminClient(adminClient.realm(realm), homer, password);
+    }
+    
+    public void setRequiredActionEnabled(String realm, String requiredAction, boolean enabled, boolean defaultAction) {
+        AuthenticationManagementResource managementResource = adminClient.realm(realm).flows();
+        
+        RequiredActionProviderRepresentation action = managementResource.getRequiredAction(requiredAction);
+        action.setEnabled(enabled);
+        action.setDefaultAction(defaultAction);
+      
+        managementResource.updateRequiredAction(requiredAction, action);
+    }
+    
+    public void setRequiredActionEnabled(String realm, String userId, String requiredAction, boolean enabled) {
+        UsersResource usersResource = adminClient.realm(realm).users();
+
+        UserResource userResource = usersResource.get(userId);
+        UserRepresentation userRepresentation = userResource.toRepresentation();
+
+        List<String> requiredActions = userRepresentation.getRequiredActions();
+        if (enabled && !requiredActions.contains(requiredAction)) {
+            requiredActions.add(requiredAction);
+        } else if (!enabled && requiredActions.contains(requiredAction)) {
+            requiredActions.remove(requiredAction);
+        }
+        
+        userResource.update(userRepresentation);
+    }
+    
 }
diff --git a/testsuite/integration-arquillian/tests/other/console/pom.xml b/testsuite/integration-arquillian/tests/other/console/pom.xml
index b681814..0776553 100644
--- a/testsuite/integration-arquillian/tests/other/console/pom.xml
+++ b/testsuite/integration-arquillian/tests/other/console/pom.xml
@@ -30,5 +30,33 @@
     <artifactId>integration-arquillian-tests-console</artifactId>
 
     <name>Admin Console UI Tests</name>
-    
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <id>copy-theme-files</id>
+                            <phase>process-resources</phase>
+                            <goals>
+                                <goal>copy-resources</goal>
+                            </goals>
+                            <configuration>
+                                <outputDirectory>${keycloak.home}/themes</outputDirectory>
+                                <resources>
+                                    <resource>
+                                        <directory>src/main/resources/themes</directory>
+                                    </resource>
+                                </resources>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
 </project>
diff --git a/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/messages/messages_en.properties b/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/messages/messages_en.properties
new file mode 100644
index 0000000..b9060b4
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/messages/messages_en.properties
@@ -0,0 +1,4 @@
+doAccept=Yes
+doDecline=No
+
+termsText=<p>See <a href="https://en.wikipedia.org/wiki/Quality_assurance">QA</a> for more information.</p>
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/theme.properties b/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/theme.properties
new file mode 100644
index 0000000..f1dbb72
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/console/src/main/resources/themes/qe/login/theme.properties
@@ -0,0 +1 @@
+parent=base
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/authentication/actions/TermsAndConditionsTest.java b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/authentication/actions/TermsAndConditionsTest.java
new file mode 100644
index 0000000..f518784
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/authentication/actions/TermsAndConditionsTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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.console.authentication.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.jboss.arquillian.graphene.page.Page;
+import org.junit.Assert;
+import org.junit.Test;
+import org.keycloak.admin.client.resource.RealmResource;
+import org.keycloak.representations.idm.CredentialRepresentation;
+import org.keycloak.representations.idm.RealmRepresentation;
+
+import org.keycloak.representations.idm.UserRepresentation;
+import org.keycloak.testsuite.auth.page.login.Registration;
+import org.keycloak.testsuite.auth.page.login.TermsAndConditions;
+import org.keycloak.testsuite.console.AbstractConsoleTest;
+import org.keycloak.testsuite.console.page.authentication.RequiredActions;
+
+/**
+ * 
+ */
+public class TermsAndConditionsTest extends AbstractConsoleTest {
+
+    private static final String TERMS_TEXT = "Terms and conditions to be defined";
+    
+    private static final String REALM = "TermsAndConditions";
+    
+    private static final String BART = "Bart";
+    
+    private static final String BART_PASS = "Ay caramba!";
+    
+    private static final String HOMER = "Homer";
+    
+    private static final String HOMER_PASS = "Mmm donuts.";
+            
+    @Page
+    private TermsAndConditions termsAndConditionsPage;
+    
+    @Page
+    private Registration registrationPage;
+    
+    @Override
+    public void beforeConsoleTest() {
+        // no operation - we don't need 'admin' user for this test.
+    }
+
+    @Override
+    public void setDefaultPageUriParameters() {
+        super.setDefaultPageUriParameters();
+        testRealmPage.setAuthRealm(REALM);
+        testRealmAdminConsolePage.setAdminRealm(REALM);
+    }
+    
+    @Override
+    public void addTestRealms(List<RealmRepresentation> testRealms) {
+        RealmRepresentation testRealmRep = new RealmRepresentation();
+        testRealmRep.setRealm(REALM);
+        testRealmRep.setEnabled(true);
+        testRealms.add(testRealmRep);
+    }
+    
+    @Test 
+    public void testExistingUser() {
+        // create user
+        String userId = createUser(REALM, HOMER, HOMER_PASS);
+        
+        // test t&c - log in and make sure t&c is not displayed
+        testRealmAdminConsolePage.navigateTo();
+        testRealmLoginPage.form().login(HOMER, HOMER_PASS); 
+        testRealmAdminConsolePage.logOut();
+
+        // enable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, true, false);
+        setRequiredActionEnabled(REALM, userId, RequiredActions.TERMS_AND_CONDITIONS, true);
+
+        // test t&c - log in and accept
+        testRealmLoginPage.form().login(HOMER, HOMER_PASS); 
+        Assert.assertEquals(TERMS_TEXT, termsAndConditionsPage.getText());
+        termsAndConditionsPage.declineTerms();
+ 
+        testRealmLoginPage.form().login(HOMER, HOMER_PASS); 
+        Assert.assertEquals(TERMS_TEXT, termsAndConditionsPage.getText());
+      
+        termsAndConditionsPage.acceptTerms();        
+        testRealmAdminConsolePage.logOut();
+      
+        testRealmLoginPage.form().login(HOMER, HOMER_PASS);
+        testRealmAdminConsolePage.logOut();
+        
+        // disable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, false, false);
+    }
+    
+    @Test 
+    public void testAdminCreatedUser() {
+        // enable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, true, false);
+        
+        // create user
+        String userId = createUser(REALM, BART, BART_PASS);
+        setRequiredActionEnabled(REALM, userId, RequiredActions.TERMS_AND_CONDITIONS, true);
+        
+        // test t&c
+        testRealmAdminConsolePage.navigateTo();
+        testRealmLoginPage.form().login(BART, BART_PASS); 
+        Assert.assertTrue(termsAndConditionsPage.isCurrent());
+        
+        // disable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, false, false);
+    }
+    
+    @Test 
+    public void testSelfRegisteredUser() {
+        // enable self-registration
+        RealmResource realmResource = adminClient.realm(REALM);
+        RealmRepresentation realmRepresentation = realmResource.toRepresentation();
+        realmRepresentation.setRegistrationAllowed(true);
+        realmResource.update(realmRepresentation);
+        
+        // enable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, true, true);
+        
+        // self-register
+        CredentialRepresentation mrBurnsPassword = new CredentialRepresentation();
+        mrBurnsPassword.setType(CredentialRepresentation.PASSWORD);
+        mrBurnsPassword.setValue("Excellent.");
+        
+        List<CredentialRepresentation> credentials = new ArrayList<CredentialRepresentation>();
+        credentials.add(mrBurnsPassword);
+        
+        UserRepresentation mrBurns = new UserRepresentation();
+        mrBurns.setUsername("mrburns");
+        mrBurns.setFirstName("Montgomery");
+        mrBurns.setLastName("Burns");
+        mrBurns.setEmail("mburns@keycloak.org");
+        mrBurns.setCredentials(credentials);
+        
+        testRealmAdminConsolePage.navigateTo();
+        testRealmLoginPage.form().register();
+        
+        registrationPage.register(mrBurns);
+        
+        // test t&c
+        Assert.assertTrue(termsAndConditionsPage.isCurrent());
+        
+        // disable terms
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, false, false);
+    }
+    
+}
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/themes/TermsAndConditionsThemeTest.java b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/themes/TermsAndConditionsThemeTest.java
new file mode 100644
index 0000000..69e0c8a
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/themes/TermsAndConditionsThemeTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * and other contributors as indicated by the @author tags.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.keycloak.testsuite.console.themes;
+
+import java.util.List;
+import org.jboss.arquillian.graphene.page.Page;
+import org.junit.Assert;
+import org.junit.Test;
+import org.keycloak.admin.client.resource.RealmResource;
+import org.keycloak.representations.idm.RealmRepresentation;
+import org.keycloak.testsuite.auth.page.login.TermsAndConditions;
+import org.keycloak.testsuite.console.AbstractConsoleTest;
+import org.keycloak.testsuite.console.page.authentication.RequiredActions;
+
+/**
+ *
+ */
+public class TermsAndConditionsThemeTest extends AbstractConsoleTest {
+    
+    private static final String REALM = "CustomLook";
+    
+    private static final String HOMER = "Homer";
+    
+    private static final String HOMER_PASS = "Mmm donuts.";
+    
+    @Page
+    private TermsAndConditions termsAndConditionsPage;
+    
+    @Override
+    public void setDefaultPageUriParameters() {
+        super.setDefaultPageUriParameters();
+        testRealmPage.setAuthRealm(REALM);
+        testRealmAdminConsolePage.setAdminRealm(REALM);
+    }
+    
+    @Override
+    public void addTestRealms(List<RealmRepresentation> testRealms) {
+        RealmRepresentation testRealmRep = new RealmRepresentation();
+        testRealmRep.setRealm(REALM);
+        testRealmRep.setEnabled(true);
+        testRealms.add(testRealmRep);
+    }
+
+    @Override
+    public void beforeConsoleTest() {
+        // no operation - we don't need 'admin' user for this test.
+    }
+    
+    @Test
+    public void testTermsAndConditions() {
+        String userId = createUser(REALM, HOMER, HOMER_PASS);
+        setRequiredActionEnabled(REALM, RequiredActions.TERMS_AND_CONDITIONS, true, false);
+        setRequiredActionEnabled(REALM, userId, RequiredActions.TERMS_AND_CONDITIONS, true);
+        
+        RealmResource realmResource = adminClient.realm(REALM);
+        RealmRepresentation realmRepresentation = realmResource.toRepresentation();
+        realmRepresentation.setLoginTheme("qe");
+        realmResource.update(realmRepresentation);
+        
+        testRealmAdminConsolePage.navigateTo();
+        testRealmLoginPage.form().login(HOMER, HOMER_PASS);
+
+        Assert.assertTrue(termsAndConditionsPage.isCurrent());
+        Assert.assertTrue(termsAndConditionsPage.getText().contains("See QA for more information."));
+        Assert.assertEquals("Yes", termsAndConditionsPage.getAcceptButtonText());
+        Assert.assertEquals("No", termsAndConditionsPage.getDeclineButtonText());
+    }
+    
+}