From 8c8c44e50f9e18e10df780539ce31a8c08028590 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Tue, 2 Sep 2014 10:01:44 +0200 Subject: [PATCH] KEYCLOAK-658 Fix searching for users --- .../admin/client/resource/UsersResource.java | 12 ++-- .../models/UserFederationManager.java | 3 +- .../resources/admin/UsersResource.java | 3 - .../keycloak/testsuite/admin/UserTest.java | 72 +++++++++++++++++++ 4 files changed, 82 insertions(+), 8 deletions(-) diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java index a1d5552121..0580a50d04 100755 --- a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java +++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java @@ -16,14 +16,18 @@ public interface UsersResource { @GET @Produces(MediaType.APPLICATION_JSON) - public List search(@QueryParam("username") String username, + public List search(@QueryParam("username") String username, @QueryParam("firstName") String firstName, - @QueryParam("lastName") String lastName, - @QueryParam("email") String email); + @QueryParam("lastName") String lastName, + @QueryParam("email") String email, + @QueryParam("first") Integer firstResult, + @QueryParam("max") Integer maxResults); @GET @Produces(MediaType.APPLICATION_JSON) - public List search(@QueryParam("search") String search); + public List search(@QueryParam("search") String search, + @QueryParam("first") Integer firstResult, + @QueryParam("max") Integer maxResults); @POST @Consumes(MediaType.APPLICATION_JSON) diff --git a/model/api/src/main/java/org/keycloak/models/UserFederationManager.java b/model/api/src/main/java/org/keycloak/models/UserFederationManager.java index 13faf73cf2..ce3eb7f69b 100755 --- a/model/api/src/main/java/org/keycloak/models/UserFederationManager.java +++ b/model/api/src/main/java/org/keycloak/models/UserFederationManager.java @@ -193,7 +193,7 @@ public class UserFederationManager implements UserProvider { protected List query(PaginatedQuery pagedQuery, RealmModel realm, int firstResult, int maxResults) { List results = new LinkedList(); - if (maxResults <= 0) return results; + if (maxResults == 0) return results; int first = firstResult; int max = maxResults; do { @@ -210,6 +210,7 @@ public class UserFederationManager implements UserProvider { if (query.size() < max) return results; first = query.size(); max -= added; + if (max <= 0) return results; } while (true); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java index de1cc0612f..79584fffda 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java @@ -376,9 +376,6 @@ public class UsersResource { attributes.put(UserModel.USERNAME, username); } userModels = session.users().searchForUserByAttributes(attributes, realm, firstResult, maxResults); - for (UserModel user : userModels) { - results.add(ModelToRepresentation.toRepresentation(user)); - } } else { userModels = session.users().getUsers(realm, firstResult, maxResults); } diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java index d3981c4c13..a25f98efd5 100644 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java @@ -5,6 +5,8 @@ import org.keycloak.representations.idm.UserRepresentation; import javax.ws.rs.ClientErrorException; +import java.util.List; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -36,4 +38,74 @@ public class UserTest extends AbstractClientTest { } } + private void createUsers() { + for (int i = 1; i < 10; i++) { + UserRepresentation user = new UserRepresentation(); + user.setUsername("username" + i); + user.setEmail("user" + i + "@localhost"); + user.setFirstName("First" + i); + user.setLastName("Last" + i); + + realm.users().create(user); + } + } + + @Test + public void searchByEmail() { + createUsers(); + + List users = realm.users().search(null, null, null, "user1@localhost", null, null); + assertEquals(1, users.size()); + + users = realm.users().search(null, null, null, "@localhost", null, null); + assertEquals(9, users.size()); + } + + @Test + public void searchByUsername() { + createUsers(); + + List users = realm.users().search("username1", null, null, null, null, null); + assertEquals(1, users.size()); + + users = realm.users().search("user", null, null, null, null, null); + assertEquals(9, users.size()); + } + + @Test + public void search() { + createUsers(); + + List users = realm.users().search("username1", null, null); + assertEquals(1, users.size()); + + users = realm.users().search("first1", null, null); + assertEquals(1, users.size()); + + users = realm.users().search("last", null, null); + assertEquals(9, users.size()); + } + + @Test + public void searchPaginated() { + createUsers(); + + List users = realm.users().search("username", 0, 1); + assertEquals(1, users.size()); + assertEquals("username1", users.get(0).getUsername()); + + users = realm.users().search("username", 5, 2); + assertEquals(2, users.size()); + assertEquals("username6", users.get(0).getUsername()); + assertEquals("username7", users.get(1).getUsername()); + + users = realm.users().search("username", 7, 20); + assertEquals(2, users.size()); + assertEquals("username8", users.get(0).getUsername()); + assertEquals("username9", users.get(1).getUsername()); + + users = realm.users().search("username", 0, 20); + assertEquals(9, users.size()); + } + }