@@ -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); |
@@ -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" | |||
} | |||
] | |||
} | |||
} |
@@ -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<RuleDto> populate) { | |||
RuleDto ruleDto = RuleTesting.newRule() | |||
.setType(ruleType); |
@@ -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; | |||
} | |||
} | |||