From 8d3eac2ec8afe884fdae95dffa96bcda23048d42 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Thu, 27 Apr 2017 14:56:39 +0200 Subject: SONAR-9125 Allow preventing organizations to use private projects in api/organizations/update_project_visibility --- .../src/main/java/BillingValidations.java | 8 ++++ .../src/test/java/it/organization/BillingTest.java | 45 +++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) (limited to 'it') diff --git a/it/it-plugins/billing-plugin/src/main/java/BillingValidations.java b/it/it-plugins/billing-plugin/src/main/java/BillingValidations.java index 344f24925fd..0e57d8d305d 100644 --- a/it/it-plugins/billing-plugin/src/main/java/BillingValidations.java +++ b/it/it-plugins/billing-plugin/src/main/java/BillingValidations.java @@ -43,6 +43,14 @@ public class BillingValidations implements BillingValidationsExtension { } } + @Override + public void checkCanUpdateProjectVisibility(Organization organization, boolean updateToPrivate) { + boolean preventUpdatingProjectsToPrivate = settings.getBoolean(PREVENT_UPDATING_PROJECTS_VISIBILITY_TO_PRIVATE_SETTING); + if (preventUpdatingProjectsToPrivate) { + throw new BillingValidationsException(format("Organization %s cannot use private project", organization.getKey())); + } + } + @Override public boolean canUpdateProjectVisibilityToPrivate(Organization organization) { if (!settings.hasKey(PREVENT_UPDATING_PROJECTS_VISIBILITY_TO_PRIVATE_SETTING)) { diff --git a/it/it-tests/src/test/java/it/organization/BillingTest.java b/it/it-tests/src/test/java/it/organization/BillingTest.java index a78fdfc3a66..869f7601943 100644 --- a/it/it-tests/src/test/java/it/organization/BillingTest.java +++ b/it/it-tests/src/test/java/it/organization/BillingTest.java @@ -31,15 +31,19 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonarqube.ws.client.GetRequest; +import org.sonarqube.ws.client.HttpException; import org.sonarqube.ws.client.WsClient; import org.sonarqube.ws.client.WsResponse; import org.sonarqube.ws.client.organization.CreateWsRequest; +import org.sonarqube.ws.client.organization.UpdateProjectVisibilityWsRequest; +import org.sonarqube.ws.client.project.CreateRequest; import util.ItUtils; import util.user.UserRule; import static it.Category6Suite.enableOrganizationsSupport; import static java.lang.String.format; import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.junit.Assert.fail; import static org.sonarqube.ws.WsCe.TaskResponse; import static util.ItUtils.newAdminWsClient; import static util.ItUtils.newOrganizationKey; @@ -73,12 +77,12 @@ public class BillingTest { @Before public void setUp() throws Exception { userRule.deactivateUsers(USER_LOGIN); - resetSettings(orchestrator, "sonar.billing.preventProjectAnalysis"); + resetSettings(orchestrator, null, "sonar.billing.preventProjectAnalysis", "sonar.billing.preventUpdatingProjectsVisibilityToPrivate"); } @AfterClass public static void tearDown() throws Exception { - resetSettings(orchestrator, "sonar.billing.preventProjectAnalysis"); + resetSettings(orchestrator, null, "sonar.billing.preventProjectAnalysis", "sonar.billing.preventUpdatingProjectsVisibilityToPrivate"); userRule.deactivateUsers(USER_LOGIN); } @@ -124,8 +128,7 @@ public class BillingTest { @Test public void api_navigation_component_returns_canUpdateProjectVisibilityToPrivate() { String organizationKey = createOrganization(); - String projectKey = newProjectKey(); - executeAnalysis(projectKey, organizationKey); + String projectKey = createPublicProject(organizationKey); setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), "\"canUpdateProjectVisibilityToPrivate\":true"); @@ -134,12 +137,42 @@ public class BillingTest { assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), "\"canUpdateProjectVisibilityToPrivate\":false"); } + @Test + public void does_not_fail_to_update_default_projects_visibility_to_private() { + String organizationKey = createOrganization(); + setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); + + adminClient.organizations().updateProjectVisibility(UpdateProjectVisibilityWsRequest.builder().setOrganization(organizationKey).setProjectVisibility("private").build()); + + assertWsResponseAsAdmin(new GetRequest("api/navigation/organization").setParam("organization", organizationKey), "\"projectVisibility\":\"private\""); + } + + @Test + public void fail_to_update_default_projects_visibility_to_private() { + String organizationKey = createOrganization(); + setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); + + try { + adminClient.organizations().updateProjectVisibility(UpdateProjectVisibilityWsRequest.builder().setOrganization(organizationKey).setProjectVisibility("private").build()); + fail(); + } catch (HttpException ex) { + assertThat(ex.code()).isEqualTo(400); + assertThat(ex.content()).contains(format("Organization %s cannot use private project", organizationKey)); + } + } + private static String createOrganization() { String key = newOrganizationKey(); adminClient.organizations().create(new CreateWsRequest.Builder().setKey(key).setName(key).build()).getOrganization(); return key; } + private static String createPublicProject(String organizationKey) { + String projectKey = newProjectKey(); + adminClient.projects().create(CreateRequest.builder().setKey(projectKey).setName(projectKey).setOrganization(organizationKey).setVisibility("public").build()); + return projectKey; + } + private static String executeAnalysis(String organizationKey) { return executeAnalysis(newProjectKey(), organizationKey); } @@ -153,12 +186,12 @@ public class BillingTest { return ItUtils.extractCeTaskId(buildResult); } - private void assertWsResponseAsAdmin(GetRequest request, String expectedContent){ + private void assertWsResponseAsAdmin(GetRequest request, String expectedContent) { WsResponse response = adminClient.wsConnector().call(request).failIfNotSuccessful(); assertThat(response.content()).contains(expectedContent); } - private void assertWsResponseAsUser(GetRequest request, String expectedContent){ + private void assertWsResponseAsUser(GetRequest request, String expectedContent) { WsResponse response = newUserWsClient(orchestrator, USER_LOGIN, USER_LOGIN).wsConnector().call(request).failIfNotSuccessful(); assertThat(response.content()).contains(expectedContent); } -- cgit v1.2.3