@Test public void show_deprecated_rule_debt_fields() { RuleDefinitionDto rule = db.rules().insert(r -> r .setDefRemediationFunction("LINEAR_OFFSET") .setDefRemediationGapMultiplier("5d") .setDefRemediationBaseEffort("10h") .setGapDescription("gap desc")); db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null), m -> m .setRemediationFunction("CONSTANT_ISSUE") .setRemediationGapMultiplier(null) .setRemediationBaseEffort("15h")); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getDefaultDebtRemFnCoeff()).isEqualTo("5d"); assertThat(resultRule.getDefaultDebtRemFnOffset()).isEqualTo("10h"); assertThat(resultRule.getEffortToFixDescription()).isEqualTo("gap desc"); assertThat(resultRule.getDebtRemFnType()).isEqualTo("CONSTANT_ISSUE"); assertThat(resultRule.hasDebtRemFnCoeff()).isFalse(); assertThat(resultRule.getDebtRemFnOffset()).isEqualTo("15h"); assertThat(resultRule.getDebtOverloaded()).isTrue(); }
private ShowResponse buildResponse(DbSession dbSession, OrganizationDto organization, Request request, SearchAction.SearchResult searchResult) { ShowResponse.Builder responseBuilder = ShowResponse.newBuilder(); RuleDto rule = searchResult.getRules().get(0); responseBuilder.setRule(mapper.toWsRule(rule.getDefinition(), searchResult, Collections.emptySet(), rule.getMetadata(), ruleWsSupport.getUsersByUuid(dbSession, searchResult.getRules()))); if (request.mandatoryParamAsBoolean(PARAM_ACTIVES) && ruleWsSupport.areActiveRulesVisible(organization)) { activeRuleCompleter.completeShow(dbSession, organization, rule.getDefinition()).forEach(responseBuilder::addActives); } return responseBuilder.build(); }
private Rule toRule(Rules.ShowResponse showResponse) { Rules.Rule rule = showResponse.getRule(); if (rule == null) { return Rule.newBuilder().build(); } return Rule.newBuilder() .key(rule.getKey()) .repo(rule.getRepo()) .name(rule.getName()) .description(rule.getMdDesc()) .type(rule.getType() != null ? rule.getType().name() : null) .debtRemFnType(rule.getDebtRemFnType()) .debtRemFnBaseEffort(rule.getRemFnBaseEffort()) .build(); } }
/** * * This is part of the internal API. * This is a GET request. * @see <a href="https://next.sonarqube.com/sonarqube/web_api/api/rules/show">Further information about this action online (including a response example)</a> * @since 4.2 */ public ShowResponse show(ShowRequest request) { return call( new GetRequest(path("show")) .setParam("actives", request.getActives()) .setParam("key", request.getKey()) .setParam("organization", request.getOrganization()), ShowResponse.parser()); }
public Rule getRule(String key) { Rules.Rule rule = sonarClient.rules().show(null, key).getRule(); return new Rule(rule.getKey(), rule.getName(), rule.getSeverity(), rule.getLang(), rule.getLangName(), rule.getHtmlDesc()); }
private Rules.ShowResponse showRule(String ruleKey) { GetRequest getRequest = new GetRequest("api/rules/show").setParam("key", ruleKey).setMediaType(MediaTypes.PROTOBUF); WsResponse wsResponse = wsClient.wsConnector().call(getRequest); if (wsResponse.code() != 200) { throw new HttpException(wsClient.wsConnector().baseUrl() + toString(getRequest), wsResponse.code(), wsResponse.content()); } try { return Rules.ShowResponse.parseFrom(wsResponse.contentStream()); } catch (IOException e) { throw new IllegalStateException(e.getMessage(), e); } }
private ShowResponse buildResponse(DbSession dbSession, OrganizationDto organization, Request request, SearchAction.SearchResult searchResult) { ShowResponse.Builder responseBuilder = ShowResponse.newBuilder(); RuleDto rule = searchResult.getRules().get(0); responseBuilder.setRule(mapper.toWsRule(rule.getDefinition(), searchResult, Collections.emptySet(), rule.getMetadata(), ruleWsSupport.getUsersByUuid(dbSession, searchResult.getRules()))); if (request.mandatoryParamAsBoolean(PARAM_ACTIVES)) { activeRuleCompleter.completeShow(dbSession, organization, rule.getDefinition()).forEach(responseBuilder::addActives); } return responseBuilder.build(); }
@Test public void ignore_predefined_info_on_adhoc_rule() { OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto externalRule = db.rules().insert(r -> r .setIsExternal(true) .setIsAdHoc(true) .setName("predefined name") .setDescription("<div>predefined desc</div>") .setSeverity(Severity.BLOCKER) .setType(RuleType.VULNERABILITY)); RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(externalRule, organization, m -> m .setAdHocName("adhoc name") .setAdHocDescription("<div>adhoc desc</div>") .setAdHocSeverity(Severity.MAJOR) .setAdHocType(RuleType.CODE_SMELL) .setNoteData(null) .setNoteUserUuid(null)); doReturn("<div>adhoc desc</div>").when(macroInterpreter).interpret(metadata.getAdHocDescription()); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, externalRule.getKey().toString()) .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule) .extracting(Rule::getName, Rule::getHtmlDesc, Rule::getSeverity, Rule::getType) .containsExactlyInAnyOrder("adhoc name", "<div>adhoc desc</div>", Severity.MAJOR, Common.RuleType.CODE_SMELL); }
@Test public void show_rule_with_only_overridden_debt() { RuleDefinitionDto rule = db.rules().insert(r -> r .setDefRemediationFunction(null) .setDefRemediationGapMultiplier(null) .setDefRemediationBaseEffort(null)); db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null), m -> m .setRemediationFunction("LINEAR_OFFSET") .setRemediationGapMultiplier("5d") .setRemediationBaseEffort("10h")); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.hasDefaultRemFnType()).isFalse(); assertThat(resultRule.hasDefaultRemFnGapMultiplier()).isFalse(); assertThat(resultRule.hasDefaultRemFnBaseEffort()).isFalse(); assertThat(resultRule.getRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d"); assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h"); assertThat(resultRule.getRemFnOverloaded()).isTrue(); }
@Test public void show_rule_with_activation() { OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto rule = db.rules().insert(); RuleParamDto ruleParam = db.rules().insertRuleParam(rule, p -> p.setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*")); RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null)); QProfileDto qProfile = db.qualityProfiles().insert(organization); ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule); db.getDbClient().activeRuleDao().insertParam(db.getSession(), activeRule, new ActiveRuleParamDto() .setRulesParameterId(ruleParam.getId()) .setKey(ruleParam.getName()) .setValue(".*?")); db.commit(); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .setParam(PARAM_ACTIVES, "true") .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); List<Rules.Active> actives = result.getActivesList(); assertThat(actives).extracting(Rules.Active::getQProfile).containsExactly(qProfile.getKee()); assertThat(actives).extracting(Rules.Active::getSeverity).containsExactly(activeRule.getSeverityString()); assertThat(actives).extracting(Rules.Active::getInherit).containsExactly("NONE"); assertThat(actives.get(0).getParamsList()) .extracting(Rules.Active.Param::getKey, Rules.Active.Param::getValue) .containsExactlyInAnyOrder(tuple(ruleParam.getName(), ".*?")); }
@Test public void show_rule_with_default_and_overridden_debt_infos() { RuleDefinitionDto rule = db.rules().insert(r -> r .setDefRemediationFunction("LINEAR_OFFSET") .setDefRemediationGapMultiplier("5d") .setDefRemediationBaseEffort("10h")); db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null), m -> m .setRemediationFunction("CONSTANT_ISSUE") .setRemediationGapMultiplier(null) .setRemediationBaseEffort("15h")); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getDefaultRemFnGapMultiplier()).isEqualTo("5d"); assertThat(resultRule.getDefaultRemFnBaseEffort()).isEqualTo("10h"); assertThat(resultRule.getRemFnType()).isEqualTo("CONSTANT_ISSUE"); assertThat(resultRule.hasRemFnGapMultiplier()).isFalse(); assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("15h"); assertThat(resultRule.getRemFnOverloaded()).isTrue(); }
@Test public void show_adhoc_rule() { OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto externalRule = db.rules().insert(r -> r .setIsExternal(true) .setIsAdHoc(true)); RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(externalRule, organization, m -> m .setAdHocName("adhoc name") .setAdHocDescription("<div>desc</div>") .setAdHocSeverity(Severity.BLOCKER) .setAdHocType(RuleType.VULNERABILITY) .setNoteData(null) .setNoteUserUuid(null)); doReturn("<div>desc2</div>").when(macroInterpreter).interpret(metadata.getAdHocDescription()); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, externalRule.getKey().toString()) .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule) .extracting(Rule::getName, Rule::getHtmlDesc, Rule::getSeverity, Rule::getType) .containsExactlyInAnyOrder("adhoc name", "<div>desc2</div>", Severity.BLOCKER, VULNERABILITY); }
@Test public void show_rule_with_no_default_and_no_overridden_debt() { RuleDefinitionDto rule = db.rules().insert(r -> r .setDefRemediationFunction(null) .setDefRemediationGapMultiplier(null) .setDefRemediationBaseEffort(null)); db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null), m -> m .setRemediationFunction(null) .setRemediationGapMultiplier(null) .setRemediationBaseEffort(null)); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.hasDefaultRemFnType()).isFalse(); assertThat(resultRule.hasDefaultRemFnGapMultiplier()).isFalse(); assertThat(resultRule.hasDefaultRemFnBaseEffort()).isFalse(); assertThat(resultRule.hasRemFnType()).isFalse(); assertThat(resultRule.hasRemFnGapMultiplier()).isFalse(); assertThat(resultRule.hasRemFnBaseEffort()).isFalse(); assertThat(resultRule.getRemFnOverloaded()).isFalse(); }
@Test public void show_rule_with_basic_info() { RuleDefinitionDto rule = db.rules().insert(); RuleParamDto ruleParam = db.rules().insertRuleParam(rule); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.getKey()).isEqualTo(rule.getKey().toString()); assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey()); assertThat(resultRule.getName()).isEqualTo(rule.getName()); assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString()); assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString()); assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey()); assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate()); assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage()); assertThat(resultRule.getParams().getParamsList()) .extracting(Rule.Param::getKey, Rule.Param::getHtmlDesc, Rule.Param::getDefaultValue) .containsExactlyInAnyOrder(tuple(ruleParam.getName(), ruleParam.getDescription(), ruleParam.getDefaultValue())); }
@Test public void adhoc_info_are_empty_when_no_metadata() { OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto externalRule = db.rules().insert(r -> r .setIsExternal(true) .setIsAdHoc(true) .setName(null) .setDescription(null) .setDescriptionFormat(null) .setSeverity((String) null) .setType(0)); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, externalRule.getKey().toString()) .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule) .extracting(Rule::hasName, Rule::hasHtmlDesc, Rule::hasSeverity, Rule::getType) .containsExactlyInAnyOrder(false, false, false, UNKNOWN); }
@Test public void show_rule_with_default_debt_infos() { RuleDefinitionDto rule = db.rules().insert(r -> r .setDefRemediationFunction("LINEAR_OFFSET") .setDefRemediationGapMultiplier("5d") .setDefRemediationBaseEffort("10h") .setGapDescription("gap desc")); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .executeProtobuf(ShowResponse.class); Rule resultRule = result.getRule(); assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getDefaultRemFnGapMultiplier()).isEqualTo("5d"); assertThat(resultRule.getDefaultRemFnBaseEffort()).isEqualTo("10h"); assertThat(resultRule.getGapDescription()).isEqualTo("gap desc"); assertThat(resultRule.getRemFnType()).isEqualTo("LINEAR_OFFSET"); assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d"); assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h"); assertThat(resultRule.getRemFnOverloaded()).isFalse(); }
@Test public void encode_html_description_of_custom_rule() { // Template rule RuleDto templateRule = newTemplateRule(RuleKey.of("java", "S001")); db.rules().insert(templateRule.getDefinition()); // Custom rule RuleDefinitionDto customRule = newCustomRule(templateRule.getDefinition()) .setDescription("<div>line1\nline2</div>") .setDescriptionFormat(MARKDOWN); db.rules().insert(customRule); doReturn("<div>line1<br/>line2</div>").when(macroInterpreter).interpret("<div>line1\nline2</div>"); ShowResponse result = ws.newRequest() .setParam("key", customRule.getKey().toString()) .executeProtobuf(ShowResponse.class); assertThat(result.getRule().getHtmlDesc()).isEqualTo(INTERPRETED); assertThat(result.getRule().getTemplateKey()).isEqualTo(templateRule.getKey().toString()); verify(macroInterpreter).interpret("<div>line1<br/>line2</div>"); }
/** * * This is part of the internal API. * This is a GET request. * @see <a href="https://next.sonarqube.com/sonarqube/web_api/api/rules/show">Further information about this action online (including a response example)</a> * @since 4.2 */ public ShowResponse show(ShowRequest request) { return call( new GetRequest(path("show")) .setParam("actives", request.getActives()) .setParam("key", request.getKey()) .setParam("organization", request.getOrganization()), ShowResponse.parser()); }
@Test public void active_rules_are_returned_when_member_of_paid_organization() { OrganizationDto organization = db.organizations().insert(o -> o.setSubscription(PAID)); RuleDefinitionDto rule = db.rules().insert(); QProfileDto qProfile = db.qualityProfiles().insert(organization); ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule); userSession.logIn(db.users().insertUser()).addMembership(organization); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .setParam(PARAM_ACTIVES, "true") .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); assertThat(result.getActivesList()).isNotEmpty(); }
@Test public void show_rule_without_activation() { OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto rule = db.rules().insert(); RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null)); QProfileDto qProfile = db.qualityProfiles().insert(organization); ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule); ShowResponse result = ws.newRequest() .setParam(PARAM_KEY, rule.getKey().toString()) .setParam(PARAM_ACTIVES, "false") .setParam(PARAM_ORGANIZATION, organization.getKey()) .executeProtobuf(ShowResponse.class); assertThat(result.getActivesList()).isEmpty(); }