import org.sonar.server.user.UserSession;
import org.sonar.server.ws.WsUtils;
import org.sonarqube.ws.WsBranches;
+import org.sonarqube.ws.WsBranches.Branch.Status;
import static com.google.common.base.Preconditions.checkState;
import static java.util.Arrays.asList;
import static org.sonar.core.util.stream.MoreCollectors.index;
import static org.sonar.core.util.stream.MoreCollectors.toList;
import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex;
+import static org.sonar.db.component.BranchType.LONG;
+import static org.sonar.db.component.BranchType.SHORT;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonarqube.ws.client.projectbranches.ProjectBranchesParameters.ACTION_LIST;
import static org.sonarqube.ws.client.projectbranches.ProjectBranchesParameters.PARAM_PROJECT;
throw new IllegalArgumentException("Invalid project key");
}
- List<MetricDto> metrics = dbClient.metricDao().selectByKeys(dbSession, asList(ALERT_STATUS_KEY));
+ List<MetricDto> metrics = dbClient.metricDao().selectByKeys(dbSession, asList(ALERT_STATUS_KEY, BUGS_KEY, VULNERABILITIES_KEY, CODE_SMELLS_KEY));
Map<Integer, MetricDto> metricsById = metrics.stream().collect(uniqueIndex(MetricDto::getId));
Map<String, Integer> metricIdsByKey = metrics.stream().collect(uniqueIndex(MetricDto::getKey, MetricDto::getId));
setNullable(mergeBranch.getKey(), builder::setMergeBranch);
}
- int qualityGateStatusMetricId = metricIdsByKey.get(ALERT_STATUS_KEY);
- measuresByComponentUuids.get(branch.getUuid()).stream().filter(m -> m.getMetricId() == qualityGateStatusMetricId).findAny()
- .ifPresent(measure -> builder.setStatus(WsBranches.Branch.Status.newBuilder().setQualityGateStatus(measure.getData())));
+ Status.Builder statusBuilder = Status.newBuilder();
+ Collection<MeasureDto> componentMeasures = measuresByComponentUuids.get(branch.getUuid());
+ if (branch.getBranchType().equals(LONG)) {
+ int qualityGateStatusMetricId = metricIdsByKey.get(ALERT_STATUS_KEY);
+ componentMeasures.stream().filter(m -> m.getMetricId() == qualityGateStatusMetricId).findAny()
+ .ifPresent(measure -> statusBuilder.setQualityGateStatus(measure.getData()));
+ }
+
+ if (branch.getBranchType().equals(SHORT)) {
+ int bugsMetricId = metricIdsByKey.get(BUGS_KEY);
+ componentMeasures.stream().filter(m -> m.getMetricId() == bugsMetricId).findAny()
+ .ifPresent(measure -> statusBuilder.setBugs(measure.getValue().intValue()));
+
+ int vulnerabilitiesMetricId = metricIdsByKey.get(VULNERABILITIES_KEY);
+ componentMeasures.stream().filter(m -> m.getMetricId() == vulnerabilitiesMetricId).findAny()
+ .ifPresent(measure -> statusBuilder.setVulnerabilities(measure.getValue().intValue()));
+
+ int codeSmellMetricId = metricIdsByKey.get(CODE_SMELLS_KEY);
+ componentMeasures.stream().filter(m -> m.getMetricId() == codeSmellMetricId).findAny()
+ .ifPresent(measure -> statusBuilder.setCodeSmells(measure.getValue().intValue()));
+ }
+
+ builder.setStatus(statusBuilder);
builder.build();
}
+
}
*/
package org.sonar.server.projectbranch.ws;
+import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.ws.WsActionTester;
import org.sonarqube.ws.MediaTypes;
+import org.sonarqube.ws.WsBranches;
import org.sonarqube.ws.WsBranches.Branch;
import org.sonarqube.ws.WsBranches.ListWsResponse;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
+import static org.sonar.api.measures.CoreMetrics.BUGS_KEY;
+import static org.sonar.api.measures.CoreMetrics.CODE_SMELLS_KEY;
+import static org.sonar.api.measures.CoreMetrics.VULNERABILITIES_KEY;
import static org.sonar.test.JsonAssert.assertJson;
+import static org.sonarqube.ws.WsBranches.Branch.Status;
public class ListActionTest {
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
+ private MetricDto qualityGateStatus;
+ private MetricDto bugs;
+ private MetricDto vulnerabilities;
+ private MetricDto codeSmells;
+
public WsActionTester tester = new WsActionTester(new ListAction(db.getDbClient(), userSession));
+ @Before
+ public void setUp() throws Exception {
+ qualityGateStatus = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY));
+ bugs = db.measures().insertMetric(m -> m.setKey(BUGS_KEY));
+ vulnerabilities = db.measures().insertMetric(m -> m.setKey(VULNERABILITIES_KEY));
+ codeSmells = db.measures().insertMetric(m -> m.setKey(CODE_SMELLS_KEY));
+ }
+
@Test
public void test_definition() {
WebService.Action definition = tester.getDef();
userSession.logIn().addProjectPermission(UserRole.USER, project);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG));
SnapshotDto branchAnalysis = db.components().insertSnapshot(branch);
- MetricDto qualityGateStatus = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY));
db.measures().insertMeasure(branch, branchAnalysis, qualityGateStatus, m -> m.setData("OK"));
ListWsResponse response = tester.newRequest()
.containsExactlyInAnyOrder(tuple(false, ""), tuple(true, "OK"));
}
+ @Test
+ public void bugs_vulnerabilities_and_code_smells_on_short_living_branch() {
+ ComponentDto project = db.components().insertMainBranch();
+ userSession.logIn().addProjectPermission(UserRole.USER, project);
+ ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG));
+ ComponentDto shortLivingBranch = db.components().insertProjectBranch(project,
+ b -> b.setBranchType(BranchType.SHORT).setMergeBranchUuid(longLivingBranch.uuid()));
+ SnapshotDto branchAnalysis = db.components().insertSnapshot(shortLivingBranch);
+ db.measures().insertMeasure(shortLivingBranch, branchAnalysis, bugs, m -> m.setValue(1d));
+ db.measures().insertMeasure(shortLivingBranch, branchAnalysis, vulnerabilities, m -> m.setValue(2d));
+ db.measures().insertMeasure(shortLivingBranch, branchAnalysis, codeSmells, m -> m.setValue(3d));
+
+ ListWsResponse response = tester.newRequest()
+ .setParam("project", project.getKey())
+ .executeProtobuf(ListWsResponse.class);
+
+ assertThat(response.getBranchesList().stream().map(WsBranches.Branch::getStatus))
+ .extracting(Status::hasBugs, Status::getBugs, Status::hasVulnerabilities, Status::getVulnerabilities, Status::hasCodeSmells, Status::getCodeSmells)
+ .containsExactlyInAnyOrder(
+ tuple(false, 0, false, 0, false, 0),
+ tuple(false, 0, false, 0, false, 0),
+ tuple(true, 1, true, 2, true, 3));
+ }
+
@Test
public void test_example() {
ComponentDto project = db.components().insertPrivateProject();