]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9016 Return 'default' in api/user_groups/search WS
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 3 Apr 2017 14:08:10 +0000 (16:08 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 13 Apr 2017 09:51:55 +0000 (11:51 +0200)
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java
server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java
server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java
server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json
server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java

index 91f06ccf0eb16ca909e57b935e6c9c2b3978ac11..ed4792e6174b4e0b1b4733cc9f554a26008832cd 100644 (file)
@@ -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);
index f088eb21373c7f97508962f01a7430ba2dc5354f..d6c35e275c07dfe69ea41597551c7370277b9312 100644 (file)
@@ -130,6 +130,10 @@ public class GroupWsSupport {
     return org.get();
   }
 
+  public Optional<Integer> 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.
index 15f70e04fe51508e98376f05f2112b8d696a4fbc..84380e52c25a459430e6b7a588dde88f5a2a1d12 100644 (file)
@@ -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<Integer> defaultGroupId = groupWsSupport.findDefaultGroupId(dbSession, organization);
 
       int limit = dbClient.groupDao().countByQuery(dbSession, organization.getUuid(), query);
       Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(limit);
       List<GroupDto> groups = dbClient.groupDao().selectByQuery(dbSession, organization.getUuid(), query, options.getOffset(), pageSize);
       List<Integer> groupIds = groups.stream().map(GroupDto::getId).collect(MoreCollectors.toList(groups.size()));
       Map<String, Integer> 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<GroupDto> groups, Map<String, Integer> userCountByGroup, Set<String> fields, Paging paging) {
+  private static SearchWsResponse buildResponse(List<GroupDto> groups, Map<String, Integer> userCountByGroup, Set<String> fields, Paging paging, Optional<Integer> 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<String> fields) {
-    Group.Builder groupBuilder = Group.newBuilder().setId(group.getId());
+  private static Group toWsGroup(GroupDto group, Integer memberCount, Set<String> fields, boolean isDefault) {
+    Group.Builder groupBuilder = Group.newBuilder()
+      .setId(group.getId())
+      .setDefault(isDefault);
     if (fields.contains(FIELD_NAME)) {
       groupBuilder.setName(group.getName());
     }
index e7371e910efc034d0126aa874f3857bbd78d9bcb..3749028681fff217ceb08e8e919f97260459940f 100644 (file)
@@ -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
     }
   ]
 }
index 169661b3f9fe7f53f6bdfb30f7566f013e426984..9746603e54c775c1f2709cd30a0bd1d0c1d3cf75 100644 (file)
@@ -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);