+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.debt;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import java.util.Date;
-import java.util.List;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.server.ServerSide;
-import org.sonar.api.server.debt.DebtRemediationFunction;
-import org.sonar.api.server.rule.RulesDefinition;
-import org.sonar.api.utils.System2;
-import org.sonar.api.utils.ValidationMessages;
-import org.sonar.api.utils.log.Logger;
-import org.sonar.api.utils.log.Loggers;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
-import org.sonar.db.rule.RuleDto;
-import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
-import org.sonar.server.rule.RuleDefinitionsLoader;
-import org.sonar.server.rule.RuleOperations;
-import org.sonar.server.rule.index.RuleIndexer;
-import org.sonar.server.user.UserSession;
-
-import static com.google.common.collect.Lists.newArrayList;
-
-@ServerSide
-public class DebtModelBackup {
-
- private static final Logger LOG = Loggers.get(DebtModelBackup.class);
-
- private final DbClient dbClient;
- private final RuleOperations ruleOperations;
- private final DebtRulesXMLImporter rulesXMLImporter;
- private final DebtModelXMLExporter debtModelXMLExporter;
- private final RuleDefinitionsLoader defLoader;
- private final System2 system2;
- private final UserSession userSession;
- private final RuleIndexer ruleIndexer;
-
- public DebtModelBackup(DbClient dbClient, RuleOperations ruleOperations,
- DebtRulesXMLImporter rulesXMLImporter,
- DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader, System2 system2, UserSession userSession, RuleIndexer ruleIndexer) {
- this.dbClient = dbClient;
- this.ruleOperations = ruleOperations;
- this.rulesXMLImporter = rulesXMLImporter;
- this.debtModelXMLExporter = debtModelXMLExporter;
- this.defLoader = defLoader;
- this.system2 = system2;
- this.userSession = userSession;
- this.ruleIndexer = ruleIndexer;
- }
-
- public String backup() {
- return backupFromLanguage(null);
- }
-
- public String backup(String languageKey) {
- return backupFromLanguage(languageKey);
- }
-
- private String backupFromLanguage(@Nullable String languageKey) {
- checkPermission();
-
- DbSession session = dbClient.openSession(false);
- try {
- List<RuleDebt> rules = newArrayList();
- for (RuleDto rule : dbClient.ruleDao().selectEnabled(session)) {
- if (languageKey != null && !languageKey.equals(rule.getLanguage())) {
- continue;
- }
- RuleDebt ruleDebt = toRuleDebt(rule);
- if (ruleDebt != null) {
- rules.add(ruleDebt);
- }
- }
- return debtModelXMLExporter.export(rules);
- } finally {
- MyBatis.closeQuietly(session);
- }
- }
-
- /**
- * Reset from provided model
- */
- public void reset() {
- checkPermission();
-
- long updateDate = system2.now();
- DbSession session = dbClient.openSession(false);
- try {
- // Restore rules
- List<RuleDto> ruleDtos = dbClient.ruleDao().selectEnabled(session);
- if (!ruleDtos.isEmpty()) {
-
- // Load default rule definitions
- RulesDefinition.Context context = defLoader.load();
- List<RulesDefinition.Rule> rules = newArrayList();
- for (RulesDefinition.Repository repoDef : context.repositories()) {
- rules.addAll(repoDef.rules());
- }
-
- resetRules(ruleDtos, rules, updateDate, session);
- }
-
- session.commit();
- ruleIndexer.index();
- } finally {
- MyBatis.closeQuietly(session);
- }
- }
-
- private void resetRules(List<RuleDto> ruleDtos, List<RulesDefinition.Rule> rules, long updateDate, DbSession session) {
- for (RuleDto rule : ruleDtos) {
- // Restore default debt definitions
-
- RulesDefinition.Rule ruleDef;
- Integer ruleTemplateId = rule.getTemplateId();
- if (ruleTemplateId != null) {
- RuleDto templateRule = rule(ruleTemplateId, ruleDtos);
- ruleDef = ruleDef(templateRule.getRepositoryKey(), templateRule.getRuleKey(), rules);
- } else {
- ruleDef = ruleDef(rule.getRepositoryKey(), rule.getRuleKey(), rules);
- }
-
- if (ruleDef != null) {
- DebtRemediationFunction remediationFunction = ruleDef.debtRemediationFunction();
- boolean hasDebtDefinition = remediationFunction != null;
-
- rule.setDefaultRemediationFunction(hasDebtDefinition ? remediationFunction.type().name() : null);
- rule.setDefaultRemediationGapMultiplier(hasDebtDefinition ? remediationFunction.gapMultiplier() : null);
- rule.setDefaultRemediationBaseEffort(hasDebtDefinition ? remediationFunction.baseEffort() : null);
- }
-
- // Reset overridden debt definitions
- rule.setRemediationFunction(null);
- rule.setRemediationGapMultiplier(null);
- rule.setRemediationBaseEffort(null);
- rule.setUpdatedAt(updateDate);
- dbClient.ruleDao().update(session, rule);
- }
- }
-
- /**
- * Restore model from a given XML model (characteristics and rule debt are restored from XML)
- */
- public ValidationMessages restoreFromXml(String xml) {
- return restoreXmlModel(xml, null);
- }
-
- /**
- * Restore model from a given XML model and a given language (only debt of rules on given language are restored from XML)
- */
- public ValidationMessages restoreFromXml(String xml, final String languageKey) {
- return restoreXmlModel(xml, languageKey);
- }
-
- private ValidationMessages restoreXmlModel(String xml, @Nullable final String languageKey) {
- checkPermission();
-
- ValidationMessages validationMessages = ValidationMessages.create();
- Date updateDate = new Date(system2.now());
- DbSession session = dbClient.openSession(false);
- try {
- restoreRules(rules(languageKey, session), rulesXMLImporter.importXML(xml, validationMessages), validationMessages, updateDate, session);
-
- session.commit();
- ruleIndexer.index();
- } catch (IllegalArgumentException e) {
- LOG.debug("Error when restoring the model", e);
- validationMessages.addErrorText(e.getMessage());
- } finally {
- MyBatis.closeQuietly(session);
- }
- return validationMessages;
- }
-
- private void restoreRules(List<RuleDto> rules, List<RuleDebt> ruleDebts,
- ValidationMessages validationMessages, Date updateDate, DbSession session) {
- for (RuleDto rule : rules) {
- RuleDebt ruleDebt = ruleDebt(rule.getRepositoryKey(), rule.getRuleKey(), ruleDebts);
- ruleOperations.updateRule(rule,
- ruleDebt != null ? ruleDebt.function() : null,
- ruleDebt != null ? ruleDebt.coefficient() : null,
- ruleDebt != null ? ruleDebt.offset() : null, session);
- rule.setUpdatedAt(updateDate.getTime());
- ruleDebts.remove(ruleDebt);
- }
-
- for (RuleDebt ruleDebt : ruleDebts) {
- validationMessages.addWarningText(String.format("The rule '%s' does not exist.", ruleDebt.ruleKey()));
- }
- }
-
- private List<RuleDto> rules(@Nullable String languageKey, DbSession session) {
- List<RuleDto> rules = dbClient.ruleDao().selectEnabled(session);
- if (languageKey == null) {
- return rules;
- }
- return newArrayList(Iterables.filter(rules, new RuleDtoMatchLanguage(languageKey)));
- }
-
- @CheckForNull
- private static RuleDebt ruleDebt(String ruleRepo, String ruleKey, List<RuleDebt> ruleDebts) {
- if (ruleDebts.isEmpty()) {
- return null;
- }
- return Iterables.find(ruleDebts, new RuleDebtMatchRuleRepoAndRuleKey(ruleRepo, ruleKey), null);
- }
-
- private static RuleDto rule(int id, List<RuleDto> rules) {
- return Iterables.find(rules, new RuleDtoMatchId(id));
- }
-
- @CheckForNull
- private static RulesDefinition.Rule ruleDef(String ruleRepo, String ruleKey, List<RulesDefinition.Rule> rules) {
- return Iterables.find(rules, new RuleDefMatchRuleRepoAndRuleKey(ruleRepo, ruleKey), null);
- }
-
- @CheckForNull
- private static RuleDebt toRuleDebt(RuleDto rule) {
- RuleDebt ruleDebt = new RuleDebt().setRuleKey(RuleKey.of(rule.getRepositoryKey(), rule.getRuleKey()));
- String overriddenFunction = rule.getRemediationFunction();
- String defaultFunction = rule.getDefaultRemediationFunction();
- if (overriddenFunction != null) {
- ruleDebt.setFunction(overriddenFunction);
- ruleDebt.setCoefficient(rule.getRemediationGapMultiplier());
- ruleDebt.setOffset(rule.getRemediationBaseEffort());
- return ruleDebt;
- } else if (defaultFunction != null) {
- ruleDebt.setFunction(defaultFunction);
- ruleDebt.setCoefficient(rule.getDefaultRemediationGapMultiplier());
- ruleDebt.setOffset(rule.getDefaultRemediationBaseEffort());
- return ruleDebt;
- }
- return null;
- }
-
- private void checkPermission() {
- userSession.isRoot();
- }
-
- private static class RuleDtoMatchLanguage implements Predicate<RuleDto> {
- private final String languageKey;
-
- public RuleDtoMatchLanguage(String languageKey) {
- this.languageKey = languageKey;
- }
-
- @Override
- public boolean apply(@Nonnull RuleDto input) {
- return languageKey.equals(input.getLanguage());
- }
- }
-
- private static class RuleDebtMatchRuleRepoAndRuleKey implements Predicate<RuleDebt> {
-
- private final String ruleRepo;
- private final String ruleKey;
-
- public RuleDebtMatchRuleRepoAndRuleKey(String ruleRepo, String ruleKey) {
- this.ruleRepo = ruleRepo;
- this.ruleKey = ruleKey;
- }
-
- @Override
- public boolean apply(@Nullable RuleDebt input) {
- return input != null && ruleRepo.equals(input.ruleKey().repository()) && ruleKey.equals(input.ruleKey().rule());
- }
- }
-
- private static class RuleDtoMatchId implements Predicate<RuleDto> {
- private final int id;
-
- public RuleDtoMatchId(int id) {
- this.id = id;
- }
-
- @Override
- public boolean apply(@Nonnull RuleDto input) {
- return id == input.getId();
- }
- }
-
- private static class RuleDefMatchRuleRepoAndRuleKey implements Predicate<RulesDefinition.Rule> {
-
- private final String ruleRepo;
- private final String ruleKey;
-
- public RuleDefMatchRuleRepoAndRuleKey(String ruleRepo, String ruleKey) {
- this.ruleRepo = ruleRepo;
- this.ruleKey = ruleKey;
- }
-
- @Override
- public boolean apply(@Nonnull RulesDefinition.Rule input) {
- return ruleRepo.equals(input.repository().key()) && ruleKey.equals(input.key());
- }
- }
-}
import org.sonar.server.component.index.ComponentIndexDefinition;
import org.sonar.server.component.index.ComponentIndexer;
import org.sonar.server.component.ws.ComponentsWsModule;
-import org.sonar.server.debt.DebtModelBackup;
import org.sonar.server.debt.DebtModelPluginRepository;
import org.sonar.server.debt.DebtModelXMLExporter;
import org.sonar.server.debt.DebtRulesXMLImporter;
import org.sonar.server.rule.RuleCreator;
import org.sonar.server.rule.RuleDefinitionsLoader;
import org.sonar.server.rule.RuleDeleter;
-import org.sonar.server.rule.RuleOperations;
import org.sonar.server.rule.RuleService;
import org.sonar.server.rule.RuleUpdater;
import org.sonar.server.rule.index.RuleIndexDefinition;
AnnotationRuleParser.class,
XMLRuleParser.class,
DefaultRuleFinder.class,
- RuleOperations.class,
DeprecatedRulesDefinitionLoader.class,
RuleDefinitionsLoader.class,
CommonRuleDefinitionsImpl.class,
RemoveTagsAction.class,
// technical debt
- DebtModelBackup.class,
DebtModelPluginRepository.class,
DebtModelXMLExporter.class,
DebtRulesXMLImporter.class,
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.rule;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.server.ServerSide;
-import org.sonar.api.server.debt.DebtRemediationFunction;
-import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
-import org.sonar.db.rule.RuleDto;
-import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.rule.index.RuleIndexer;
-
-/**
- * @deprecated to be dropped in 4.4
- */
-@Deprecated
-@ServerSide
-public class RuleOperations {
-
- private final RuleIndexer ruleIndexer;
- private final DbClient dbClient;
-
- public RuleOperations(RuleIndexer ruleIndexer, DbClient dbClient) {
- this.ruleIndexer = ruleIndexer;
- this.dbClient = dbClient;
- }
-
- public void updateRule(RuleChange ruleChange) {
- DbSession session = dbClient.openSession(false);
- try {
- RuleDto ruleDto = dbClient.ruleDao().selectOrFailByKey(session, ruleChange.ruleKey());
- boolean needUpdate = updateRule(ruleDto, ruleChange.debtRemediationFunction(), ruleChange.debtRemediationCoefficient(),
- ruleChange.debtRemediationOffset(),
- session);
- if (needUpdate) {
- ruleIndexer.index();
- session.commit();
- }
- } catch (IllegalArgumentException e) {
- throw new BadRequestException(e.getMessage());
- } finally {
- MyBatis.closeQuietly(session);
- }
- }
-
- public boolean updateRule(RuleDto ruleDto, @Nullable String newFunction,
- @Nullable String newCoefficient, @Nullable String newOffset, DbSession session) {
- boolean needUpdate = false;
-
- // A sub-characteristic and a remediation function is given -> update rule debt
- if (newFunction != null) {
- // New values are the same as the default values -> set overridden values to null
- if (isRuleDebtSameAsDefaultValues(ruleDto, newFunction, newCoefficient, newOffset)) {
- ruleDto.setRemediationFunction(null);
- ruleDto.setRemediationGapMultiplier(null);
- ruleDto.setRemediationBaseEffort(null);
- needUpdate = true;
-
- // New values are not the same as the overridden values -> update overridden values with new values
- } else if (!isRuleDebtSameAsOverriddenValues(ruleDto, newFunction, newCoefficient, newOffset)) {
- DefaultDebtRemediationFunction debtRemediationFunction = new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.valueOf(newFunction), newCoefficient, newOffset);
- ruleDto.setRemediationFunction(debtRemediationFunction.type().name());
- ruleDto.setRemediationGapMultiplier(debtRemediationFunction.gapMultiplier());
- ruleDto.setRemediationBaseEffort(debtRemediationFunction.baseEffort());
- needUpdate = true;
- }
-
- // No sub-characteristic is given -> disable rule debt if not already disabled
- } else {
- // Rule characteristic is not already disabled -> update it
- ruleDto.setRemediationFunction(null);
- ruleDto.setRemediationGapMultiplier(null);
- ruleDto.setRemediationBaseEffort(null);
- needUpdate = true;
- }
-
- if (needUpdate) {
- dbClient.ruleDao().update(session, ruleDto);
- }
- return needUpdate;
- }
-
- private static boolean isRuleDebtSameAsDefaultValues(RuleDto ruleDto, @Nullable String newFunction,
- @Nullable String newCoefficient, @Nullable String newOffset) {
- return isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getDefaultRemediationFunction(), ruleDto.getDefaultRemediationGapMultiplier(),
- ruleDto.getDefaultRemediationBaseEffort());
- }
-
- private static boolean isRuleDebtSameAsOverriddenValues(RuleDto ruleDto, @Nullable String newFunction,
- @Nullable String newCoefficient, @Nullable String newOffset) {
- return isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getRemediationFunction(), ruleDto.getRemediationGapMultiplier(),
- ruleDto.getRemediationBaseEffort());
- }
-
- private static boolean isSameRemediationFunction(@Nullable String newFunction, @Nullable String newCoefficient, @Nullable String newOffset,
- String oldFunction, @Nullable String oldCoefficient, @Nullable String oldOffset) {
- return new EqualsBuilder()
- .append(oldFunction, newFunction)
- .append(oldCoefficient, newCoefficient)
- .append(oldOffset, newOffset)
- .isEquals();
- }
-
- public static class RuleChange {
- private RuleKey ruleKey;
- private String debtRemediationFunction;
- private String debtRemediationCoefficient;
- private String debtRemediationOffset;
-
- public RuleKey ruleKey() {
- return ruleKey;
- }
-
- public RuleChange setRuleKey(RuleKey ruleKey) {
- this.ruleKey = ruleKey;
- return this;
- }
-
- @CheckForNull
- public String debtRemediationFunction() {
- return debtRemediationFunction;
- }
-
- public RuleChange setDebtRemediationFunction(@Nullable String debtRemediationFunction) {
- this.debtRemediationFunction = debtRemediationFunction;
- return this;
- }
-
- @CheckForNull
- public String debtRemediationCoefficient() {
- return debtRemediationCoefficient;
- }
-
- public RuleChange setDebtRemediationCoefficient(@Nullable String debtRemediationCoefficient) {
- this.debtRemediationCoefficient = debtRemediationCoefficient;
- return this;
- }
-
- @CheckForNull
- public String debtRemediationOffset() {
- return debtRemediationOffset;
- }
-
- public RuleChange setDebtRemediationOffset(@Nullable String debtRemediationOffset) {
- this.debtRemediationOffset = debtRemediationOffset;
- return this;
- }
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.debt;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rule.Severity;
-import org.sonar.api.server.debt.DebtRemediationFunction;
-import org.sonar.api.server.rule.RulesDefinition;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.utils.System2;
-import org.sonar.api.utils.ValidationMessages;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.rule.RuleDao;
-import org.sonar.db.rule.RuleDto;
-import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
-import org.sonar.server.rule.RuleDefinitionsLoader;
-import org.sonar.server.rule.RuleOperations;
-import org.sonar.server.rule.index.RuleIndexer;
-import org.sonar.server.tester.UserSessionRule;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isNull;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class DebtModelBackupTest {
-
- @Rule
- public UserSessionRule userSessionRule = UserSessionRule.standalone();
-
- @Mock
- private DbClient dbClient;
- @Mock
- private DbSession session;
- @Mock
- private RuleDao ruleDao;
- @Mock
- private RuleOperations ruleOperations;
- @Mock
- private DebtRulesXMLImporter rulesXMLImporter;
- @Mock
- private DebtModelXMLExporter debtModelXMLExporter;
- @Mock
- private RuleDefinitionsLoader defLoader;
- @Mock
- private System2 system2;
- @Mock
- private RuleIndexer ruleIndexer;
- @Captor
- private ArgumentCaptor<RuleDto> ruleCaptor;
- @Captor
- private ArgumentCaptor<ArrayList<RuleDebt>> ruleDebtListCaptor;
-
- private Date now = DateUtils.parseDate("2014-03-19");
-
- private DebtModelBackup underTest;
-
- @Before
- public void setUp() {
- userSessionRule.logIn().setRoot();
-
- when(system2.now()).thenReturn(now.getTime());
-
- when(dbClient.openSession(false)).thenReturn(session);
- when(dbClient.ruleDao()).thenReturn(ruleDao);
-
- underTest = new DebtModelBackup(dbClient, ruleOperations, rulesXMLImporter,
- debtModelXMLExporter, defLoader, system2, userSessionRule, ruleIndexer);
- }
-
- @Test
- public void backup() {
- when(ruleDao.selectEnabled(session)).thenReturn(
- newArrayList(
- // Rule with overridden debt values
- new RuleDto().setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min"),
-
- // Rule with default debt values
- new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE")
- .setDefaultRemediationFunction("LINEAR").setDefaultRemediationGapMultiplier("2h")
- ));
-
- underTest.backup();
-
- verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture());
- List<RuleDebt> rules = ruleDebtListCaptor.getValue();
- assertThat(rules).hasSize(2);
-
- RuleDebt rule = rules.get(0);
- assertThat(rule.ruleKey().repository()).isEqualTo("squid");
- assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck");
- assertThat(rule.function()).isEqualTo("LINEAR_OFFSET");
- assertThat(rule.coefficient()).isEqualTo("2h");
- assertThat(rule.offset()).isEqualTo("15min");
-
- rule = rules.get(1);
- assertThat(rule.ruleKey().repository()).isEqualTo("squid");
- assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE");
- assertThat(rule.function()).isEqualTo("LINEAR");
- assertThat(rule.coefficient()).isEqualTo("2h");
- assertThat(rule.offset()).isNull();
- }
-
- @Test
- public void backup_with_disabled_rules() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- // Debt disabled
- new RuleDto().setRepositoryKey("squid").setRuleKey("UselessImportCheck"),
-
- // Not debt
- new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE")
- ));
-
- underTest.backup();
-
- verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture());
-
- assertThat(ruleDebtListCaptor.getValue()).isEmpty();
- }
-
- @Test
- public void backup_with_rule_having_default_linear_and_overridden_offset() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- // Rule with default debt values : default value is linear (only coefficient is set) and overridden value is constant per issue (only
- // offset is set)
- // -> Ony offset should be set
- new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE")
- .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setDefaultRemediationGapMultiplier("2h")
- .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString())
- .setRemediationBaseEffort("15min")
- ));
-
- underTest.backup();
-
- verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture());
-
- List<RuleDebt> rules = ruleDebtListCaptor.getValue();
- assertThat(rules).hasSize(1);
-
- RuleDebt rule = rules.get(0);
- assertThat(rule.ruleKey().repository()).isEqualTo("squid");
- assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE");
- assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE");
- assertThat(rule.offset()).isEqualTo("15min");
- assertThat(rule.coefficient()).isNull();
- }
-
- @Test
- public void backup_from_language() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java")
- .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString())
- .setRemediationBaseEffort("15min"),
- // Should be ignored
- new RuleDto().setId(2).setRepositoryKey("checkstyle")
- .setLanguage("java2")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setRemediationGapMultiplier("2h")
- ));
-
- underTest.backup("java");
-
- verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture());
-
- List<RuleDebt> rules = ruleDebtListCaptor.getValue();
- assertThat(rules).hasSize(1);
-
- RuleDebt rule = rules.get(0);
- assertThat(rule.ruleKey().repository()).isEqualTo("squid");
- assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck");
- assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE");
- assertThat(rule.coefficient()).isNull();
- assertThat(rule.offset()).isEqualTo("15min");
- }
-
- @Test
- public void reset_model() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setRepositoryKey("squid").setRuleKey("NPE")
- .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setDefaultRemediationGapMultiplier("2h")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min")
- ));
-
- RulesDefinition.Context context = new RulesDefinition.Context();
- RulesDefinition.NewRepository repo = context.createRepository("squid", "java").setName("Squid");
- RulesDefinition.NewRule newRule = repo.createRule("NPE")
- .setName("Detect NPE")
- .setHtmlDescription("Detect <code>java.lang.NullPointerException</code>")
- .setSeverity(Severity.BLOCKER)
- .setStatus(RuleStatus.BETA);
- newRule.setDebtRemediationFunction(newRule.debtRemediationFunctions().linearWithOffset("4h", "20min"));
- repo.done();
- when(defLoader.load()).thenReturn(context);
-
- underTest.reset();
-
- verify(ruleDao).selectEnabled(session);
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verifyNoMoreInteractions(ruleDao);
-
- verify(session).commit();
- verify(ruleIndexer).index();
-
- RuleDto rule = ruleCaptor.getValue();
-
- assertThat(rule.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET");
- assertThat(rule.getDefaultRemediationGapMultiplier()).isEqualTo("4h");
- assertThat(rule.getDefaultRemediationBaseEffort()).isEqualTo("20min");
- assertThat(rule.getUpdatedAt()).isEqualTo(now.getTime());
-
- assertThat(rule.getRemediationFunction()).isNull();
- assertThat(rule.getRemediationGapMultiplier()).isNull();
- assertThat(rule.getRemediationBaseEffort()).isNull();
- assertThat(rule.getUpdatedAt()).isEqualTo(now.getTime());
- }
-
- @Test
- public void reset_model_when_no_default_value() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setRepositoryKey("squid").setRuleKey("NPE")
- .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setDefaultRemediationGapMultiplier("2h")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min")
- ));
-
- RulesDefinition.Context context = new RulesDefinition.Context();
- RulesDefinition.NewRepository repo = context.createRepository("squid", "java").setName("Squid");
- repo.createRule("NPE")
- .setName("Detect NPE")
- .setHtmlDescription("Detect <code>java.lang.NullPointerException</code>")
- .setSeverity(Severity.BLOCKER)
- .setStatus(RuleStatus.BETA);
- repo.done();
- when(defLoader.load()).thenReturn(context);
-
- underTest.reset();
-
- verify(ruleDao).selectEnabled(session);
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verifyNoMoreInteractions(ruleDao);
-
- verify(session).commit();
- verify(ruleIndexer).index();
-
- RuleDto rule = ruleCaptor.getValue();
- assertThat(rule.getDefaultRemediationFunction()).isNull();
- assertThat(rule.getDefaultRemediationGapMultiplier()).isNull();
- assertThat(rule.getDefaultRemediationBaseEffort()).isNull();
- assertThat(rule.getUpdatedAt()).isEqualTo(now.getTime());
- }
-
- @Test
- public void reset_model_on_custom_rules() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- // Template rule
- new RuleDto().setId(5).setRepositoryKey("squid").setRuleKey("XPath")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min"),
- // Custom rule
- new RuleDto().setId(6).setRepositoryKey("squid").setRuleKey("XPath_1369910135").setTemplateId(5)
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min")
- ));
-
- RulesDefinition.Context context = new RulesDefinition.Context();
- // Template rule
- RulesDefinition.NewRepository repo = context.createRepository("squid", "java").setName("XPath");
- RulesDefinition.NewRule newRule = repo.createRule("XPath")
- .setName("XPath")
- .setHtmlDescription("XPath")
- .setSeverity(Severity.BLOCKER)
- .setStatus(RuleStatus.BETA);
- newRule.setDebtRemediationFunction(newRule.debtRemediationFunctions().linearWithOffset("4h", "20min"));
- repo.done();
- when(defLoader.load()).thenReturn(context);
-
- underTest.reset();
-
- verify(ruleDao).selectEnabled(session);
- verify(ruleDao, times(2)).update(eq(session), ruleCaptor.capture());
- verifyNoMoreInteractions(ruleDao);
- verify(session).commit();
- verify(ruleIndexer).index();
-
- RuleDto rule = ruleCaptor.getAllValues().get(1);
-
- assertThat(rule.getId()).isEqualTo(6);
- assertThat(rule.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET");
- assertThat(rule.getDefaultRemediationGapMultiplier()).isEqualTo("4h");
- assertThat(rule.getDefaultRemediationBaseEffort()).isEqualTo("20min");
- assertThat(rule.getUpdatedAt()).isEqualTo(now.getTime());
-
- assertThat(rule.getRemediationFunction()).isNull();
- assertThat(rule.getRemediationGapMultiplier()).isNull();
- assertThat(rule.getRemediationBaseEffort()).isNull();
- assertThat(rule.getUpdatedAt()).isEqualTo(now.getTime());
- }
-
- @Test
- public void reset_model_do_not_load_rule_definitions_if_no_rule() {
- when(ruleDao.selectEnabled(session)).thenReturn(Collections.<RuleDto>emptyList());
-
- underTest.reset();
-
- verify(ruleDao).selectEnabled(session);
- verify(ruleDao, never()).update(eq(session), any(RuleDto.class));
- verifyZeroInteractions(defLoader);
-
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml() {
- when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt()
- .setRuleKey(RuleKey.of("squid", "UselessImportCheck"))
- .setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h")));
-
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setDefaultRemediationFunction("LINEAR").setDefaultRemediationGapMultiplier("2h")
- ));
-
- underTest.restoreFromXml("<xml/>");
-
- verify(ruleOperations).updateRule(ruleCaptor.capture(), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session));
-
- verify(ruleDao).selectEnabled(session);
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml_disable_rule_debt_when_not_in_xml_and_rule_have_default_debt_values() {
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setDefaultRemediationFunction("LINEAR_OFFSET").setDefaultRemediationGapMultiplier("2h").setDefaultRemediationBaseEffort("15min")
- ));
-
- underTest.restoreFromXml("<xml/>");
-
- verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(String.class), isNull(String.class), isNull(String.class), eq(session));
-
- verify(ruleDao).selectEnabled(session);
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml_and_language() {
- when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt()
- .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h")));
-
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java")
- .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setDefaultRemediationGapMultiplier("2h"),
- // Should be ignored
- new RuleDto().setId(2).setRepositoryKey("checkstyle").setLanguage("java2")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString())
- .setRemediationGapMultiplier("2h")
- ));
-
- underTest.restoreFromXml("<xml/>", "java");
-
- verify(ruleOperations).updateRule(ruleCaptor.capture(), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session));
-
- verify(ruleDao).selectEnabled(session);
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml_and_language_with_rule_not_in_xml() {
- when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(Collections.<RuleDebt>emptyList());
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- // Rule does not exits in XML -> debt will be disabled
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java")
- .setDefaultRemediationFunction("LINEAR").setDefaultRemediationGapMultiplier("2h")
- .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
- .setRemediationGapMultiplier("2h")
- .setRemediationBaseEffort("15min")
- ));
-
- underTest.restoreFromXml("<xml/>", "java");
-
- verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(String.class), isNull(String.class), isNull(String.class), eq(session));
-
- verify(ruleDao).selectEnabled(session);
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml_add_warning_message_when_rule_from_xml_is_not_found() {
- when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt()
- .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h")));
-
- when(ruleDao.selectEnabled(session)).thenReturn(Collections.<RuleDto>emptyList());
-
- assertThat(underTest.restoreFromXml("<xml/>").getWarnings()).hasSize(1);
-
- verifyZeroInteractions(ruleOperations);
-
- verify(ruleDao).selectEnabled(session);
- verify(session).commit();
- verify(ruleIndexer).index();
- }
-
- @Test
- public void restore_from_xml_add_error_message_when_illegal_argument_exception() {
- when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt()
- .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h")));
-
- when(ruleDao.selectEnabled(session)).thenReturn(newArrayList(
- new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setDefaultRemediationFunction("LINEAR").setDefaultRemediationGapMultiplier("2h")
- ));
-
- when(ruleOperations.updateRule(any(RuleDto.class), anyString(), anyString(), anyString(), eq(session))).thenThrow(IllegalArgumentException.class);
-
- assertThat(underTest.restoreFromXml("<xml/>").getErrors()).hasSize(1);
-
- verify(ruleDao).selectEnabled(session);
- verify(session, never()).commit();
- verify(ruleIndexer, never()).index();
- }
-
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.rule;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.rule.RuleDao;
-import org.sonar.db.rule.RuleDto;
-import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.rule.RuleOperations.RuleChange;
-import org.sonar.server.rule.index.RuleIndexer;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class RuleOperationsTest {
- @Mock
- DbClient dbClient;
-
- @Mock
- DbSession session;
-
- @Mock
- RuleDao ruleDao;
-
- @Mock
- RuleIndexer ruleIndexer;
-
- @Captor
- ArgumentCaptor<RuleDto> ruleCaptor;
-
- RuleOperations operations;
-
- @Before
- public void setUp() {
- when(dbClient.openSession(false)).thenReturn(session);
- when(dbClient.ruleDao()).thenReturn(ruleDao);
- operations = new RuleOperations(ruleIndexer, dbClient);
- }
-
- @Test
- public void update_rule() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setRemediationFunction("CONSTANT_ISSUE").setRemediationBaseEffort("10min");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- operations.updateRule(
- new RuleChange().setRuleKey(ruleKey)
- .setDebtRemediationFunction("LINEAR_OFFSET").setDebtRemediationCoefficient("2h").setDebtRemediationOffset("20min"));
-
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verify(session).commit();
-
- RuleDto result = ruleCaptor.getValue();
-
- assertThat(result.getId()).isEqualTo(1);
- assertThat(result.getRemediationFunction()).isEqualTo("LINEAR_OFFSET");
- assertThat(result.getRemediationGapMultiplier()).isEqualTo("2h");
- assertThat(result.getRemediationBaseEffort()).isEqualTo("20min");
-
- verify(ruleIndexer).index();
- }
-
- @Test
- public void update_rule_set_overridden_values_to_null_when_new_values_are_equals_to_default_values() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setRemediationFunction("CONSTANT_ISSUE").setRemediationBaseEffort("10min")
- .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationBaseEffort("10min");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- operations.updateRule(
- // Same value as default values -> overridden values will be set to null
- new RuleChange().setRuleKey(ruleKey)
- .setDebtRemediationFunction("CONSTANT_ISSUE").setDebtRemediationOffset("10min"));
-
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verify(session).commit();
-
- RuleDto result = ruleCaptor.getValue();
-
- assertThat(result.getId()).isEqualTo(1);
- assertThat(result.getRemediationFunction()).isNull();
- assertThat(result.getRemediationGapMultiplier()).isNull();
- assertThat(result.getRemediationBaseEffort()).isNull();
- }
-
- @Test
- public void not_update_rule_if_same_function() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setRemediationFunction("CONSTANT_ISSUE").setRemediationBaseEffort("10min");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- operations.updateRule(
- new RuleChange().setRuleKey(ruleKey)
- .setDebtRemediationFunction("CONSTANT_ISSUE").setDebtRemediationOffset("10min"));
-
- verify(ruleDao, never()).update(eq(session), any(RuleDto.class));
- verify(session, never()).commit();
- verify(ruleIndexer, never()).index();
- }
-
- @Test
- public void update_rule_set_remediation_function_if_different_from_default_one() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationBaseEffort("10min");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- operations.updateRule(
- // Characteristic is the not same as the default one -> Overridden values should be set
- new RuleChange().setRuleKey(ruleKey)
- .setDebtRemediationFunction("LINEAR").setDebtRemediationCoefficient("10min"));
-
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verify(session).commit();
-
- RuleDto result = ruleCaptor.getValue();
-
- assertThat(result.getId()).isEqualTo(1);
- assertThat(result.getRemediationFunction()).isEqualTo("LINEAR");
- assertThat(result.getRemediationBaseEffort()).isNull();
- assertThat(result.getRemediationGapMultiplier()).isEqualTo("10min");
- }
-
- @Test
- public void disable_rule_debt_when_update_rule_with_no_function() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationBaseEffort("10min");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- operations.updateRule(new RuleChange().setRuleKey(ruleKey));
-
- verify(ruleDao).update(eq(session), ruleCaptor.capture());
- verify(session).commit();
-
- RuleDto result = ruleCaptor.getValue();
-
- assertThat(result.getId()).isEqualTo(1);
- assertThat(result.getRemediationFunction()).isNull();
- assertThat(result.getRemediationGapMultiplier()).isNull();
- assertThat(result.getRemediationBaseEffort()).isNull();
- }
-
- @Test
- public void fail_to_update_rule_on_invalid_coefficient() {
- RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck")
- .setRemediationFunction("LINEAR").setRemediationGapMultiplier("1h");
- RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck");
-
- when(ruleDao.selectOrFailByKey(session, ruleKey)).thenReturn(dto);
-
- try {
- operations.updateRule(
- new RuleChange().setRuleKey(ruleKey)
- .setDebtRemediationFunction("LINEAR").setDebtRemediationCoefficient("foo"));
- } catch (Exception e) {
- assertThat(e).isInstanceOf(BadRequestException.class)
- .hasMessage("Invalid gap multiplier: foo (Duration 'foo' is invalid, it should use the following sample format : 2d 10h 15min)");
- }
-
- verify(ruleDao, never()).update(eq(session), any(RuleDto.class));
- verify(session, never()).commit();
- }
-}