@Test public void update_custom_rule() { // Create template rule RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001")); ruleDao.insert(dbSession, templateRule); RuleParamDto templateRuleParam1 = RuleParamDto.createFor(templateRule) .setName("regex") .setType("STRING") .setDescription("Reg ex") .setDefaultValue(".*"); RuleParamDto templateRuleParam2 = RuleParamDto.createFor(templateRule) .setName("format") .setType("STRING") .setDescription("Format"); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam1); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam2); // Create custom rule RuleDto customRule = RuleTesting.newCustomRule(templateRule) .setName("Old name") .setDescription("Old description") .setSeverity(Severity.MINOR) .setStatus(RuleStatus.BETA); ruleDao.insert(dbSession, customRule); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam1.setDefaultValue("a.*")); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam2.setDefaultValue(null)); dbSession.commit(); // Update custom rule RuleUpdate update = RuleUpdate.createForCustomRule(customRule.getKey()) .setName("New name") .setMarkdownDescription("New description") .setSeverity("MAJOR") .setStatus(RuleStatus.READY) .setParameters(ImmutableMap.of("regex", "b.*")); updater.update(update, userSessionRule); dbSession.clearCache(); // Verify custom rule is updated Rule customRuleReloaded = ruleIndex.getByKey(customRule.getKey()); assertThat(customRuleReloaded).isNotNull(); assertThat(customRuleReloaded.name()).isEqualTo("New name"); assertThat(customRuleReloaded.htmlDescription()).isEqualTo("New description"); assertThat(customRuleReloaded.severity()).isEqualTo("MAJOR"); assertThat(customRuleReloaded.status()).isEqualTo(RuleStatus.READY); assertThat(customRuleReloaded.params()).hasSize(2); assertThat(customRuleReloaded.params().get(0).defaultValue()).isEqualTo("b.*"); assertThat(customRuleReloaded.params().get(1).defaultValue()).isNull(); }
@Test public void register_rules_at_startup() throws Exception { verifyRulesInDb(); Result<Rule> searchResult = index.search(new RuleQuery(), new QueryOptions()); assertThat(searchResult.getTotal()).isEqualTo(3); assertThat(searchResult.getHits()).hasSize(3); Rule rule = index.getByKey(RuleTesting.XOO_X1); assertThat(rule.severity()).isEqualTo(Severity.MINOR); assertThat(rule.name()).isEqualTo("x1 name"); assertThat(rule.htmlDescription()).isEqualTo("x1 desc"); assertThat(rule.systemTags()).contains("tag1"); assertThat(rule.params()).hasSize(1); assertThat(rule.param("acceptWhitespace").type()).isEqualTo(RuleParamType.BOOLEAN); assertThat(rule.param("acceptWhitespace").defaultValue()).isEqualTo("false"); assertThat(rule.param("acceptWhitespace").description()) .isEqualTo("Accept whitespaces on the line"); assertThat(rule.debtSubCharacteristicKey()) .isEqualTo(RulesDefinition.SubCharacteristics.INTEGRATION_TESTABILITY); assertThat(rule.debtRemediationFunction().type()) .isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("1h"); assertThat(rule.debtRemediationFunction().offset()).isEqualTo("30min"); assertThat(rule.effortToFixDescription()).isEqualTo("x1 effort to fix"); }
@Test public void update_rule() { verifyRulesInDb(); // The plugin X1 will be updated rulesDefinition.includeX1 = false; rulesDefinition.includeX1bis = true; tester.get(Platform.class).executeStartupTasks(); Rule rule = index.getByKey(RuleTesting.XOO_X1); assertThat(rule.severity()).isEqualTo(Severity.INFO); assertThat(rule.name()).isEqualTo("x1 name updated"); assertThat(rule.htmlDescription()).isEqualTo("x1 desc updated"); assertThat(rule.systemTags()).contains("tag1", "tag2"); assertThat(rule.params()).hasSize(2); assertThat(rule.param("acceptWhitespace").type()).isEqualTo(RuleParamType.BOOLEAN); assertThat(rule.param("acceptWhitespace").defaultValue()).isEqualTo("true"); assertThat(rule.param("acceptWhitespace").description()) .isEqualTo("Accept whitespaces on the line updated"); // New parameter assertThat(rule.param("format").type()).isEqualTo(RuleParamType.TEXT); assertThat(rule.param("format").defaultValue()).isEqualTo("txt"); assertThat(rule.param("format").description()).isEqualTo("Format"); assertThat(rule.debtSubCharacteristicKey()) .isEqualTo(RulesDefinition.SubCharacteristics.INSTRUCTION_RELIABILITY); assertThat(rule.debtRemediationFunction().type()) .isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("2h"); assertThat(rule.debtRemediationFunction().offset()).isNull(); assertThat(rule.effortToFixDescription()).isEqualTo("x1 effort to fix updated"); }
@Test public void find_rule_by_key() { assertThat(registry.findByKey(RuleKey.of("unknown", "RuleWithParameters"))).isNull(); assertThat(registry.findByKey(RuleKey.of("xoo", "unknown"))).isNull(); final Rule rule = registry.findByKey(RuleKey.of("xoo", "RuleWithParameters")); assertThat(rule).isNotNull(); assertThat(rule.ruleKey().repository()).isEqualTo("xoo"); assertThat(rule.ruleKey().rule()).isEqualTo("RuleWithParameters"); assertThat(rule.params()).hasSize(5); assertThat(rule.adminTags()).hasSize(1); assertThat(rule.systemTags()).hasSize(2); }
@Test public void not_update_custom_rule_params_from_template() throws Exception { Rule templateRule = index.getByKey(RuleKey.of("xoo", "template1")); // Create custom rule RuleKey customRuleKey = tester .get(RuleCreator.class) .create( NewRule.createForCustomRule("CUSTOM_RULE", templateRule.key()) .setName("My custom") .setHtmlDescription("Some description") .setSeverity(Severity.MAJOR) .setStatus(RuleStatus.READY) .setParameters(ImmutableMap.of("format", "txt"))); dbSession.commit(); dbSession.clearCache(); // Update custom rule param name RuleDto customRuleDto = db.ruleDao().getByKey(dbSession, customRuleKey); RuleParamDto customRuleParamDto = db.ruleDao().findRuleParamsByRuleKey(dbSession, customRuleKey).get(0); db.ruleDao().removeRuleParam(dbSession, customRuleDto, customRuleParamDto); db.ruleDao().addRuleParam(dbSession, customRuleDto, customRuleParamDto.setName("format2")); dbSession.commit(); dbSession.clearCache(); // Verify param has been updated Rule customRule = index.getByKey(customRuleKey); assertThat(customRule.params()).hasSize(1); assertThat(customRule.params().get(0).key()).isEqualTo("format2"); // Re-execute startup tasks tester.get(Platform.class).executeStartupTasks(); // Verify custom rule param has not been changed! Rule customRuleReloaded = index.getByKey(customRuleKey); assertThat(customRuleReloaded.params().get(0).key()).isEqualTo("format2"); }
@Test public void update_custom_rule_with_empty_parameter() { // Create template rule RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001")); ruleDao.insert(dbSession, templateRule); RuleParamDto templateRuleParam = RuleParamDto.createFor(templateRule) .setName("regex") .setType("STRING") .setDescription("Reg ex"); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam); // Create custom rule RuleDto customRule = RuleTesting.newCustomRule(templateRule) .setName("Old name") .setDescription("Old description") .setSeverity(Severity.MINOR) .setStatus(RuleStatus.BETA); ruleDao.insert(dbSession, customRule); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam); dbSession.commit(); // Update custom rule without setting a value for the parameter RuleUpdate update = RuleUpdate.createForCustomRule(customRule.getKey()) .setName("New name") .setMarkdownDescription("New description") .setSeverity("MAJOR") .setStatus(RuleStatus.READY); updater.update(update, userSessionRule); dbSession.clearCache(); // Verify custom rule is updated Rule customRuleReloaded = ruleIndex.getByKey(customRule.getKey()); RuleParam param = customRuleReloaded.params().get(0); assertThat(param.defaultValue()).isNull(); }
@Test public void update_active_rule_parameters_when_updating_custom_rule() { // Create template rule with 3 parameters RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001")).setLanguage("xoo"); ruleDao.insert(dbSession, templateRule); RuleParamDto templateRuleParam1 = RuleParamDto.createFor(templateRule) .setName("regex") .setType("STRING") .setDescription("Reg ex") .setDefaultValue(".*"); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam1); RuleParamDto templateRuleParam2 = RuleParamDto.createFor(templateRule) .setName("format") .setType("STRING") .setDescription("format") .setDefaultValue("csv"); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam2); RuleParamDto templateRuleParam3 = RuleParamDto.createFor(templateRule) .setName("message") .setType("STRING") .setDescription("message"); ruleDao.insertRuleParam(dbSession, templateRule, templateRuleParam3); // Create custom rule RuleDto customRule = RuleTesting.newCustomRule(templateRule).setSeverity(Severity.MAJOR).setLanguage("xoo"); ruleDao.insert(dbSession, customRule); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam1.setDefaultValue("a.*")); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam2.setDefaultValue("txt")); ruleDao.insertRuleParam(dbSession, customRule, templateRuleParam3); // Create a quality profile QualityProfileDto profileDto = QProfileTesting.newXooP1(); db.qualityProfileDao().insert(dbSession, profileDto); dbSession.commit(); // Activate the custom rule RuleActivation activation = new RuleActivation(customRule.getKey()).setSeverity(Severity.BLOCKER); tester.get(RuleActivator.class).activate(dbSession, activation, QProfileTesting.XOO_P1_NAME); dbSession.commit(); dbSession.clearCache(); // Update custom rule parameter 'regex', add 'message' and remove 'format' RuleUpdate update = RuleUpdate.createForCustomRule(customRule.getKey()) .setParameters(ImmutableMap.of("regex", "b.*", "message", "a message")); updater.update(update, userSessionRule); dbSession.clearCache(); // Verify custom rule parameters has been updated Rule customRuleReloaded = ruleIndex.getByKey(customRule.getKey()); assertThat(customRuleReloaded.params()).hasSize(3); assertThat(customRuleReloaded.param("regex")).isNotNull(); assertThat(customRuleReloaded.param("regex").defaultValue()).isEqualTo("b.*"); assertThat(customRuleReloaded.param("message")).isNotNull(); assertThat(customRuleReloaded.param("message").defaultValue()).isEqualTo("a message"); assertThat(customRuleReloaded.param("format")).isNotNull(); assertThat(customRuleReloaded.param("format").defaultValue()).isNull(); RuleParam param = customRuleReloaded.params().get(0); assertThat(param.defaultValue()).isEqualTo("b.*"); // Verify active rule parameters has been updated ActiveRule activeRule = tester .get(ActiveRuleIndex.class) .getByKey(ActiveRuleKey.of(profileDto.getKey(), customRule.getKey())); assertThat(activeRule.params()).hasSize(2); assertThat(activeRule.params().get("regex")).isEqualTo("b.*"); assertThat(activeRule.params().get("message")).isEqualTo("a message"); assertThat(activeRule.params().get("format")).isNull(); // Verify that severity has not changed assertThat(activeRule.severity()).isEqualTo(Severity.BLOCKER); }