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;
.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.")
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);
}
}
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())
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());
}
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;
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;
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);
@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);
@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);
@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);
@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)
@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);
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();
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 {
}
}
+ 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);