From 5957bd9620616dfb371df401619f3121338d3b9d Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 15 Jan 2019 10:59:58 +0100 Subject: [PATCH] SONAR-11571 Restore warning in project badges and search projects WS --- .../measure/index/ProjectMeasuresDoc.java | 3 +- .../sonar/server/badge/ws/MeasureAction.java | 7 ++-- .../sonar/server/badge/ws/SvgGenerator.java | 3 ++ .../server/badge/ws/MeasureActionTest.java | 17 +++++++++ .../server/badge/ws/SvgGeneratorTest.java | 11 ++++++ .../ws/SearchProjectsActionTest.java | 20 +++++++++++ .../index/ProjectMeasuresIndexTest.java | 35 +++++++++++++++++-- 7 files changed, 90 insertions(+), 6 deletions(-) diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresDoc.java index b1f2e22df87..de4ded09982 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresDoc.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresDoc.java @@ -32,6 +32,7 @@ import org.sonar.server.es.BaseDoc; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIELD_ANALYSED_AT; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIELD_DISTRIB_LANGUAGE; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIELD_DISTRIB_NCLOC; @@ -49,7 +50,7 @@ import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIEL public class ProjectMeasuresDoc extends BaseDoc { - public static final Map QUALITY_GATE_STATUS = ImmutableMap.of(OK.name(), 1, ERROR.name(), 2); + public static final Map QUALITY_GATE_STATUS = ImmutableMap.of(OK.name(), 1, WARN.name(), 2, ERROR.name(), 3); public ProjectMeasuresDoc() { super(new HashMap<>(8)); diff --git a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/MeasureAction.java b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/MeasureAction.java index e02d9276242..9b4d97dc4f3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/MeasureAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/MeasureAction.java @@ -38,9 +38,9 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.server.badge.ws.SvgGenerator.Color; -import org.sonar.server.measure.Rating; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; +import org.sonar.server.measure.Rating; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -58,9 +58,10 @@ import static org.sonar.api.measures.CoreMetrics.SQALE_RATING_KEY; import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY; import static org.sonar.api.measures.CoreMetrics.VULNERABILITIES_KEY; import static org.sonar.api.measures.Metric.Level; +import static org.sonar.api.measures.Metric.ValueType; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; -import static org.sonar.api.measures.Metric.ValueType; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.server.badge.ws.ETagUtils.RFC1123_DATE; import static org.sonar.server.badge.ws.ETagUtils.getETag; import static org.sonar.server.badge.ws.SvgFormatter.formatDuration; @@ -94,10 +95,12 @@ public class MeasureAction implements ProjectBadgesWsAction { private static final Map QUALITY_GATE_MESSAGE_BY_STATUS = new EnumMap<>(ImmutableMap.of( OK, "passed", + WARN, "warning", ERROR, "failed")); private static final Map COLOR_BY_QUALITY_GATE_STATUS = new EnumMap<>(ImmutableMap.of( OK, Color.QUALITY_GATE_OK, + WARN, Color.QUALITY_GATE_WARN, ERROR, Color.QUALITY_GATE_ERROR)); private static final Map COLOR_BY_RATING = new EnumMap<>(ImmutableMap.of( diff --git a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java index e21bb66c8b4..b9d86844a0b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java @@ -33,6 +33,7 @@ import static java.lang.String.valueOf; import static java.nio.charset.StandardCharsets.UTF_8; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.process.ProcessProperties.Property.SONARCLOUD_ENABLED; @ServerSide @@ -136,6 +137,7 @@ public class SvgGenerator { this.badgeTemplate = readTemplate(templatePath + "/badge.svg"); this.qualityGateTemplates = ImmutableMap.of( OK, readTemplate(templatePath + "/quality_gate_passed.svg"), + WARN, readTemplate(templatePath + "/quality_gate_warn.svg"), ERROR, readTemplate(templatePath + "/quality_gate_failed.svg")); } @@ -193,6 +195,7 @@ public class SvgGenerator { static class Color { static final Color DEFAULT = new Color("#999"); static final Color QUALITY_GATE_OK = new Color("#4c1"); + static final Color QUALITY_GATE_WARN = new Color("#ed7d20"); static final Color QUALITY_GATE_ERROR = new Color("#d4333f"); static final Color RATING_A = new Color("#00aa00"); static final Color RATING_B = new Color("#b0d513"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java index b730b064e48..59ddc6217ab 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java @@ -57,6 +57,7 @@ import static org.sonar.api.measures.CoreMetrics.SQALE_RATING_KEY; import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.api.measures.Metric.ValueType.INT; import static org.sonar.api.measures.Metric.ValueType.LEVEL; import static org.sonar.api.measures.Metric.ValueType.PERCENT; @@ -68,6 +69,7 @@ import static org.sonar.db.component.BranchType.SHORT; import static org.sonar.server.badge.ws.SvgGenerator.Color.DEFAULT; import static org.sonar.server.badge.ws.SvgGenerator.Color.QUALITY_GATE_ERROR; import static org.sonar.server.badge.ws.SvgGenerator.Color.QUALITY_GATE_OK; +import static org.sonar.server.badge.ws.SvgGenerator.Color.QUALITY_GATE_WARN; @RunWith(DataProviderRunner.class) public class MeasureActionTest { @@ -198,6 +200,21 @@ public class MeasureActionTest { checkWithIfNoneMatchHeader(project, metric, response); } + @Test + public void display_deprecated_warning_quality_gate() { + ComponentDto project = db.components().insertPublicProject(); + userSession.registerComponents(project); + MetricDto metric = createQualityGateMetric(); + db.measures().insertLiveMeasure(project, metric, m -> m.setData(WARN.name())); + + TestResponse response = ws.newRequest() + .setParam("project", project.getKey()) + .setParam("metric", metric.getKey()) + .execute(); + + checkSvg(response, "quality gate", "warning", QUALITY_GATE_WARN); + } + @Test public void measure_on_long_living_branch() { ComponentDto project = db.components().insertMainBranch(p -> p.setPrivate(false)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/SvgGeneratorTest.java b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/SvgGeneratorTest.java index 2cae011851e..d34710a619e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/SvgGeneratorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/SvgGeneratorTest.java @@ -32,6 +32,7 @@ import org.sonar.server.tester.UserSessionRule; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.api.measures.Metric.Level.ERROR; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.server.badge.ws.SvgGenerator.Color.DEFAULT; public class SvgGeneratorTest { @@ -67,6 +68,16 @@ public class SvgGeneratorTest { checkQualityGate(result, ERROR); } + @Test + public void generate_deprecated_warning_quality_gate() { + mapSettings.setProperty("sonar.sonarcloud.enabled", false); + initSvgGenerator(); + + String result = underTest.generateQualityGate(WARN); + + assertThat(result).isEqualTo(readTemplate("quality_gate_warn.svg")); + } + @Test public void generate_error() { mapSettings.setProperty("sonar.sonarcloud.enabled", false); diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java index 21507e936b0..8028c359981 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java @@ -25,6 +25,7 @@ import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.Arrays; import java.util.Date; +import java.util.List; import java.util.function.Consumer; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -1086,6 +1087,25 @@ public class SearchProjectsActionTest { .containsExactlyInAnyOrder(project.getDbKey()); } + @Test + public void use_deprecated_warning_quality_gate_in_filter() { + userSession.logIn(); + OrganizationDto organization = db.organizations().insert(); + MetricDto qualityGateStatus = db.measures().insertMetric(c -> c.setKey(QUALITY_GATE_STATUS).setValueType(LEVEL.name())); + ComponentDto project1 = insertProject(organization, c -> c.setName("Sonar Java"), new Measure(qualityGateStatus, c -> c.setValue(null).setData("ERROR"))); + ComponentDto project2 = insertProject(organization, c -> c.setName("Sonar Groovy"), new Measure(qualityGateStatus, c -> c.setValue(null).setData("WARN"))); + ComponentDto project3 = insertProject(organization, c -> c.setName("Sonar Markdown"), new Measure(qualityGateStatus, c -> c.setValue(null).setData("WARN"))); + ComponentDto project4 = insertProject(organization, c -> c.setName("Sonar Qube"), new Measure(qualityGateStatus, c -> c.setValue(null).setData("OK"))); + + List projects = call(request + .setFilter("alert_status = WARN")) + .getComponentsList(); + + assertThat(projects) + .extracting(Component::getKey) + .containsExactly(project2.getKey(), project3.getKey()); + } + @Test public void fail_when_filter_metrics_are_unknown() { userSession.logIn(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java index 639bdaff952..e6d4616cdc2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java @@ -62,6 +62,7 @@ import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY; import static org.sonar.api.measures.CoreMetrics.COVERAGE_KEY; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; +import static org.sonar.api.measures.Metric.Level.WARN; import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; import static org.sonar.db.user.GroupTesting.newGroupDto; @@ -1049,7 +1050,8 @@ public class ProjectMeasuresIndexTest { assertThat(result).containsOnly( entry(ERROR.name(), 4L), - entry(OK.name(), 2L)); + entry(OK.name(), 2L), + entry(WARN.name(), 0L)); } @Test @@ -1072,7 +1074,8 @@ public class ProjectMeasuresIndexTest { // Sticky facet on quality gate does not take into account quality gate filter assertThat(facets.get(ALERT_STATUS_KEY)).containsOnly( entry(OK.name(), 2L), - entry(ERROR.name(), 3L)); + entry(ERROR.name(), 3L), + entry(WARN.name(), 0L)); // But facet on ncloc does well take into into filters assertThat(facets.get(NCLOC)).containsExactly( entry("*-1000.0", 1L), @@ -1103,6 +1106,31 @@ public class ProjectMeasuresIndexTest { assertThat(result).containsOnly( entry(ERROR.name(), 0L), + entry(OK.name(), 2L), + entry(WARN.name(), 0L)); + } + + @Test + public void facet_quality_gate_using_deprecated_warning() { + index( + // 2 docs with QG OK + newDoc().setQualityGateStatus(OK.name()), + newDoc().setQualityGateStatus(OK.name()), + // 3 docs with QG WARN + newDoc().setQualityGateStatus(WARN.name()), + newDoc().setQualityGateStatus(WARN.name()), + newDoc().setQualityGateStatus(WARN.name()), + // 4 docs with QG ERROR + newDoc().setQualityGateStatus(ERROR.name()), + newDoc().setQualityGateStatus(ERROR.name()), + newDoc().setQualityGateStatus(ERROR.name()), + newDoc().setQualityGateStatus(ERROR.name())); + + LinkedHashMap result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(ALERT_STATUS_KEY)).getFacets().get(ALERT_STATUS_KEY); + + assertThat(result).containsOnly( + entry(ERROR.name(), 4L), + entry(WARN.name(), 3L), entry(OK.name(), 2L)); } @@ -1247,7 +1275,8 @@ public class ProjectMeasuresIndexTest { entry("cpp", 1L)); assertThat(facets.get(ALERT_STATUS_KEY)).containsOnly( entry(OK.name(), 0L), - entry(ERROR.name(), 1L)); + entry(ERROR.name(), 1L), + entry(WARN.name(), 0L)); } @Test -- 2.39.5