Browse Source

SONAR-9016 Return 'default' in api/user_groups/search WS

tags/6.4-RC1
Julien Lancelot 7 years ago
parent
commit
5967fbf0de

+ 4
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDbTester.java View 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);

+ 4
- 0
server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/GroupWsSupport.java View 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.

+ 12
- 6
server/sonar-server/src/main/java/org/sonar/server/usergroups/ws/SearchAction.java View 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());
}

+ 11
- 7
server/sonar-server/src/main/resources/org/sonar/server/usergroups/ws/search-example.json View 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
}
]
}

+ 65
- 17
server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java View 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);

Loading…
Cancel
Save