From a261b1e68faee4610535264d37bc492bedb77a1a Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Mon, 24 Apr 2017 09:27:57 +0200 Subject: SONAR-9151 add visibility flag to api/navigation/component --- .../org/sonar/server/ui/ws/ComponentAction.java | 9 ++++- .../sonar/server/ui/ws/ComponentActionTest.java | 44 +++++++++++++++++++++- 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 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(); @@ -416,6 +420,44 @@ public class ComponentActionTest { assertJson(result).ignoreFields("snapshotDate", "key", "qualityGate.key").isSimilarTo(ws.getDef().responseExampleAsString()); } + @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()); -- cgit v1.2.3