]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9962 Remove the ability to unset default quality profile
authorEric Hartmann <hartmann.eric@gmail.com>
Mon, 27 Nov 2017 10:52:14 +0000 (11:52 +0100)
committerEric Hartmann <hartmann.eric@gmail.Com>
Mon, 4 Dec 2017 12:44:55 +0000 (13:44 +0100)
server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateModule.java
server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java
server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGateModuleTest.java
server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java
tests/src/test/java/org/sonarqube/tests/qualityGate/ProjectQualityGatePageTest.java
tests/src/test/java/org/sonarqube/tests/qualityGate/QualityGateTest.java

index 000a13ab8561561b959d83c572456a7e0be9c020..a0fd5298e84d45fbb2190790c02571ae19764d27 100644 (file)
@@ -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,
index 7ccb53b0af371fd138f33a51f81db2d54c9e84c7..dbdd165d5c8b0f941f86b889d66ff83d50478526 100644 (file)
  */
 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();
   }
 
index 18a06580b42d4ba3b727d059dc56186f794fdd57..0abae931b0b500df85353901e2660cfa1def678c 100644 (file)
@@ -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);
   }
 }
index 60be5287542c78171b2007565e52ee8cea5068a9..ffacc2777f2d2cd20d86f5c988c852cdbaa4e457 100644 (file)
@@ -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;
index 474038f74cc71ac5a71dabe092ae1aa46335f4ef..1cdc8389520185b6d4538daecba02db219d2dc9e 100644 (file)
 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");
index 51439df8ea936ba6ec9d6f523b192d44185eb7e3..76f3f6770926168f8a82f89076d3ba21f87b928b 100644 (file)
@@ -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