From bdcd6c83057c7021ce649f728ed76c64a2c6eb3c Mon Sep 17 00:00:00 2001 From: Eric Hartmann Date: Mon, 27 Nov 2017 11:52:14 +0100 Subject: [PATCH] SONAR-9962 Remove the ability to unset default quality profile --- .../server/qualitygate/QualityGateModule.java | 2 - .../server/qualitygate/ws/QualityGatesWs.java | 14 +++ .../qualitygate/QualityGateModuleTest.java | 2 +- .../qualitygate/ws/QualityGatesWsTest.java | 27 ++-- .../ProjectQualityGatePageTest.java | 26 ---- .../tests/qualityGate/QualityGateTest.java | 119 ++++++------------ 6 files changed, 66 insertions(+), 124 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateModule.java b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateModule.java index 000a13ab856..a0fd5298e84 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateModule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateModule.java @@ -36,7 +36,6 @@ import org.sonar.server.qualitygate.ws.SearchAction; import org.sonar.server.qualitygate.ws.SelectAction; import org.sonar.server.qualitygate.ws.SetAsDefaultAction; import org.sonar.server.qualitygate.ws.ShowAction; -import org.sonar.server.qualitygate.ws.UnsetDefaultAction; import org.sonar.server.qualitygate.ws.UpdateConditionAction; public class QualityGateModule extends Module { @@ -59,7 +58,6 @@ public class QualityGateModule extends Module { CopyAction.class, DestroyAction.class, SetAsDefaultAction.class, - UnsetDefaultAction.class, SelectAction.class, DeselectAction.class, CreateConditionAction.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java index 7ccb53b0af3..dbdd165d5c8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java @@ -19,12 +19,14 @@ */ package org.sonar.server.qualitygate.ws; +import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.text.JsonWriter; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.exceptions.BadRequestException; +import org.sonar.server.ws.RemovedWebServiceHandler; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.CONTROLLER_QUALITY_GATES; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ERROR; @@ -54,6 +56,18 @@ public class QualityGatesWs implements WebService { action.define(controller); } + // unset_default is no more authorized + controller.createAction("unset_default") + .setDescription("This webservice is no more available : a default quality gate is mandatory.") + .setSince("4.3") + .setDeprecatedSince("7.0") + .setPost(true) + .setHandler(RemovedWebServiceHandler.INSTANCE) + .setResponseExample(RemovedWebServiceHandler.INSTANCE.getResponseExample()) + .setChangelog( + new Change("7.0", "Unset a quality gate is no more authorized") + ); + controller.done(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGateModuleTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGateModuleTest.java index 18a06580b42..0abae931b0b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGateModuleTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGateModuleTest.java @@ -29,6 +29,6 @@ public class QualityGateModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new QualityGateModule().configure(container); - assertThat(container.size()).isEqualTo(23 + 2); + assertThat(container.size()).isEqualTo(22 + 2); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java index 60be5287542..ffacc2777f2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java @@ -27,6 +27,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.WebService.Action; import org.sonar.api.server.ws.WebService.Controller; import org.sonar.db.DbClient; @@ -39,9 +40,11 @@ import org.sonar.server.qualitygate.QgateProjectFinder; import org.sonar.server.qualitygate.QgateProjectFinder.Association; import org.sonar.server.qualitygate.QualityGates; import org.sonar.server.tester.UserSessionRule; +import org.sonar.server.ws.RemovedWebServiceHandler; import org.sonar.server.ws.WsTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -68,7 +71,7 @@ public class QualityGatesWsTest { new CreateAction(null, null, null, null), new CopyAction(qGates), new DestroyAction(qGates), - new SetAsDefaultAction(qGates), new UnsetDefaultAction(qGates), + new SetAsDefaultAction(qGates), new CreateConditionAction(null, null, null, null), new UpdateConditionAction(null, null, null, null), new DeleteConditionAction(null, null, null), @@ -121,7 +124,14 @@ public class QualityGatesWsTest { assertThat(unsetDefault).isNotNull(); assertThat(unsetDefault.handler()).isNotNull(); assertThat(unsetDefault.since()).isEqualTo("4.3"); + assertThat(unsetDefault.deprecatedSince()).isEqualTo("7.0"); + assertThat(unsetDefault.changelog()) + .extracting(Change::getVersion, Change::getDescription) + .containsOnly( + tuple("7.0", "Unset a quality gate is no more authorized")); assertThat(unsetDefault.isPost()).isTrue(); + assertThat(unsetDefault.handler()).isEqualTo(RemovedWebServiceHandler.INSTANCE); + assertThat(unsetDefault.responseExample()).isEqualTo(RemovedWebServiceHandler.INSTANCE.getResponseExample()); assertThat(unsetDefault.isInternal()).isFalse(); Action createCondition = controller.action("create_condition"); @@ -159,21 +169,6 @@ public class QualityGatesWsTest { .assertJson("{\"id\":42,\"name\":\"Copied QG\"}"); } - @Test - public void set_as_default_nominal() throws Exception { - Long id = 42L; - tester.newPostRequest("api/qualitygates", "set_as_default").setParam("id", id.toString()).execute() - .assertNoContent(); - verify(qGates).setDefault(id); - } - - @Test - public void unset_default_nominal() throws Exception { - tester.newPostRequest("api/qualitygates", "unset_default").execute() - .assertNoContent(); - verify(qGates).setDefault(null); - } - @Test public void destroy_nominal() throws Exception { Long id = 42L; diff --git a/tests/src/test/java/org/sonarqube/tests/qualityGate/ProjectQualityGatePageTest.java b/tests/src/test/java/org/sonarqube/tests/qualityGate/ProjectQualityGatePageTest.java index 474038f74cc..1cdc8389520 100644 --- a/tests/src/test/java/org/sonarqube/tests/qualityGate/ProjectQualityGatePageTest.java +++ b/tests/src/test/java/org/sonarqube/tests/qualityGate/ProjectQualityGatePageTest.java @@ -20,16 +20,13 @@ package org.sonarqube.tests.qualityGate; import com.codeborne.selenide.Condition; -import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.sonar.orchestrator.Orchestrator; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; -import org.openqa.selenium.Keys; import org.sonar.wsclient.qualitygate.QualityGate; import org.sonar.wsclient.qualitygate.QualityGateClient; import org.sonarqube.qa.util.Tester; @@ -76,7 +73,6 @@ public class ProjectQualityGatePageTest { selectedQualityGate.should(Condition.text("Default")); selectedQualityGate.should(Condition.text(customQualityGate.name())); } finally { - qualityGateClient().unsetDefault(); qualityGateClient().destroy(customQualityGate.id()); } } @@ -92,14 +88,6 @@ public class ProjectQualityGatePageTest { selectedQualityGate.should(Condition.text(customQualityGate.name())); } - @Test - public void should_display_none() { - qualityGateClient().unsetDefault(); - - ProjectQualityGatePage page = openPage(); - page.assertNotSelected(); - } - @Test public void should_set_custom() { QualityGate customQualityGate = createCustomQualityGate("should_set_custom"); @@ -124,24 +112,10 @@ public class ProjectQualityGatePageTest { selectedQualityGate.should(Condition.text("Default")); selectedQualityGate.should(Condition.text(customQualityGate.name())); } finally { - qualityGateClient().unsetDefault(); qualityGateClient().destroy(customQualityGate.id()); } } - @Test - @Ignore - public void should_set_none() { - qualityGateClient().unsetDefault(); - QualityGate customQualityGate = createCustomQualityGate("should_set_none"); - associateWithQualityGate(customQualityGate); - - ProjectQualityGatePage page = openPage(); - Selenide.$(".Select-input input").sendKeys(Keys.UP, Keys.UP, Keys.UP, Keys.ENTER); - - page.assertNotSelected(); - } - private ProjectQualityGatePage openPage() { tester.wsClient().users().skipOnboardingTutorial(); Navigation navigation = tester.openBrowser().logIn().submitCredentials("admin"); diff --git a/tests/src/test/java/org/sonarqube/tests/qualityGate/QualityGateTest.java b/tests/src/test/java/org/sonarqube/tests/qualityGate/QualityGateTest.java index 51439df8ea9..76f3f677092 100644 --- a/tests/src/test/java/org/sonarqube/tests/qualityGate/QualityGateTest.java +++ b/tests/src/test/java/org/sonarqube/tests/qualityGate/QualityGateTest.java @@ -101,32 +101,17 @@ public class QualityGateTest { } } - @Test - public void do_not_compute_status_if_no_gate() throws Exception { - qgClient().unsetDefault(); - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_NO_QG); - - assertThat(getGateStatusMeasure(projectKey)).isNull(); - } - @Test public void status_ok_if_empty_gate() throws Exception { QualityGate empty = qgClient().create("Empty"); qgClient().setDefault(empty.id()); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); - } finally { - qgClient().unsetDefault(); - } + assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); } @Test @@ -135,16 +120,12 @@ public class QualityGateTest { qgClient().setDefault(simple.id()); qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").warningThreshold("40")); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); - } finally { - qgClient().unsetDefault(); - } + assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); } @Test @@ -153,16 +134,12 @@ public class QualityGateTest { qgClient().setDefault(simple.id()); qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").warningThreshold("10")); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("WARN"); - } finally { - qgClient().unsetDefault(); - } + assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("WARN"); } @Test @@ -171,16 +148,12 @@ public class QualityGateTest { qgClient().setDefault(simple.id()); qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").errorThreshold("10")); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); - } finally { - qgClient().unsetDefault(); - } + assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); } @Test @@ -195,15 +168,11 @@ public class QualityGateTest { orchestrator.getServer().provisionProject(projectKey, projectKey); associateQualityGateToProject(error.id(), projectKey); - try { - BuildResult buildResult = executeAnalysis(projectKey); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); - } finally { - qgClient().unsetDefault(); - } + assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); } @Test @@ -213,22 +182,18 @@ public class QualityGateTest { qgClient().createCondition(NewCondition.create(allTypes.id()).metricKey("duplicated_lines_density").operator("GT").warningThreshold("20")); qgClient().setDefault(allTypes.id()); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey, "sonar.cpd.xoo.minimumLines", "2", "sonar.cpd.xoo.minimumTokens", "5"); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey, "sonar.cpd.xoo.minimumLines", "2", "sonar.cpd.xoo.minimumTokens", "5"); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); - Measure alertStatus = getGateStatusMeasure(projectKey); - assertThat(alertStatus.getValue()).isEqualTo("WARN"); + Measure alertStatus = getGateStatusMeasure(projectKey); + assertThat(alertStatus.getValue()).isEqualTo("WARN"); - String qualityGateDetailJson = getMeasure(orchestrator, projectKey, "quality_gate_details").getValue(); - assertThat(QualityGateDetails.parse(qualityGateDetailJson).getConditions()) - .extracting(QualityGateDetails.Conditions::getMetric, QualityGateDetails.Conditions::getOp, QualityGateDetails.Conditions::getWarning) - .contains(tuple("ncloc", "GT", "10"), tuple("duplicated_lines_density", "GT", "20")); - } finally { - qgClient().unsetDefault(); - } + String qualityGateDetailJson = getMeasure(orchestrator, projectKey, "quality_gate_details").getValue(); + assertThat(QualityGateDetails.parse(qualityGateDetailJson).getConditions()) + .extracting(QualityGateDetails.Conditions::getMetric, QualityGateDetails.Conditions::getOp, QualityGateDetails.Conditions::getWarning) + .contains(tuple("ncloc", "GT", "10"), tuple("duplicated_lines_density", "GT", "20")); } @Test @@ -237,25 +202,21 @@ public class QualityGateTest { qgClient().setDefault(simple.id()); qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").errorThreshold("7")); - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); + String projectKey = newProjectKey(); + BuildResult buildResult = executeAnalysis(projectKey); - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); + verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - String taskId = getTaskIdInLocalReport(projectDir("qualitygate/xoo-sample")); - String analysisId = getAnalysisId(taskId); + String taskId = getTaskIdInLocalReport(projectDir("qualitygate/xoo-sample")); + String analysisId = getAnalysisId(taskId); - Qualitygates.ProjectStatusResponse projectStatusWsResponse = tester.wsClient().qualityGates().projectStatus(new ProjectStatusRequest().setAnalysisId(analysisId)); - Qualitygates.ProjectStatusResponse.ProjectStatus projectStatus = projectStatusWsResponse.getProjectStatus(); - assertThat(projectStatus.getStatus()).isEqualTo(Qualitygates.ProjectStatusResponse.Status.ERROR); - assertThat(projectStatus.getConditionsCount()).isEqualTo(1); - Qualitygates.ProjectStatusResponse.Condition condition = projectStatus.getConditionsList().get(0); - assertThat(condition.getMetricKey()).isEqualTo("ncloc"); - assertThat(condition.getErrorThreshold()).isEqualTo("7"); - } finally { - qgClient().unsetDefault(); - } + ProjectStatusWsResponse projectStatusWsResponse = tester.wsClient().qualityGates().projectStatus(new ProjectStatusRequest().setAnalysisId(analysisId)); + ProjectStatusWsResponse.ProjectStatus projectStatus = projectStatusWsResponse.getProjectStatus(); + assertThat(projectStatus.getStatus()).isEqualTo(ProjectStatusWsResponse.Status.ERROR); + assertThat(projectStatus.getConditionsCount()).isEqualTo(1); + ProjectStatusWsResponse.Condition condition = projectStatus.getConditionsList().get(0); + assertThat(condition.getMetricKey()).isEqualTo("ncloc"); + assertThat(condition.getErrorThreshold()).isEqualTo("7"); } @Test -- 2.39.5