From 5967fbf0de2e02ab48e4c57bd33bddb888b5cf51 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 3 Apr 2017 16:08:10 +0200 Subject: [PATCH] SONAR-9016 Return 'default' in api/user_groups/search WS --- .../java/org/sonar/db/user/UserDbTester.java | 4 + .../server/usergroups/ws/GroupWsSupport.java | 4 + .../server/usergroups/ws/SearchAction.java | 18 ++-- .../server/usergroups/ws/search-example.json | 18 ++-- .../usergroups/ws/SearchActionTest.java | 82 +++++++++++++++---- 5 files changed, 96 insertions(+), 30 deletions(-) diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java index 91f06ccf0eb..ed4792e6174 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java @@ -138,6 +138,10 @@ public class UserDbTester { return dto; } + public GroupDto insertDefaultGroup(OrganizationDto organization, String name) { + return insertDefaultGroup(newGroupDto().setName(name).setOrganizationUuid(organization.getUuid())); + } + @CheckForNull public GroupDto selectGroupById(int groupId) { return db.getDbClient().groupDao().selectById(db.getSession(), groupId); diff --git a/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java b/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java index f088eb21373..d6c35e275c0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java +++ b/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java @@ -130,6 +130,10 @@ public class GroupWsSupport { return org.get(); } + public Optional findDefaultGroupId(DbSession dbSession, OrganizationDto organization) { + return dbClient.organizationDao().getDefaultGroupId(dbSession, organization.getUuid()); + } + /** * Similar to {@link UserGroupValidation#validateGroupName(String)} but kept internal. No need to publish * this method in public API. diff --git a/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java index 15f70e04fe5..84380e52c25 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java @@ -23,6 +23,7 @@ import com.google.common.collect.Sets; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; @@ -77,7 +78,8 @@ public class SearchAction implements UserGroupsWsAction { .addFieldsParam(ALL_FIELDS) .addPagingParams(100, MAX_LIMIT) .addSearchQuery("sonar-users", "names") - .setChangelog(new Change("6.4", "Paging response fields moved to a Paging object")); + .setChangelog(new Change("6.4", "Paging response fields moved to a Paging object"), + new Change("6.4", "'default' response field has been added")); action.createParam(PARAM_ORGANIZATION_KEY) .setDescription("Key of organization. If not set then groups are searched in default organization.") @@ -99,13 +101,14 @@ public class SearchAction implements UserGroupsWsAction { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = groupWsSupport.findOrganizationByKey(dbSession, request.param(PARAM_ORGANIZATION_KEY)); userSession.checkLoggedIn().checkPermission(ADMINISTER, organization); + Optional defaultGroupId = groupWsSupport.findDefaultGroupId(dbSession, organization); int limit = dbClient.groupDao().countByQuery(dbSession, organization.getUuid(), query); Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(limit); List groups = dbClient.groupDao().selectByQuery(dbSession, organization.getUuid(), query, options.getOffset(), pageSize); List groupIds = groups.stream().map(GroupDto::getId).collect(MoreCollectors.toList(groups.size())); Map userCountByGroup = dbClient.groupMembershipDao().countUsersByGroups(dbSession, groupIds); - writeProtobuf(buildResponse(groups, userCountByGroup, fields, paging), request, response); + writeProtobuf(buildResponse(groups, userCountByGroup, fields, paging, defaultGroupId), request, response); } } @@ -120,9 +123,10 @@ public class SearchAction implements UserGroupsWsAction { return fields; } - private static SearchWsResponse buildResponse(List groups, Map userCountByGroup, Set fields, Paging paging) { + private static SearchWsResponse buildResponse(List groups, Map userCountByGroup, Set fields, Paging paging, Optional defaultGroupId) { SearchWsResponse.Builder responseBuilder = SearchWsResponse.newBuilder(); - groups.forEach(group -> responseBuilder.addGroups(toWsGroup(group, userCountByGroup.get(group.getName()), fields))); + groups.forEach(group -> responseBuilder + .addGroups(toWsGroup(group, userCountByGroup.get(group.getName()), fields, defaultGroupId.isPresent() && defaultGroupId.get().equals(group.getId())))); responseBuilder.getPagingBuilder() .setPageIndex(paging.pageIndex()) .setPageSize(paging.pageSize()) @@ -131,8 +135,10 @@ public class SearchAction implements UserGroupsWsAction { return responseBuilder.build(); } - private static Group toWsGroup(GroupDto group, Integer memberCount, Set fields) { - Group.Builder groupBuilder = Group.newBuilder().setId(group.getId()); + private static Group toWsGroup(GroupDto group, Integer memberCount, Set fields, boolean isDefault) { + Group.Builder groupBuilder = Group.newBuilder() + .setId(group.getId()) + .setDefault(isDefault); if (fields.contains(FIELD_NAME)) { groupBuilder.setName(group.getName()); } diff --git a/server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json b/server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json index e7371e910ef..3749028681f 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json @@ -1,19 +1,23 @@ { - "p": 1, - "ps": 100, - "total": 2, + "paging": { + "pageIndex": 1, + "pageSize": 100, + "total": 2 + }, "groups": [ { - "id": "1", + "id": 3, "name": "users", "description": "Users", - "membersCount": 17 + "membersCount": 17, + "default": true }, { - "id": "2", + "id": 4, "name": "administrators", "description": "Administrators", - "membersCount": 2 + "membersCount": 2, + "default": false } ] } diff --git a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java index 169661b3f9f..9746603e54c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java @@ -24,6 +24,7 @@ import java.io.IOException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; @@ -46,6 +47,7 @@ import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE; import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.db.user.GroupTesting.newGroupDto; +import static org.sonar.test.JsonAssert.assertJson; import static org.sonarqube.ws.WsUserGroups.Group; import static org.sonarqube.ws.WsUserGroups.SearchWsResponse; @@ -62,19 +64,9 @@ public class SearchActionTest { private WsActionTester ws = new WsActionTester(new SearchAction(db.getDbClient(), userSession, newGroupWsSupport())); - @Test - public void search_empty() throws Exception { - loginAsDefaultOrgAdmin(); - - SearchWsResponse response = call(ws.newRequest()); - - assertThat(response.getGroupsList()).isEmpty(); - assertThat(response.getPaging().getTotal()).isZero(); - } - @Test public void search_without_parameters() throws Exception { - insertGroup(db.getDefaultOrganization(), "users", 0); + insertDefaultGroup(db.getDefaultOrganization(), "users", 0); insertGroup(db.getDefaultOrganization(), "admins", 0); insertGroup(db.getDefaultOrganization(), "customer1", 0); insertGroup(db.getDefaultOrganization(), "customer2", 0); @@ -93,7 +85,7 @@ public class SearchActionTest { @Test public void search_with_members() throws Exception { - insertGroup(db.getDefaultOrganization(), "users", 5); + insertDefaultGroup(db.getDefaultOrganization(), "users", 5); insertGroup(db.getDefaultOrganization(), "admins", 1); insertGroup(db.getDefaultOrganization(), "customer1", 0); insertGroup(db.getDefaultOrganization(), "customer2", 4); @@ -112,7 +104,7 @@ public class SearchActionTest { @Test public void search_with_query() throws Exception { - insertGroup(db.getDefaultOrganization(), "users", 0); + insertDefaultGroup(db.getDefaultOrganization(), "users", 0); insertGroup(db.getDefaultOrganization(), "admins", 0); insertGroup(db.getDefaultOrganization(), "customer%_%/1", 0); insertGroup(db.getDefaultOrganization(), "customer%_%/2", 0); @@ -129,7 +121,7 @@ public class SearchActionTest { @Test public void search_with_paging() throws Exception { - insertGroup(db.getDefaultOrganization(), "users", 0); + insertDefaultGroup(db.getDefaultOrganization(), "users", 0); insertGroup(db.getDefaultOrganization(), "admins", 0); insertGroup(db.getDefaultOrganization(), "customer1", 0); insertGroup(db.getDefaultOrganization(), "customer2", 0); @@ -156,7 +148,7 @@ public class SearchActionTest { @Test public void search_with_fields() throws Exception { - insertGroup(db.getDefaultOrganization(), "sonar-users", 0); + insertDefaultGroup(db.getDefaultOrganization(), "sonar-users", 0); loginAsDefaultOrgAdmin(); assertThat(call(ws.newRequest()).getGroupsList()).extracting(Group::hasId, Group::hasName, Group::hasDescription, Group::hasMembersCount) @@ -174,9 +166,9 @@ public class SearchActionTest { @Test public void search_in_organization() throws Exception { OrganizationDto org = db.organizations().insert(); - GroupDto group = db.users().insertGroup(org, "users"); + GroupDto group = db.users().insertDefaultGroup(org, "users"); // the group in default org is not returned - db.users().insertGroup(db.getDefaultOrganization(), "users"); + db.users().insertDefaultGroup(db.getDefaultOrganization(), "users"); loginAsDefaultOrgAdmin(); userSession.addPermission(ADMINISTER, org); @@ -185,6 +177,27 @@ public class SearchActionTest { assertThat(response.getGroupsList()).extracting(Group::getId, Group::getName).containsOnly(tuple(group.getId().longValue(), "users")); } + + @Test + public void return_default_group() throws Exception { + db.users().insertDefaultGroup(db.getDefaultOrganization(), "default"); + loginAsDefaultOrgAdmin(); + + SearchWsResponse response = call(ws.newRequest()); + + assertThat(response.getGroupsList()).extracting(Group::getName, Group::getDefault).containsOnly(tuple("default", true)); + } + + @Test + public void return_no_default_group() throws Exception { + db.users().insertGroup(db.getDefaultOrganization(), "users"); + loginAsDefaultOrgAdmin(); + + SearchWsResponse response = call(ws.newRequest()); + + assertThat(response.getGroupsList()).extracting(Group::getName, Group::getDefault).containsOnly(tuple("users", false)); + } + @Test public void fail_when_not_logged_in() throws Exception { userSession.anonymous(); @@ -193,6 +206,31 @@ public class SearchActionTest { call(ws.newRequest()); } + @Test + public void test_json_example() { + insertDefaultGroup(db.getDefaultOrganization(), "users", 17); + insertGroup(db.getDefaultOrganization(), "administrators", 2); + loginAsDefaultOrgAdmin(); + + String response = ws.newRequest().setMediaType(MediaTypes.JSON).execute().getInput(); + + assertJson(response).ignoreFields("id").isSimilarTo(ws.getDef().responseExampleAsString()); + } + + @Test + public void verify_definition() { + WebService.Action action = ws.getDef(); + + assertThat(action.since()).isEqualTo("5.2"); + assertThat(action.isPost()).isFalse(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.responseExampleAsString()).isNotEmpty(); + + assertThat(action.params()).extracting(WebService.Param::key).containsOnly("p", "q", "ps", "f", "organization"); + + assertThat(action.param("f").possibleValues()).containsOnly("name", "description", "membersCount"); + } + private SearchWsResponse call(TestRequest request) { request.setMediaType(MediaTypes.PROTOBUF); try { @@ -202,9 +240,19 @@ public class SearchActionTest { } } + private void insertDefaultGroup(OrganizationDto org, String name, int numberOfMembers) { + GroupDto group = newGroupDto().setName(name).setDescription(capitalize(name)).setOrganizationUuid(org.getUuid()); + db.users().insertDefaultGroup(group); + addMembers(group, numberOfMembers); + } + private void insertGroup(OrganizationDto org, String name, int numberOfMembers) { GroupDto group = newGroupDto().setName(name).setDescription(capitalize(name)).setOrganizationUuid(org.getUuid()); db.users().insertGroup(group); + addMembers(group, numberOfMembers); + } + + private void addMembers(GroupDto group, int numberOfMembers) { for (int i = 0; i < numberOfMembers; i++) { UserDto user = db.users().insertUser(); db.users().insertMember(group, user); -- 2.39.5