aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>2017-04-24 09:27:57 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-04-27 14:25:54 +0200
commita261b1e68faee4610535264d37bc492bedb77a1a (patch)
treea782d44c20cd3a0a86fcce657a13a52e904c428f
parentbd111cca693f31c2b3acb7bebdf4208cfeb37f5d (diff)
downloadsonarqube-a261b1e68faee4610535264d37bc492bedb77a1a.tar.gz
sonarqube-a261b1e68faee4610535264d37bc492bedb77a1a.zip
SONAR-9151 add visibility flag to api/navigation/component
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java9
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java44
2 files changed, 51 insertions, 2 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
index 94518b9d788..9d31390107a 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
@@ -31,6 +31,7 @@ import javax.annotation.Nullable;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.resources.ResourceType;
import org.sonar.api.resources.ResourceTypes;
+import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService.NewAction;
@@ -118,7 +119,10 @@ public class ComponentAction implements NavigationWsAction {
.setHandler(this)
.setInternal(true)
.setResponseExample(getClass().getResource("component-example.json"))
- .setSince("5.2");
+ .setSince("5.2")
+ .setChangelog(
+ new Change("6.4" ,"The 'visibility' field is added")
+ );
projectNavigation.createParam(PARAM_COMPONENT)
.setDescription("A component key.")
@@ -161,6 +165,9 @@ public class ComponentAction implements NavigationWsAction {
.prop("name", component.name())
.prop("description", component.description())
.prop("isFavorite", isFavourite(session, component));
+ if (Qualifiers.PROJECT.equals(component.qualifier())) {
+ json.prop("visibility", component.isPrivate() ? "private" : "public");
+ }
List<Page> pages = pageRepository.getComponentPages(false, component.qualifier());
writeExtensions(json, component, pages);
if (analysis != null) {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java
index 9b59d6749b3..e3b2c21cc37 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.resources.ResourceType;
import org.sonar.api.resources.ResourceTypes;
+import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
@@ -41,6 +42,7 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.metric.MetricDto;
import org.sonar.db.organization.OrganizationDto;
@@ -60,6 +62,7 @@ import org.sonar.server.ui.PageRepository;
import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -113,7 +116,8 @@ public class ComponentActionTest {
assertThat(action.isInternal()).isTrue();
assertThat(action.description()).isNotNull();
assertThat(action.responseExample()).isNotNull();
- assertThat(action.changelog()).isEmpty();
+ assertThat(action.changelog()).extracting(Change::getVersion, Change::getDescription).containsExactlyInAnyOrder(
+ tuple("6.4", "The 'visibility' field is added"));
WebService.Param componentId = action.param(PARAM_COMPONENT);
assertThat(componentId.isRequired()).isFalse();
@@ -417,6 +421,44 @@ public class ComponentActionTest {
}
@Test
+ public void should_return_private_flag_for_project() throws Exception {
+ init();
+ OrganizationDto org = dbTester.organizations().insert();
+ ComponentDto project = dbTester.components().insertPrivateProject(org);
+
+ userSession.logIn()
+ .addProjectPermission(UserRole.ADMIN, project)
+ .addPermission(OrganizationPermission.ADMINISTER, org);
+ assertJson(execute(project.key())).isSimilarTo("{\"visibility\": \"private\"}");
+ }
+
+ @Test
+ public void should_return_public_flag_for_project() throws Exception {
+ init();
+ OrganizationDto org = dbTester.organizations().insert();
+ ComponentDto project = dbTester.components().insertPublicProject(org);
+
+ userSession.logIn()
+ .addProjectPermission(UserRole.ADMIN, project)
+ .addPermission(OrganizationPermission.ADMINISTER, org);
+ assertJson(execute(project.key())).isSimilarTo("{\"visibility\": \"public\"}");
+ }
+
+ @Test
+ public void should_not_return_private_flag_for_module() throws Exception {
+ init();
+ OrganizationDto org = dbTester.organizations().insert();
+ ComponentDto project = dbTester.components().insertPrivateProject(org);
+ ComponentDto module = dbTester.components().insertComponent(ComponentTesting.newModuleDto(project));
+
+ userSession.logIn()
+ .addProjectPermission(UserRole.ADMIN, project)
+ .addPermission(OrganizationPermission.ADMINISTER, org);
+ String json = execute(module.key());
+ assertThat(json).doesNotContain("visibility");
+ }
+
+ @Test
public void canApplyPermissionTemplate_is_true_if_logged_in_as_organization_administrator() {
init(createPages());
OrganizationDto org = dbTester.organizations().insert();