diff options
author | Daniel Schwarz <daniel.schwarz@sonarsource.com> | 2017-04-24 09:27:57 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2017-04-27 14:25:54 +0200 |
commit | a261b1e68faee4610535264d37bc492bedb77a1a (patch) | |
tree | a782d44c20cd3a0a86fcce657a13a52e904c428f | |
parent | bd111cca693f31c2b3acb7bebdf4208cfeb37f5d (diff) | |
download | sonarqube-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.java | 9 | ||||
-rw-r--r-- | server/sonar-server/src/test/java/org/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<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(); |