Merge pull request #2711 from ssilvert/migrate-LoginTest

Migrate LoginTest
This commit is contained in:
Stian Thorgersen 2016-04-25 13:40:51 +02:00
commit 320a9da585
6 changed files with 146 additions and 162 deletions

View file

@ -62,10 +62,10 @@ public interface TestingResource {
@POST @POST
@Path("/remove-user-session") @Path("/remove-user-session")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
Response removeUserSession(@QueryParam("realm") final String name, @QueryParam("session") final String sessionId); Response removeUserSession(@QueryParam("realm") final String realm, @QueryParam("session") final String sessionId);
@POST @POST
@Path("/remove-expired") @Path("/remove-expired")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
Response removeExpired(@QueryParam("realm") final String name); Response removeExpired(@QueryParam("realm") final String realm);
} }

View file

@ -29,8 +29,8 @@ import javax.ws.rs.core.UriBuilder;
*/ */
public class AppPage extends AbstractPage { public class AppPage extends AbstractPage {
public static final String AUTH_SERVER_URL = "http://localhost:8081/auth"; public static final String AUTH_SERVER_URL = "http://localhost:8180/auth";
public static final String baseUrl = "http://localhost:8081/app"; public static final String baseUrl = "http://localhost:8180/auth/realms/master/app";
@FindBy(id = "account") @FindBy(id = "account")
private WebElement accountLink; private WebElement accountLink;

View file

@ -109,6 +109,7 @@ public class GroupMappersTest extends AbstractGroupTest {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void testGroupMappers() throws Exception { public void testGroupMappers() throws Exception {
events.clear();
RealmResource realm = adminClient.realms().realm("test"); RealmResource realm = adminClient.realms().realm("test");
{ {
UserRepresentation user = realm.users().search("topGroupUser", -1, -1).get(0); UserRepresentation user = realm.users().search("topGroupUser", -1, -1).get(0);

View file

@ -16,41 +16,34 @@
*/ */
package org.keycloak.testsuite.forms; package org.keycloak.testsuite.forms;
import org.jboss.arquillian.graphene.page.Page;
import org.junit.Assert; import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.keycloak.OAuth2Constants; import org.keycloak.OAuth2Constants;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.events.Details; import org.keycloak.events.Details;
import org.keycloak.events.Event;
import org.keycloak.events.EventType; import org.keycloak.events.EventType;
import org.keycloak.models.BrowserSecurityHeaders; import org.keycloak.models.BrowserSecurityHeaders;
import org.keycloak.models.KeycloakSession; import org.keycloak.representations.idm.EventRepresentation;
import org.keycloak.models.PasswordPolicy; import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.models.RealmModel; import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.services.managers.RealmManager;
import org.keycloak.testsuite.AssertEvents; import org.keycloak.testsuite.AssertEvents;
import org.keycloak.testsuite.OAuthClient; import org.keycloak.testsuite.TestRealmKeycloakTest;
import org.keycloak.testsuite.pages.AppPage; import org.keycloak.testsuite.pages.AppPage;
import org.keycloak.testsuite.pages.AppPage.RequestType; import org.keycloak.testsuite.pages.AppPage.RequestType;
import org.keycloak.testsuite.pages.ErrorPage; import org.keycloak.testsuite.pages.ErrorPage;
import org.keycloak.testsuite.pages.LoginPage; import org.keycloak.testsuite.pages.LoginPage;
import org.keycloak.testsuite.pages.LoginPasswordUpdatePage; import org.keycloak.testsuite.pages.LoginPasswordUpdatePage;
import org.keycloak.testsuite.rule.KeycloakRule; import org.keycloak.testsuite.util.RealmBuilder;
import org.keycloak.testsuite.rule.WebResource; import org.keycloak.testsuite.util.UserBuilder;
import org.keycloak.testsuite.rule.WebRule;
import org.keycloak.common.util.Time; import org.keycloak.common.util.Time;
import org.openqa.selenium.WebDriver;
import java.util.Map;
import javax.ws.rs.client.Client; import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.Map;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -58,53 +51,46 @@ import static org.junit.Assert.assertTrue;
/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public class LoginTest { public class LoginTest extends TestRealmKeycloakTest {
@ClassRule @Override
public static KeycloakRule keycloakRule = new KeycloakRule(new KeycloakRule.KeycloakSetup() { public void configureTestRealm(RealmRepresentation testRealm) {
UserRepresentation user = UserBuilder.create()
.id("login-test")
.username("login-test")
.email("login@test.com")
.enabled(true)
.password("password")
.build();
userId = user.getId();
@Override UserRepresentation user2 = UserBuilder.create()
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) { .id("login-test2")
UserModel user = manager.getSession().users().addUser(appRealm, "login-test"); .username("login-test2")
user.setEmail("login@test.com"); .email("login2@test.com")
user.setEnabled(true); .enabled(true)
.password("password")
.build();
user2Id = user2.getId();
userId = user.getId(); RealmBuilder.edit(testRealm)
.user(user)
user.updateCredential(UserCredentialModel.password("password")); .user(user2);
}
UserModel user2 = manager.getSession().users().addUser(appRealm, "login-test2");
user2.setEmail("login2@test.com");
user2.setEnabled(true);
user2Id = user2.getId();
user2.updateCredential(UserCredentialModel.password("password"));
}
});
@Rule @Rule
public AssertEvents events = new AssertEvents(keycloakRule); public AssertEvents events = new AssertEvents(this);
@Rule @Page
public WebRule webRule = new WebRule(this);
@WebResource
protected OAuthClient oauth;
@WebResource
protected WebDriver driver;
@WebResource
protected AppPage appPage; protected AppPage appPage;
@WebResource @Page
protected LoginPage loginPage; protected LoginPage loginPage;
@WebResource @Page
protected ErrorPage errorPage; protected ErrorPage errorPage;
@WebResource @Page
protected LoginPasswordUpdatePage updatePasswordPage; protected LoginPasswordUpdatePage updatePasswordPage;
private static String userId; private static String userId;
@ -188,14 +174,15 @@ public class LoginTest {
.assertEvent(); .assertEvent();
} }
private void setUserEnabled(String userName, boolean enabled) {
UserRepresentation rep = adminClient.realm("test").users().get(userName).toRepresentation();
rep.setEnabled(enabled);
adminClient.realm("test").users().get(userName).update(rep);
}
@Test @Test
public void loginInvalidPasswordDisabledUser() { public void loginInvalidPasswordDisabledUser() {
keycloakRule.configure(new KeycloakRule.KeycloakSetup() { setUserEnabled("login-test", false);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
session.users().getUserByUsername("login-test", appRealm).setEnabled(false);
}
});
try { try {
loginPage.open(); loginPage.open();
@ -215,23 +202,13 @@ public class LoginTest {
.removeDetail(Details.CONSENT) .removeDetail(Details.CONSENT)
.assertEvent(); .assertEvent();
} finally { } finally {
keycloakRule.configure(new KeycloakRule.KeycloakSetup() { setUserEnabled("login-test", true);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
session.users().getUserByUsername("login-test", appRealm).setEnabled(true);
}
});
} }
} }
@Test @Test
public void loginDisabledUser() { public void loginDisabledUser() {
keycloakRule.configure(new KeycloakRule.KeycloakSetup() { setUserEnabled("login-test", false);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
session.users().getUserByUsername("login-test", appRealm).setEnabled(false);
}
});
try { try {
loginPage.open(); loginPage.open();
@ -251,12 +228,7 @@ public class LoginTest {
.removeDetail(Details.CONSENT) .removeDetail(Details.CONSENT)
.assertEvent(); .assertEvent();
} finally { } finally {
keycloakRule.configure(new KeycloakRule.KeycloakSetup() { setUserEnabled("login-test", true);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
session.users().getUserByUsername("login-test", appRealm).setEnabled(true);
}
});
} }
} }
@ -303,17 +275,19 @@ public class LoginTest {
@Test @Test
// KEYCLOAK-2557 // KEYCLOAK-2557
public void loginUserWithEmailAsUsername() { public void loginUserWithEmailAsUsername() {
KeycloakSession session = keycloakRule.startSession(); UserRepresentation rep = UserBuilder.create()
.enabled(true)
.id("foo")
.email("foo")
.username("login@test.com")
.password("password")
.build();
UserModel user = session.users().addUser(session.realms().getRealmByName("test"), "login@test.com"); adminClient.realm(userId).users().create(rep);
user.setEnabled(true);
user.updateCredential(UserCredentialModel.password("password"));
keycloakRule.stopSession(session, true);
loginPage.open(); loginPage.open();
loginPage.login("login@test.com", "password"); loginPage.login("login@test.com", "password");
Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType()); Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE)); Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
@ -349,86 +323,71 @@ public class LoginTest {
events.expectLogin().user(userId).removeDetail(Details.USERNAME).assertEvent(); events.expectLogin().user(userId).removeDetail(Details.USERNAME).assertEvent();
} }
private void setPasswordPolicy(String policy) {
RealmRepresentation realmRep = adminClient.realm("test").toRepresentation();
realmRep.setPasswordPolicy(policy);
adminClient.realm("test").update(realmRep);
}
@Test @Test
public void loginWithForcePasswordChangePolicy() { public void loginWithForcePasswordChangePolicy() {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setPasswordPolicy("forceExpiredPasswordChange(1)");
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
appRealm.setPasswordPolicy(new PasswordPolicy("forceExpiredPasswordChange(1)"));
}
});
try { try {
// Setting offset to more than one day to force password update // Setting offset to more than one day to force password update
// elapsedTime > timeToExpire // elapsedTime > timeToExpire
Time.setOffset(86405); Time.setOffset(86405);
loginPage.open(); loginPage.open();
loginPage.login("login-test", "password"); loginPage.login("login-test", "password");
updatePasswordPage.assertCurrent(); updatePasswordPage.assertCurrent();
updatePasswordPage.changePassword("updatedPassword", "updatedPassword"); updatePasswordPage.changePassword("updatedPassword", "updatedPassword");
events.expectRequiredAction(EventType.UPDATE_PASSWORD).user(userId).detail(Details.USERNAME, "login-test").assertEvent(); events.expectRequiredAction(EventType.UPDATE_PASSWORD).user(userId).detail(Details.USERNAME, "login-test").assertEvent();
assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType()); assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
events.expectLogin().user(userId).detail(Details.USERNAME, "login-test").assertEvent(); events.expectLogin().user(userId).detail(Details.USERNAME, "login-test").assertEvent();
} finally { } finally {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setPasswordPolicy(null);
@Override UserResource userRsc = adminClient.realm("test").users().get("login-test");
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) { UserBuilder userBuilder = UserBuilder.edit(userRsc.toRepresentation())
appRealm.setPasswordPolicy(new PasswordPolicy(null)); .password("password");
userRsc.update(userBuilder.build());
UserModel user = manager.getSession().users().getUserByUsername("login-test", appRealm);
UserCredentialModel cred = new UserCredentialModel();
cred.setType(CredentialRepresentation.PASSWORD);
cred.setValue("password");
user.updateCredential(cred);
}
});
Time.setOffset(0); Time.setOffset(0);
} }
} }
@Test @Test
public void loginWithoutForcePasswordChangePolicy() { public void loginWithoutForcePasswordChangePolicy() {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setPasswordPolicy("forceExpiredPasswordChange(1)");
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
appRealm.setPasswordPolicy(new PasswordPolicy("forceExpiredPasswordChange(1)"));
}
});
try { try {
// Setting offset to less than one day to avoid forced password update // Setting offset to less than one day to avoid forced password update
// elapsedTime < timeToExpire // elapsedTime < timeToExpire
Time.setOffset(86205); Time.setOffset(86205);
loginPage.open(); loginPage.open();
loginPage.login("login-test", "password"); loginPage.login("login-test", "password");
Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType()); Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE)); Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
events.expectLogin().user(userId).detail(Details.USERNAME, "login-test").assertEvent(); events.expectLogin().user(userId).detail(Details.USERNAME, "login-test").assertEvent();
} finally { } finally {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setPasswordPolicy(null);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
appRealm.setPasswordPolicy(new PasswordPolicy(null));
}
});
Time.setOffset(0); Time.setOffset(0);
} }
} }
@Test @Test
public void loginNoTimeoutWithLongWait() { public void loginNoTimeoutWithLongWait() {
try { try {
@ -484,14 +443,15 @@ public class LoginTest {
events.expectLogin().user(userId).assertEvent(); events.expectLogin().user(userId).assertEvent();
} }
private void setRememberMe(boolean enabled) {
RealmRepresentation rep = adminClient.realm("test").toRepresentation();
rep.setRememberMe(enabled);
adminClient.realm("test").update(rep);
}
@Test @Test
public void loginWithRememberMe() { public void loginWithRememberMe() {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setRememberMe(true);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
appRealm.setRememberMe(true);
}
});
try { try {
loginPage.open(); loginPage.open();
@ -502,14 +462,14 @@ public class LoginTest {
Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType()); Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE)); Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
Event loginEvent = events.expectLogin().user(userId) EventRepresentation loginEvent = events.expectLogin().user(userId)
.detail(Details.USERNAME, "login-test") .detail(Details.USERNAME, "login-test")
.detail(Details.REMEMBER_ME, "true") .detail(Details.REMEMBER_ME, "true")
.assertEvent(); .assertEvent();
String sessionId = loginEvent.getSessionId(); String sessionId = loginEvent.getSessionId();
// Expire session // Expire session
keycloakRule.removeUserSession(sessionId); testingClient.testing().removeUserSession("test", sessionId);
// Assert rememberMe checked and username/email prefilled // Assert rememberMe checked and username/email prefilled
loginPage.open(); loginPage.open();
@ -518,12 +478,7 @@ public class LoginTest {
loginPage.setRememberMe(false); loginPage.setRememberMe(false);
} finally { } finally {
keycloakRule.update(new KeycloakRule.KeycloakSetup() { setRememberMe(false);
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
appRealm.setRememberMe(false);
}
});
} }
} }
@ -533,12 +488,7 @@ public class LoginTest {
try { try {
loginPage.open(); loginPage.open();
Time.setOffset(5000); Time.setOffset(5000);
keycloakRule.update(new KeycloakRule.KeycloakSetup() { testingClient.testing().removeExpired("test");
@Override
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
manager.getSession().sessions().removeExpired(appRealm);
}
});
loginPage.login("login@test.com", "password"); loginPage.login("login@test.com", "password");

View file

@ -28,14 +28,20 @@ import java.util.LinkedList;
*/ */
public class RealmBuilder { public class RealmBuilder {
private RealmRepresentation rep = new RealmRepresentation(); private final RealmRepresentation rep;
public static RealmBuilder create() { public static RealmBuilder create() {
return new RealmBuilder(); RealmRepresentation rep = new RealmRepresentation();
rep.setEnabled(Boolean.TRUE);
return new RealmBuilder(rep);
} }
private RealmBuilder() { public static RealmBuilder edit(RealmRepresentation rep) {
rep.setEnabled(true); return new RealmBuilder(rep);
}
private RealmBuilder(RealmRepresentation rep) {
this.rep = rep;
} }
public RealmBuilder name(String name) { public RealmBuilder name(String name) {

View file

@ -29,14 +29,20 @@ import java.util.List;
*/ */
public class UserBuilder { public class UserBuilder {
private UserRepresentation rep = new UserRepresentation(); private final UserRepresentation rep;
public static UserBuilder create() { public static UserBuilder create() {
return new UserBuilder(); UserRepresentation rep = new UserRepresentation();
rep.setEnabled(Boolean.TRUE);
return new UserBuilder(rep);
} }
private UserBuilder() { public static UserBuilder edit(UserRepresentation rep) {
rep.setEnabled(true); return new UserBuilder(rep);
}
private UserBuilder(UserRepresentation rep) {
this.rep = rep;
} }
public UserBuilder id(String id) { public UserBuilder id(String id) {
@ -49,7 +55,10 @@ public class UserBuilder {
return this; return this;
} }
public UserBuilder password(String password) { /**
* This method adds additional passwords to the user.
*/
public UserBuilder addPassword(String password) {
if (rep.getCredentials() == null) { if (rep.getCredentials() == null) {
rep.setCredentials(new LinkedList<CredentialRepresentation>()); rep.setCredentials(new LinkedList<CredentialRepresentation>());
} }
@ -62,6 +71,24 @@ public class UserBuilder {
return this; return this;
} }
/**
* This method makes sure that there is one single password for the user.
*/
public UserBuilder password(String password) {
rep.setCredentials(null);
return addPassword(password);
}
public UserBuilder email(String email) {
rep.setEmail(email);
return this;
}
public UserBuilder enabled(boolean enabled) {
rep.setEnabled(enabled);
return this;
}
public UserBuilder role(String role) { public UserBuilder role(String role) {
if (rep.getRealmRoles() == null) { if (rep.getRealmRoles() == null) {
rep.setRealmRoles(new LinkedList<String>()); rep.setRealmRoles(new LinkedList<String>());