keycloak-uncached

Details

diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/AbstractSocialLoginPage.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/AbstractSocialLoginPage.java
index 142a7f5..0675e88 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/AbstractSocialLoginPage.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/AbstractSocialLoginPage.java
@@ -18,6 +18,7 @@
 package org.keycloak.testsuite.pages.social;
 
 import org.jboss.arquillian.drone.api.annotation.Drone;
+import org.jboss.logging.Logger;
 import org.openqa.selenium.WebDriver;
 
 /**
@@ -26,6 +27,12 @@ import org.openqa.selenium.WebDriver;
 public abstract class AbstractSocialLoginPage {
     @Drone
     protected WebDriver driver;
+    protected Logger log = Logger.getLogger(this.getClass());
 
     public abstract void login(String user, String password);
+
+    // Override only when you need to perform logout at the end of the test
+    public void logout() {
+        log.infof("no logout necessary for %s", this.getClass().getName());
+    }
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/GitHubLoginPage.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/GitHubLoginPage.java
index fdf35ad..aa29b18 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/GitHubLoginPage.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/GitHubLoginPage.java
@@ -17,6 +17,8 @@
 
 package org.keycloak.testsuite.pages.social;
 
+import org.keycloak.testsuite.util.UIUtils;
+import org.keycloak.testsuite.util.URLUtils;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 
@@ -33,6 +35,9 @@ public class GitHubLoginPage extends AbstractSocialLoginPage {
     @FindBy(name = "commit")
     private WebElement loginButton;
 
+    @FindBy(xpath = "//input[@type='submit']")
+    private WebElement logoutButton;
+
     @Override
     public void login(String user, String password) {
         usernameInput.clear();
@@ -40,4 +45,11 @@ public class GitHubLoginPage extends AbstractSocialLoginPage {
         passwordInput.sendKeys(password);
         loginButton.click();
     }
+
+    @Override
+    public void logout() {
+        log.info("performing logout from GitHub");
+        URLUtils.navigateToUri("https://github.com/logout", true);
+        UIUtils.clickLink(logoutButton);
+    }
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java
index ea9e25a..48aafdd 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java
@@ -22,12 +22,14 @@ import org.keycloak.protocol.oidc.OIDCLoginProtocol;
 import org.keycloak.representations.AccessTokenResponse;
 import org.keycloak.representations.idm.IdentityProviderRepresentation;
 import org.keycloak.representations.idm.RealmRepresentation;
+import org.keycloak.representations.idm.UserRepresentation;
 import org.keycloak.representations.idm.authorization.ClientPolicyRepresentation;
 import org.keycloak.representations.idm.authorization.DecisionStrategy;
+import org.keycloak.services.managers.ClientManager;
+import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.admin.permissions.AdminPermissionManagement;
 import org.keycloak.services.resources.admin.permissions.AdminPermissions;
 import org.keycloak.social.openshift.OpenshiftV3IdentityProvider;
-import org.keycloak.representations.idm.UserRepresentation;
 import org.keycloak.testsuite.AbstractKeycloakTest;
 import org.keycloak.testsuite.ProfileAssume;
 import org.keycloak.testsuite.auth.page.login.UpdateAccount;
@@ -61,7 +63,6 @@ import javax.ws.rs.core.Form;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import java.io.FileInputStream;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
 
@@ -71,12 +72,13 @@ import static org.junit.Assume.assumeTrue;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.BITBUCKET;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.FACEBOOK;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.GITHUB;
+import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.GITHUB_PRIVATE_EMAIL;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.GITLAB;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.GOOGLE;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.LINKEDIN;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.MICROSOFT;
-import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.PAYPAL;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.OPENSHIFT;
+import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.PAYPAL;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.STACKOVERFLOW;
 import static org.keycloak.testsuite.broker.SocialLoginTest.Provider.TWITTER;
 
@@ -102,6 +104,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
         GOOGLE("google", GoogleLoginPage.class),
         FACEBOOK("facebook", FacebookLoginPage.class),
         GITHUB("github", GitHubLoginPage.class),
+        GITHUB_PRIVATE_EMAIL("github", "github-private-email", GitHubLoginPage.class),
         TWITTER("twitter", TwitterLoginPage.class),
         LINKEDIN("linkedin", LinkedInLoginPage.class),
         MICROSOFT("microsoft", MicrosoftLoginPage.class),
@@ -113,12 +116,19 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
         private String id;
         private Class<? extends AbstractSocialLoginPage> pageObjectClazz;
+        private String configId = null;
 
         Provider(String id, Class<? extends AbstractSocialLoginPage> pageObjectClazz) {
             this.id = id;
             this.pageObjectClazz = pageObjectClazz;
         }
 
+        Provider(String id, String configId, Class<? extends AbstractSocialLoginPage> pageObjectClazz) {
+            this.id = id;
+            this.pageObjectClazz = pageObjectClazz;
+            this.configId = configId;
+        }
+
         public String id() {
             return id;
         }
@@ -126,6 +136,10 @@ public class SocialLoginTest extends AbstractKeycloakTest {
         public Class<? extends AbstractSocialLoginPage> pageObjectClazz() {
             return pageObjectClazz;
         }
+
+        public String configId() {
+            return configId != null ? configId : id;
+        }
     }
 
     @Deployment
@@ -133,7 +147,8 @@ public class SocialLoginTest extends AbstractKeycloakTest {
         return RunOnServerDeployment.create();
     }
 
-    private Provider currentTestProvider;
+    private Provider currentTestProvider = null;
+    private AbstractSocialLoginPage currentSocialLoginPage = null;
 
     @BeforeClass
     public static void loadConfig() throws Exception {
@@ -144,12 +159,15 @@ public class SocialLoginTest extends AbstractKeycloakTest {
     @Before
     public void beforeSocialLoginTest() {
         accountPage.setAuthRealm(REALM);
-        accountPage.navigateTo();
-        currentTestProvider = null;
     }
 
     @After
-    public void removeUser() {
+    public void afterSocialLoginTest() {
+        currentSocialLoginPage.logout();
+        currentTestProvider = null;
+    }
+
+    private void removeUser() {
         List<UserRepresentation> users = adminClient.realm(REALM).users().search(null, null, null);
         for (UserRepresentation user : users) {
             if (user.getServiceAccountClientId() == null) {
@@ -159,19 +177,25 @@ public class SocialLoginTest extends AbstractKeycloakTest {
         }
     }
 
+    private void setTestProvider(Provider provider) {
+        adminClient.realm(REALM).identityProviders().create(buildIdp(provider));
+        log.infof("added '%s' identity provider", provider.id());
+        currentTestProvider = provider;
+        currentSocialLoginPage = Graphene.createPageFragment(currentTestProvider.pageObjectClazz(), driver.findElement(By.tagName("html")));
+        accountPage.navigateTo();
+    }
+
     @Override
     public void addTestRealms(List<RealmRepresentation> testRealms) {
         RealmRepresentation rep = RealmBuilder.create().name(REALM).build();
-        List<IdentityProviderRepresentation> idps = new LinkedList<>();
-        rep.setIdentityProviders(idps);
-
-        for (Provider provider : Provider.values()) {
-            idps.add(buildIdp(provider));
-        }
-
         testRealms.add(rep);
     }
 
+    @Override
+    protected boolean isImportAfterEachMethod() {
+        return true;
+    }
+
     public static void setupClientExchangePermissions(KeycloakSession session) {
         RealmModel realm = session.realms().getRealmByName(REALM);
         ClientModel client = session.realms().getClientByClientId(EXCHANGE_CLIENT, realm);
@@ -219,7 +243,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void googleLogin() throws InterruptedException {
-        currentTestProvider = GOOGLE;
+        setTestProvider(GOOGLE);
         performLogin();
         assertAccount();
         testTokenExchange();
@@ -227,7 +251,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void bitbucketLogin() throws InterruptedException {
-        currentTestProvider = BITBUCKET;
+        setTestProvider(BITBUCKET);
         performLogin();
         assertAccount();
         testTokenExchange();
@@ -235,7 +259,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void gitlabLogin() throws InterruptedException {
-        currentTestProvider = GITLAB;
+        setTestProvider(GITLAB);
         performLogin();
         assertAccount();
         testTokenExchange();
@@ -243,7 +267,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void facebookLogin() throws InterruptedException {
-        currentTestProvider = FACEBOOK;
+        setTestProvider(FACEBOOK);
         performLogin();
         assertAccount();
         testTokenExchange();
@@ -252,15 +276,22 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void githubLogin() throws InterruptedException {
-        currentTestProvider = GITHUB;
+        setTestProvider(GITHUB);
         performLogin();
         assertAccount();
         testTokenExchange();
     }
 
     @Test
+    public void githubPrivateEmailLogin() throws InterruptedException {
+        setTestProvider(GITHUB_PRIVATE_EMAIL);
+        performLogin();
+        assertAccount();
+    }
+
+    @Test
     public void twitterLogin() {
-        currentTestProvider = TWITTER;
+        setTestProvider(TWITTER);
         performLogin();
         assertUpdateProfile(false, false, true);
         assertAccount();
@@ -268,28 +299,28 @@ public class SocialLoginTest extends AbstractKeycloakTest {
 
     @Test
     public void linkedinLogin() {
-        currentTestProvider = LINKEDIN;
+        setTestProvider(LINKEDIN);
         performLogin();
         assertAccount();
     }
 
     @Test
     public void microsoftLogin() {
-        currentTestProvider = MICROSOFT;
+        setTestProvider(MICROSOFT);
         performLogin();
         assertAccount();
     }
 
     @Test
     public void paypalLogin() {
-        currentTestProvider = PAYPAL;
+        setTestProvider(PAYPAL);
         performLogin();
         assertAccount();
     }
 
     @Test
     public void stackoverflowLogin() throws InterruptedException {
-        currentTestProvider = STACKOVERFLOW;
+        setTestProvider(STACKOVERFLOW);
         performLogin();
         assertUpdateProfile(false, false, true);
         assertAccount();
@@ -314,7 +345,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
     }
 
     private String getConfig(Provider provider, String key) {
-        return config.getProperty(provider.id() + "." + key, config.getProperty("common." + key));
+        return config.getProperty(provider.configId() + "." + key, config.getProperty("common." + key));
     }
 
     private String getConfig(String key) {
@@ -332,8 +363,7 @@ public class SocialLoginTest extends AbstractKeycloakTest {
         if (URLUtils.currentUrlDoesntStartWith(getAuthServerRoot().toASCIIString())) {
             log.infof("current URL: %s", driver.getCurrentUrl());
             log.infof("performing log in to '%s' ...", currentTestProvider.id());
-            AbstractSocialLoginPage loginPage = Graphene.createPageFragment(currentTestProvider.pageObjectClazz(), driver.findElement(By.tagName("html")));
-            loginPage.login(getConfig("username"), getConfig("password"));
+            currentSocialLoginPage.login(getConfig("username"), getConfig("password"));
         }
         else {
             log.infof("already logged in to '%s'; skipping the login process", currentTestProvider.id());