]> source.dussan.org Git - sonarqube.git/commitdiff
Drop unused classes DebtModelBackup and RuleOperations
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 6 Feb 2017 20:45:48 +0000 (21:45 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 7 Feb 2017 13:30:44 +0000 (14:30 +0100)
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java [deleted file]

diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java
deleted file mode 100644 (file)
index e8210f1..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * 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());
-    }
-  }
-}
index 2381c52ee71639f2da6c50c604f6d820381be988..abbfb74dd411c6da69040488fc0c81e5a6491618 100644 (file)
@@ -43,7 +43,6 @@ import org.sonar.server.component.index.ComponentIndex;
 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;
@@ -161,7 +160,6 @@ import org.sonar.server.rule.DeprecatedRulesDefinitionLoader;
 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;
@@ -280,7 +278,6 @@ public class PlatformLevel4 extends PlatformLevel {
       AnnotationRuleParser.class,
       XMLRuleParser.class,
       DefaultRuleFinder.class,
-      RuleOperations.class,
       DeprecatedRulesDefinitionLoader.class,
       RuleDefinitionsLoader.class,
       CommonRuleDefinitionsImpl.class,
@@ -404,7 +401,6 @@ public class PlatformLevel4 extends PlatformLevel {
       RemoveTagsAction.class,
 
       // technical debt
-      DebtModelBackup.class,
       DebtModelPluginRepository.class,
       DebtModelXMLExporter.class,
       DebtRulesXMLImporter.class,
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java
deleted file mode 100644 (file)
index 3e7ddab..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * 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;
-    }
-  }
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java
deleted file mode 100644 (file)
index 80ec053..0000000
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * 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();
-  }
-
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java
deleted file mode 100644 (file)
index 556c724..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * 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();
-  }
-}