Skip to content

Commit

Permalink
SONAR-10088 Prevent creating condition on built-in quality gate
Browse files Browse the repository at this point in the history
  • Loading branch information
julienlancelot authored and ehartmann committed Dec 4, 2017
1 parent fb63d5d commit af3451f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 13 deletions.
Expand Up @@ -24,13 +24,10 @@
import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.permission.OrganizationPermission;
import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateConditionDto;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.qualitygate.QualityGateConditionsUpdater; import org.sonar.server.qualitygate.QualityGateConditionsUpdater;
import org.sonar.server.qualitygate.QualityGateFinder; import org.sonar.server.qualitygate.QualityGateFinder;
import org.sonar.server.user.UserSession;
import org.sonarqube.ws.Qualitygates.CreateConditionResponse; import org.sonarqube.ws.Qualitygates.CreateConditionResponse;


import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.core.util.Protobuf.setNullable;
Expand All @@ -46,19 +43,16 @@


public class CreateConditionAction implements QualityGatesWsAction { public class CreateConditionAction implements QualityGatesWsAction {


private final UserSession userSession;
private final DbClient dbClient; private final DbClient dbClient;
private final QualityGateConditionsUpdater qualityGateConditionsUpdater; private final QualityGateConditionsUpdater qualityGateConditionsUpdater;
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final QualityGateFinder qualityGateFinder; private final QualityGateFinder qualityGateFinder;
private final QualityGatesWsSupport wsSupport;


public CreateConditionAction(UserSession userSession, DbClient dbClient, QualityGateConditionsUpdater qualityGateConditionsUpdater, public CreateConditionAction(DbClient dbClient, QualityGateConditionsUpdater qualityGateConditionsUpdater, QualityGateFinder qualityGateFinder, QualityGatesWsSupport wsSupport) {
DefaultOrganizationProvider defaultOrganizationProvider, QualityGateFinder qualityGateFinder) {
this.userSession = userSession;
this.dbClient = dbClient; this.dbClient = dbClient;
this.qualityGateConditionsUpdater = qualityGateConditionsUpdater; this.qualityGateConditionsUpdater = qualityGateConditionsUpdater;
this.defaultOrganizationProvider = defaultOrganizationProvider;
this.qualityGateFinder = qualityGateFinder; this.qualityGateFinder = qualityGateFinder;
this.wsSupport = wsSupport;
} }


@Override @Override
Expand All @@ -82,8 +76,6 @@ public void define(WebService.NewController controller) {


@Override @Override
public void handle(Request request, Response response) { public void handle(Request request, Response response) {
userSession.checkPermission(OrganizationPermission.ADMINISTER_QUALITY_GATES, defaultOrganizationProvider.get().getUuid());

int gateId = request.mandatoryParamAsInt(PARAM_GATE_ID); int gateId = request.mandatoryParamAsInt(PARAM_GATE_ID);
String metric = request.mandatoryParam(PARAM_METRIC); String metric = request.mandatoryParam(PARAM_METRIC);
String operator = request.mandatoryParam(PARAM_OPERATOR); String operator = request.mandatoryParam(PARAM_OPERATOR);
Expand All @@ -93,6 +85,7 @@ public void handle(Request request, Response response) {


try (DbSession dbSession = dbClient.openSession(false)) { try (DbSession dbSession = dbClient.openSession(false)) {
QualityGateDto qualityGate = qualityGateFinder.getById(dbSession, gateId); QualityGateDto qualityGate = qualityGateFinder.getById(dbSession, gateId);
wsSupport.checkCanEdit(qualityGate);
QualityGateConditionDto condition = qualityGateConditionsUpdater.createCondition(dbSession, qualityGate, metric, operator, warning, error, period); QualityGateConditionDto condition = qualityGateConditionsUpdater.createCondition(dbSession, qualityGate, metric, operator, warning, error, period);
CreateConditionResponse.Builder createConditionResponse = CreateConditionResponse.newBuilder() CreateConditionResponse.Builder createConditionResponse = CreateConditionResponse.newBuilder()
.setId(condition.getId()) .setId(condition.getId())
Expand Down
Expand Up @@ -41,6 +41,7 @@
import org.sonar.server.ws.WsActionTester; import org.sonar.server.ws.WsActionTester;
import org.sonarqube.ws.Qualitygates.CreateConditionResponse; import org.sonarqube.ws.Qualitygates.CreateConditionResponse;


import static java.lang.String.format;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple; import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.measures.Metric.ValueType.INT; import static org.sonar.api.measures.Metric.ValueType.INT;
Expand All @@ -66,8 +67,8 @@ public class CreateConditionActionTest {
private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
private DbClient dbClient = db.getDbClient(); private DbClient dbClient = db.getDbClient();
private DbSession dbSession = db.getSession(); private DbSession dbSession = db.getSession();
private CreateConditionAction underTest = new CreateConditionAction(userSession, dbClient, new QualityGateConditionsUpdater(dbClient), defaultOrganizationProvider, private CreateConditionAction underTest = new CreateConditionAction(dbClient, new QualityGateConditionsUpdater(dbClient),
new QualityGateFinder(dbClient)); new QualityGateFinder(dbClient), new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider));


private WsActionTester ws = new WsActionTester(underTest); private WsActionTester ws = new WsActionTester(underTest);


Expand Down Expand Up @@ -104,6 +105,18 @@ public void create_condition_over_leak_period() throws Exception {
assertCondition(qualityGate, metric, "LT", null, "90", 1); assertCondition(qualityGate, metric, "LT", null, "90", 1);
} }


@Test
public void fail_to_update_built_in_quality_gate() {
logInAsQualityGateAdmin();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true));
MetricDto metric = insertMetric();

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage(format("Operation forbidden for built-in Quality Gate '%s'", qualityGate.getName()));

executeRequest(qualityGate.getId(), metric.getKey(), "LT", null, "90", 1);
}

@Test @Test
public void test_response() throws Exception { public void test_response() throws Exception {
logInAsQualityGateAdmin(); logInAsQualityGateAdmin();
Expand Down

0 comments on commit af3451f

Please sign in to comment.