From 739105c6a493107081fc4736a2e2c5efa1d8dcc7 Mon Sep 17 00:00:00 2001 From: Benjamin Campomenosi <109955405+benjamin-campomenosi-sonarsource@users.noreply.github.com> Date: Mon, 26 Sep 2022 09:04:16 +0200 Subject: [PATCH] SONAR-17321 expose ruleKey in hotspot.search endpoint --- .../sonar/server/hotspot/ws/SearchAction.java | 6 ++-- .../server/hotspot/ws/search-example.json | 14 ++++++--- .../server/hotspot/ws/SearchActionTest.java | 29 ++++++++++++++++++- sonar-ws/src/main/protobuf/ws-hotspots.proto | 1 + 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java index 6abb2b5bc43..6ee7ced5fc8 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java @@ -200,7 +200,8 @@ public class SearchAction implements HotspotsWsAction { .setInternal(true) .setChangelog( new Change("9.6", "Added parameters 'pciDss-3.2' and 'pciDss-4.0"), - new Change("9.7", "Hotspot flows in the response may contain a description and a type")); + new Change("9.7", "Hotspot flows in the response may contain a description and a type"), + new Change("9.7", "Hotspot in the response contain the corresponding ruleKey")); action.addPagingParams(100); action.createParam(PARAM_PROJECT_KEY) @@ -582,7 +583,8 @@ public class SearchAction implements HotspotsWsAction { .setComponent(hotspot.getComponentKey()) .setProject(hotspot.getProjectKey()) .setSecurityCategory(sqCategory.getKey()) - .setVulnerabilityProbability(sqCategory.getVulnerability().name()); + .setVulnerabilityProbability(sqCategory.getVulnerability().name()) + .setRuleKey(hotspot.getRuleKey().toString()); ofNullable(hotspot.getStatus()).ifPresent(builder::setStatus); ofNullable(hotspot.getResolution()).ifPresent(builder::setResolution); ofNullable(hotspot.getLine()).ifPresent(builder::setLine); diff --git a/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/hotspot/ws/search-example.json b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/hotspot/ws/search-example.json index acab5d5bd50..f23e1a62e07 100644 --- a/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/hotspot/ws/search-example.json +++ b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/hotspot/ws/search-example.json @@ -17,7 +17,9 @@ "assignee": "assignee-uuid", "author": "joe", "creationDate": "2020-01-02T15:43:10+0100", - "updateDate": "2020-01-02T15:43:10+0100" + "updateDate": "2020-01-02T15:43:10+0100", + "flows": [], + "ruleKey": "repository-0:rule-0" }, { "key": "hotspot-1", @@ -31,7 +33,9 @@ "assignee": "assignee-uuid", "author": "joe", "creationDate": "2020-01-02T15:43:10+0100", - "updateDate": "2020-01-02T15:43:10+0100" + "updateDate": "2020-01-02T15:43:10+0100", + "flows": [], + "ruleKey": "repository-1:rule-1" }, { "key": "hotspot-2", @@ -45,7 +49,9 @@ "assignee": "assignee-uuid", "author": "joe", "creationDate": "2020-01-02T15:43:10+0100", - "updateDate": "2020-01-02T15:43:10+0100" + "updateDate": "2020-01-02T15:43:10+0100", + "flows": [], + "ruleKey": "repository-2:rule-2" } ], "components": [ @@ -63,4 +69,4 @@ "longName": "test-project" } ] -} +} \ No newline at end of file diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/SearchActionTest.java index 20c49231e41..858f3854660 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/SearchActionTest.java @@ -41,6 +41,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.sonar.api.impl.utils.TestSystem2; import org.sonar.api.issue.Issue; +import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.RuleType; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; @@ -1841,7 +1842,8 @@ public class SearchActionTest { IssueDto[] hotspots = IntStream.range(0, 3) .mapToObj(i -> { - RuleDto rule = newRule(SECURITY_HOTSPOT) + RuleKey ruleKey = RuleKey.of("repository-"+i,"rule-"+i); + RuleDto rule = newRule(SECURITY_HOTSPOT,ruleKey) .setSecurityStandards(Sets.newHashSet(SQCategory.WEAK_CRYPTOGRAPHY.getKey())); return insertHotspot(rule, project, fileWithHotspot, issueDto -> issueDto.setKee("hotspot-" + i) .setAssigneeUuid("assignee-uuid") @@ -1860,6 +1862,24 @@ public class SearchActionTest { .assertJson(actionTester.getDef().responseExampleAsString()); } + @Test + public void returns_hotspots_with_ruleKey() { + ComponentDto project = dbTester.components().insertPublicProject(); + userSessionRule.registerComponents(project); + indexPermissions(); + ComponentDto file = dbTester.components().insertComponent(newFileDto(project)); + RuleDto rule1 = newRule(SECURITY_HOTSPOT); + insertHotspot(project, file, rule1); + indexIssues(); + + SearchWsResponse response = newRequest(project) + .executeProtobuf(SearchWsResponse.class); + + assertThat(response.getHotspotsList()) + .extracting(SearchWsResponse.Hotspot::getRuleKey) + .containsExactly(rule1.getKey().toString()); + } + private IssueDto insertHotspot(ComponentDto project, ComponentDto file, RuleDto rule) { return insertHotspot(rule, project, file, t -> { }); @@ -1960,6 +1980,13 @@ public class SearchActionTest { }); } + private RuleDto newRule(RuleType ruleType, RuleKey ruleKey){ + RuleDto ruleDto = RuleTesting.newRule(ruleKey) + .setType(ruleType); + dbTester.rules().insert(ruleDto); + return ruleDto; + } + private RuleDto newRule(RuleType ruleType, Consumer populate) { RuleDto ruleDto = RuleTesting.newRule() .setType(ruleType); diff --git a/sonar-ws/src/main/protobuf/ws-hotspots.proto b/sonar-ws/src/main/protobuf/ws-hotspots.proto index 41b89d19269..d725326a1e0 100644 --- a/sonar-ws/src/main/protobuf/ws-hotspots.proto +++ b/sonar-ws/src/main/protobuf/ws-hotspots.proto @@ -48,6 +48,7 @@ message SearchWsResponse { optional string updateDate = 13; optional sonarqube.ws.commons.TextRange textRange = 14; repeated sonarqube.ws.commons.Flow flows = 15; + optional string ruleKey = 16; } } -- 2.39.5