From 260c350f6cca22c95e59ef6e39a8b4a694f37e0c Mon Sep 17 00:00:00 2001 From: Lukasz Jarocki Date: Tue, 25 Apr 2023 15:53:33 +0200 Subject: [PATCH] SONAR-19050 /api/issues/search now always return all possible values for characteristics facet --- .../sonar/server/issue/index/IssueQueryFactory.java | 4 ++++ .../java/org/sonar/server/issue/ws/SearchActionIT.java | 10 ++++++++++ .../java/org/sonar/server/issue/ws/SearchAction.java | 5 +++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java index af8fbd813a5..01e8b443aa7 100644 --- a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java +++ b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java @@ -42,6 +42,7 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.commons.lang.BooleanUtils; import org.jetbrains.annotations.NotNull; +import org.sonar.api.code.CodeCharacteristic; import org.sonar.api.resources.Qualifiers; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.RuleType; @@ -97,6 +98,9 @@ public class IssueQueryFactory { .filter(s -> !s.equals(STATUS_TO_REVIEW)) .filter(s -> !s.equals(STATUS_REVIEWED)) .collect(ImmutableList.toImmutableList()); + public static final Set CHARACTERISTICS = Arrays.stream(CodeCharacteristic.values()) + .map(Enum::name) + .collect(Collectors.toSet()); public static final Set ISSUE_TYPE_NAMES = Arrays.stream(RuleType.values()) .filter(t -> t != RuleType.SECURITY_HOTSPOT) .map(Enum::name) diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java index 219c87abaef..a30884ef4a5 100644 --- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java +++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java @@ -517,6 +517,16 @@ public class SearchActionIT { assertThat(issuesList.stream().filter(f -> f.getCharacteristic() == Common.RuleCharacteristic.ROBUST)).hasSize(1); } + @Test + public void handle_whenCharacteristicsFacetAsked_shouldAlwaysReturnCompleteListOfCharacteristics() { + SearchWsResponse searchWsResponse = ws.newRequest() + .setParam(FACETS, "characteristics") + .executeProtobuf(SearchWsResponse.class); + + assertThat(searchWsResponse.getFacets().getFacetsCount()).isEqualTo(1); + assertThat(searchWsResponse.getFacets().getFacets(0).getValuesCount()).isEqualTo(CodeCharacteristic.values().length); + } + @Test public void search_by_characteristic_when_characteristic_set() { RuleDto rule1 = newIssueRule(XOO_X1, r -> r.setCharacteristic(CodeCharacteristic.PORTABLE)); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java index 6d19ee80964..59be61911e5 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -80,6 +80,7 @@ import static org.sonar.core.util.stream.MoreCollectors.toSet; import static org.sonar.server.es.SearchOptions.MAX_PAGE_SIZE; import static org.sonar.server.issue.index.IssueIndex.FACET_ASSIGNED_TO_ME; import static org.sonar.server.issue.index.IssueIndex.FACET_PROJECTS; +import static org.sonar.server.issue.index.IssueQueryFactory.CHARACTERISTICS; import static org.sonar.server.issue.index.IssueQueryFactory.ISSUE_STATUSES; import static org.sonar.server.issue.index.IssueQueryFactory.UNKNOWN; import static org.sonar.server.security.SecurityStandards.SANS_TOP_25_INSECURE_INTERACTION; @@ -283,7 +284,7 @@ public class SearchAction implements IssuesWsAction { action.createParam(PARAM_CHARACTERISTICS) .setDescription("Comma-separated list of characteristics.") .setSince("10.1") - .setPossibleValues(Arrays.stream(CodeCharacteristic.values()).map(Enum::name).toList()) + .setPossibleValues(CHARACTERISTICS) .setExampleValue(format(COMMA_SEPERATED_PARAMS_FORMAT, CodeCharacteristic.CLEAR, CodeCharacteristic.COMPLIANT)); action.createParam(PARAM_OWASP_ASVS_LEVEL) .setDescription("Level of OWASP ASVS categories.") @@ -499,7 +500,7 @@ public class SearchAction implements IssuesWsAction { addMandatoryValuesToFacet(facets, PARAM_SCOPES, ISSUE_SCOPES); addMandatoryValuesToFacet(facets, PARAM_LANGUAGES, request.getLanguages()); addMandatoryValuesToFacet(facets, PARAM_TAGS, request.getTags()); - addMandatoryValuesToFacet(facets, PARAM_CHARACTERISTICS, request.getCharacteristics()); + addMandatoryValuesToFacet(facets, PARAM_CHARACTERISTICS, CHARACTERISTICS); setTypesFacet(facets); -- 2.39.5