]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5531 Replace usage of IssueFinder by IssueService in /api/issues/show
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 19 Sep 2014 12:08:47 +0000 (14:08 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 19 Sep 2014 12:08:47 +0000 (14:08 +0200)
server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java
server/sonar-server/src/main/java/org/sonar/server/issue/ActionService.java
server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowAction.java
server/sonar-server/src/test/java/org/sonar/server/issue/ActionServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java

index 1c86e366b109be4c9d5f7f74c73746f670136557..a87021146bb99efc9a7e4b499cbdb491a6d90b7f 100644 (file)
@@ -144,6 +144,7 @@ public abstract class BaseDao<MAPPER, DTO extends Dto<KEY>, KEY extends Serializ
     return session.getMapper(mapperClass);
   }
 
+  @CheckForNull
   public DTO getNullableByKey(DbSession session, KEY key) {
     return doGetNullableByKey(session, key);
   }
index 65332de566e3b235fb3940a6e9fc05cd2adac1bf..8a34b02c8528ae74235517b3bc5ea3b9e23dd4cb 100644 (file)
@@ -28,18 +28,17 @@ import org.sonar.api.ServerComponent;
 import org.sonar.api.component.Component;
 import org.sonar.api.config.Settings;
 import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.IssueQueryResult;
 import org.sonar.api.issue.action.Action;
 import org.sonar.api.issue.action.Actions;
 import org.sonar.api.issue.action.Function;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.core.issue.db.IssueStorage;
+import org.sonar.core.persistence.DbSession;
 import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
+import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
@@ -55,15 +54,17 @@ import static com.google.common.collect.Lists.newArrayList;
  */
 public class ActionService implements ServerComponent {
 
-  private final DefaultIssueFinder finder;
+  private final DbClient dbClient;
+  private final IssueService issueService;
   private final IssueStorage issueStorage;
   private final IssueUpdater updater;
   private final Settings settings;
   private final PropertiesDao propertiesDao;
   private final Actions actions;
 
-  public ActionService(DefaultIssueFinder finder, IssueStorage issueStorage, IssueUpdater updater, Settings settings, PropertiesDao propertiesDao, Actions actions) {
-    this.finder = finder;
+  public ActionService(DbClient dbClient, IssueService issueService, IssueStorage issueStorage, IssueUpdater updater, Settings settings, PropertiesDao propertiesDao, Actions actions) {
+    this.dbClient = dbClient;
+    this.issueService = issueService;
     this.issueStorage = issueStorage;
     this.updater = updater;
     this.settings = settings;
@@ -76,9 +77,7 @@ public class ActionService implements ServerComponent {
   }
 
   public List<Action> listAvailableActions(String issueKey) {
-    IssueQueryResult queryResult = loadIssue(issueKey);
-    final DefaultIssue issue = (DefaultIssue) queryResult.first();
-    return listAvailableActions(issue);
+    return listAvailableActions(issueService.getIssueByKey(issueKey));
   }
 
   public List<Action> listAvailableActions(final Issue issue) {
@@ -93,29 +92,28 @@ public class ActionService implements ServerComponent {
   public Issue execute(String issueKey, String actionKey, UserSession userSession) {
     Preconditions.checkArgument(!Strings.isNullOrEmpty(actionKey), "Missing action");
 
-    IssueQueryResult queryResult = loadIssue(issueKey);
-    DefaultIssue issue = (DefaultIssue) queryResult.first();
-    Action action = getAction(actionKey);
-    if (action == null) {
-      throw new IllegalArgumentException("Action is not found : " + actionKey);
-    }
-    if (!action.supports(issue)) {
-      throw new IllegalStateException("A condition is not respected");
-    }
+    DbSession session = dbClient.openSession(false);
+    try {
+      DefaultIssue issue = issueService.getIssueByKey(session, issueKey);
+      Action action = getAction(actionKey);
+      if (action == null) {
+        throw new IllegalArgumentException("Action is not found : " + actionKey);
+      }
+      if (!action.supports(issue)) {
+        throw new IllegalStateException("A condition is not respected");
+      }
 
-    IssueChangeContext changeContext = IssueChangeContext.createUser(new Date(), userSession.login());
-    Component project = queryResult.project(issue);
-    FunctionContext functionContext = new FunctionContext(issue, updater, changeContext, getProjectSettings(project));
-    for (Function function : action.functions()) {
-      function.execute(functionContext);
+      IssueChangeContext changeContext = IssueChangeContext.createUser(new Date(), userSession.login());
+      Component project = dbClient.componentDao().getByKey(session, issue.projectKey());
+      FunctionContext functionContext = new FunctionContext(issue, updater, changeContext, getProjectSettings(project));
+      for (Function function : action.functions()) {
+        function.execute(functionContext);
+      }
+      issueStorage.save(issue);
+      return issue;
+    } finally {
+      session.close();
     }
-    issueStorage.save(issue);
-    return issue;
-  }
-
-  public IssueQueryResult loadIssue(String issueKey) {
-    IssueQuery query = IssueQuery.builder().issueKeys(newArrayList(issueKey)).requiredRole(UserRole.USER).build();
-    return finder.find(query);
   }
 
   @CheckForNull
index c19387a2a428771e45b9634ae1a401d44c9f3e6e..155ae154244ec9dcc0c2d14405ba17c708423b7c 100644 (file)
@@ -41,7 +41,6 @@ import org.sonar.core.issue.DefaultIssueBuilder;
 import org.sonar.core.issue.IssueNotifications;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.core.issue.db.IssueDao;
-import org.sonar.core.issue.db.IssueDto;
 import org.sonar.core.issue.db.IssueStorage;
 import org.sonar.core.issue.workflow.IssueWorkflow;
 import org.sonar.core.issue.workflow.Transition;
@@ -79,15 +78,15 @@ public class DefaultIssueService implements IssueService {
   private final PreviewCache dryRunCache;
 
   public DefaultIssueService(DbClient dbClient, IndexClient indexClient,
-                             IssueWorkflow workflow,
-                             IssueStorage issueStorage,
-                             IssueUpdater issueUpdater,
-                             IssueNotifications issueNotifications,
-                             ActionPlanService actionPlanService,
-                             RuleFinder ruleFinder,
-                             IssueDao issueDao,
-                             UserFinder userFinder,
-                             PreviewCache dryRunCache) {
+    IssueWorkflow workflow,
+    IssueStorage issueStorage,
+    IssueUpdater issueUpdater,
+    IssueNotifications issueNotifications,
+    ActionPlanService actionPlanService,
+    RuleFinder ruleFinder,
+    IssueDao issueDao,
+    UserFinder userFinder,
+    PreviewCache dryRunCache) {
     this.dbClient = dbClient;
     this.indexClient = indexClient;
     this.workflow = workflow;
@@ -115,8 +114,7 @@ public class DefaultIssueService implements IssueService {
   public List<Transition> listTransitions(String issueKey) {
     DbSession session = dbClient.openSession(false);
     try {
-      IssueDto issueDto = getByKey(session, issueKey);
-      return listTransitions(issueDto.toDefaultIssue());
+      return listTransitions(getIssueByKey(session, issueKey));
     } finally {
       session.close();
     }
@@ -150,8 +148,7 @@ public class DefaultIssueService implements IssueService {
 
     DbSession session = dbClient.openSession(false);
     try {
-      IssueDto issueDto = getByKey(session, issueKey);
-      DefaultIssue defaultIssue = issueDto.toDefaultIssue();
+      DefaultIssue defaultIssue = getIssueByKey(session, issueKey);
       IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
       checkTransitionPermission(transitionKey, UserSession.get(), defaultIssue);
       if (workflow.doTransition(defaultIssue, transitionKey, context)) {
@@ -180,8 +177,7 @@ public class DefaultIssueService implements IssueService {
 
     DbSession session = dbClient.openSession(false);
     try {
-      IssueDto issueDto = getByKey(session, issueKey);
-      DefaultIssue issue = issueDto.toDefaultIssue();
+      DefaultIssue issue = getIssueByKey(session, issueKey);
       User user = null;
       if (!Strings.isNullOrEmpty(assignee)) {
         user = userFinder.findByLogin(assignee);
@@ -213,8 +209,7 @@ public class DefaultIssueService implements IssueService {
           throw new NotFoundException("Unknown action plan: " + actionPlanKey);
         }
       }
-      IssueDto issueDto = getByKey(session, issueKey);
-      DefaultIssue issue = issueDto.toDefaultIssue();
+      DefaultIssue issue = getIssueByKey(session, issueKey);
 
       IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
       if (issueUpdater.plan(issue, actionPlan, context)) {
@@ -233,8 +228,7 @@ public class DefaultIssueService implements IssueService {
 
     DbSession session = dbClient.openSession(false);
     try {
-      IssueDto issueDto = getByKey(session, issueKey);
-      DefaultIssue issue = issueDto.toDefaultIssue();
+      DefaultIssue issue = getIssueByKey(session, issueKey);
       UserSession.get().checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
 
       IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
@@ -249,7 +243,7 @@ public class DefaultIssueService implements IssueService {
 
   @Override
   public DefaultIssue createManualIssue(String componentKey, RuleKey ruleKey, @Nullable Integer line, @Nullable String message, @Nullable String severity,
-                                        @Nullable Double effortToFix) {
+    @Nullable Double effortToFix) {
     verifyLoggedIn();
 
     DbSession session = dbClient.openSession(false);
@@ -305,10 +299,21 @@ public class DefaultIssueService implements IssueService {
     return aggregation;
   }
 
-  public IssueDto getByKey(DbSession session, String key) {
-    // Load with index to check permission
+  public DefaultIssue getIssueByKey(DbSession session, String key) {
+    // Load from index to check permission
     indexClient.get(IssueIndex.class).getByKey(key);
-    return dbClient.issueDao().getByKey(session, key);
+    return dbClient.issueDao().getByKey(session, key).toDefaultIssue();
+  }
+
+  public DefaultIssue getIssueByKey(String key) {
+    DbSession session = dbClient.openSession(false);
+    try {
+      // Load from index to check permission
+      indexClient.get(IssueIndex.class).getByKey(key);
+      return dbClient.issueDao().getByKey(session, key).toDefaultIssue();
+    } finally {
+      session.close();
+    }
   }
 
   private void saveIssue(DbSession session, DefaultIssue issue, IssueChangeContext context) {
index c60d205fe8a965d5fb5520275a076b0aa92d655d..9314309d12250c049e1b1f233f9bb6e062ac994e 100644 (file)
@@ -57,4 +57,8 @@ public interface IssueService extends ServerComponent {
   // TODO result should be replaced by an aggregation object in IssueIndex
   Multiset<String> findSeveritiesByComponent(String componentKey, @Nullable Date periodDate, DbSession session);
 
+  DefaultIssue getIssueByKey(DbSession session, String key);
+
+  DefaultIssue getIssueByKey(String key);
+
 }
index 107ac341c9591f723cd40ffe0d710e8d7a250951..5e07254f34c1e17ac288db046055314580487f35 100644 (file)
@@ -109,7 +109,7 @@ public class OldIssueService implements IssueService {
    * Never return null, but return an empty list if the issue does not exist.
    */
   public List<Transition> listTransitions(String issueKey) {
-    Issue issue = loadIssue(issueKey).first();
+    Issue issue = getIssueByKey(issueKey);
     return listTransitions(issue);
   }
 
@@ -258,17 +258,6 @@ public class OldIssueService implements IssueService {
     return rule;
   }
 
-  public IssueQueryResult loadIssue(String issueKey) {
-    // TODO use IssueIndex for ACL
-    // TODO load DTO
-    IssueQueryResult result = finder.find(IssueQuery.builder().issueKeys(Arrays.asList(issueKey)).requiredRole(UserRole.USER).build());
-    if (result.issues().size() != 1) {
-      // TODO throw 404
-      throw new IllegalArgumentException("Issue not found: " + issueKey);
-    }
-    return result;
-  }
-
   public List<String> listStatus() {
     return workflow.statusKeys();
   }
@@ -298,4 +287,24 @@ public class OldIssueService implements IssueService {
     return aggregation;
   }
 
+  public IssueQueryResult loadIssue(String issueKey) {
+    // TODO use IssueIndex for ACL
+    // TODO load DTO
+    IssueQueryResult result = finder.find(IssueQuery.builder().issueKeys(Arrays.asList(issueKey)).requiredRole(UserRole.USER).build());
+    if (result.issues().size() != 1) {
+      // TODO throw 404
+      throw new IllegalArgumentException("Issue not found: " + issueKey);
+    }
+    return result;
+  }
+
+  @Override
+  public DefaultIssue getIssueByKey(DbSession session, String key) {
+    return (DefaultIssue) loadIssue(key).first();
+  }
+
+  @Override
+  public DefaultIssue getIssueByKey(String key) {
+    return (DefaultIssue) loadIssue(key).first();
+  }
 }
index b1531d12cd34150993ffe77d8b4e296e497c494f..ebeb8da2aa5337c40897a75aa557c3a745935b44 100644 (file)
  */
 package org.sonar.server.issue.ws;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
 import com.google.common.io.Resources;
-import org.sonar.api.component.Component;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.ActionPlan;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.IssueComment;
-import org.sonar.api.issue.IssueFinder;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.IssueQueryResult;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.FieldDiffs;
 import org.sonar.api.server.debt.DebtCharacteristic;
@@ -39,42 +33,59 @@ import org.sonar.api.server.ws.RequestHandler;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.api.user.User;
+import org.sonar.api.user.UserFinder;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
 import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
+import org.sonar.core.persistence.DbSession;
 import org.sonar.markdown.Markdown;
+import org.sonar.server.db.DbClient;
 import org.sonar.server.debt.DebtModelService;
-import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.issue.IssueChangelog;
 import org.sonar.server.issue.IssueChangelogService;
+import org.sonar.server.issue.IssueService;
+import org.sonar.server.issue.actionplan.ActionPlanService;
+import org.sonar.server.rule.Rule;
+import org.sonar.server.rule.RuleService;
 import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
-import java.util.Arrays;
+
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Maps.newHashMap;
 
 public class IssueShowAction implements RequestHandler {
 
   public static final String SHOW_ACTION = "show";
 
-  private final IssueFinder issueFinder;
+  private final DbClient dbClient;
+
+  private final IssueService issueService;
   private final IssueChangelogService issueChangelogService;
   private final IssueActionsWriter actionsWriter;
+  private final ActionPlanService actionPlanService;
+  private final UserFinder userFinder;
   private final DebtModelService debtModel;
+  private final RuleService ruleService;
   private final I18n i18n;
   private final Durations durations;
 
-  public IssueShowAction(IssueFinder issueFinder, IssueChangelogService issueChangelogService, IssueActionsWriter actionsWriter,
-    DebtModelService debtModel, I18n i18n, Durations durations) {
-    this.issueFinder = issueFinder;
+  public IssueShowAction(DbClient dbClient, IssueService issueService, IssueChangelogService issueChangelogService, IssueActionsWriter actionsWriter,
+    ActionPlanService actionPlanService, UserFinder userFinder, DebtModelService debtModel, RuleService ruleService, I18n i18n, Durations durations) {
+    this.dbClient = dbClient;
+    this.issueService = issueService;
     this.issueChangelogService = issueChangelogService;
     this.actionsWriter = actionsWriter;
+    this.actionPlanService = actionPlanService;
+    this.userFinder = userFinder;
     this.debtModel = debtModel;
+    this.ruleService = ruleService;
     this.i18n = i18n;
     this.durations = durations;
   }
@@ -94,37 +105,39 @@ public class IssueShowAction implements RequestHandler {
   @Override
   public void handle(Request request, Response response) {
     String issueKey = request.mandatoryParam("key");
-    IssueQueryResult queryResult = issueFinder.find(IssueQuery.builder()
-      .requiredRole(UserRole.USER)
-      .issueKeys(Arrays.asList(issueKey)).build());
-    if (queryResult.issues().size() != 1) {
-      throw new NotFoundException("Issue not found: " + issueKey);
-    }
-    DefaultIssue issue = (DefaultIssue) queryResult.first();
 
     JsonWriter json = response.newJsonWriter();
     json.beginObject().name("issue").beginObject();
 
-    writeIssue(queryResult, issue, json);
-    actionsWriter.writeActions(issue, json);
-    actionsWriter.writeTransitions(issue, json);
-    writeComments(queryResult, issue, json);
-    writeChangelog(issue, json);
+    DbSession session = dbClient.openSession(false);
+    try {
+      DefaultIssue issue = issueService.getIssueByKey(session, issueKey);
+
+      writeIssue(session, issue, json);
+      actionsWriter.writeActions(issue, json);
+      actionsWriter.writeTransitions(issue, json);
+      writeComments(issue, json);
+      writeChangelog(issue, json);
+
+    } finally {
+      session.close();
+    }
 
     json.endObject().endObject().close();
   }
 
-  private void writeIssue(IssueQueryResult result, DefaultIssue issue, JsonWriter json) {
+  private void writeIssue(DbSession session, DefaultIssue issue, JsonWriter json) {
     String actionPlanKey = issue.actionPlanKey();
-    ActionPlan actionPlan = result.actionPlan(issue);
+    ActionPlan actionPlan = actionPlanService.findByKey(actionPlanKey, UserSession.get());
     Duration debt = issue.debt();
+    Rule rule = ruleService.getNonNullByKey(issue.ruleKey());
     Date updateDate = issue.updateDate();
     Date closeDate = issue.closeDate();
 
     json
       .prop("key", issue.key())
       .prop("rule", issue.ruleKey().toString())
-      .prop("ruleName", result.rule(issue).getName())
+      .prop("ruleName", rule.name())
       .prop("line", issue.line())
       .prop("message", issue.message())
       .prop("resolution", issue.resolution())
@@ -142,17 +155,17 @@ public class IssueShowAction implements RequestHandler {
       .prop("closeDate", closeDate != null ? DateUtils.formatDateTime(closeDate) : null)
       .prop("fCloseDate", formatDate(issue.closeDate()));
 
-    addComponents(result, issue, json);
-    addUserWithLabel(result, issue.assignee(), "assignee", json);
-    addUserWithLabel(result, issue.reporter(), "reporter", json);
-    addCharacteristics(result, issue, json);
+    addComponents(session, issue, json);
+    addUserWithLabel(issue.assignee(), "assignee", json);
+    addUserWithLabel(issue.reporter(), "reporter", json);
+    addCharacteristics(rule, json);
   }
 
-  private void addComponents(IssueQueryResult result, DefaultIssue issue, JsonWriter json) {
+  private void addComponents(DbSession session, DefaultIssue issue, JsonWriter json) {
     // component, module and project can be null if they were removed
-    ComponentDto component = (ComponentDto) result.component(issue);
-    ComponentDto subProject = (ComponentDto) getSubProject(result, component);
-    ComponentDto project = (ComponentDto) geProject(result, component);
+    ComponentDto component = dbClient.componentDao().getNullableByKey(session, issue.componentKey());
+    ComponentDto subProject = component != null ? dbClient.componentDao().getNullableById(component.subProjectId(), session) : null;
+    ComponentDto project = component != null ? dbClient.componentDao().getNullableById(component.projectId(), session) : null;
 
     String projectName = project != null ? project.longName() != null ? project.longName() : project.name() : null;
     // Do not display sub project long name if sub project and project are the same
@@ -168,12 +181,25 @@ public class IssueShowAction implements RequestHandler {
       .prop("subProjectName", subProjectName);
   }
 
-  private void writeComments(IssueQueryResult queryResult, Issue issue, JsonWriter json) {
+  private void writeComments(Issue issue, JsonWriter json) {
     json.name("comments").beginArray();
     String login = UserSession.get().login();
+
+    Map<String, User> usersByLogin = newHashMap();
+    for (IssueComment comment : issue.comments()) {
+      String userLogin = comment.userLogin();
+      User user = usersByLogin.get(userLogin);
+      if (user == null) {
+        user = userFinder.findByLogin(userLogin);
+        if (user != null) {
+          usersByLogin.put(userLogin, user);
+        }
+      }
+    }
+
     for (IssueComment comment : issue.comments()) {
       String userLogin = comment.userLogin();
-      User user = userLogin != null ? queryResult.user(userLogin) : null;
+      User user = usersByLogin.get(userLogin);
       json
         .beginObject()
         .prop("key", comment.key())
@@ -217,9 +243,9 @@ public class IssueShowAction implements RequestHandler {
     json.endArray();
   }
 
-  private static void addUserWithLabel(IssueQueryResult result, @Nullable String value, String field, JsonWriter json) {
+  private void addUserWithLabel(@Nullable String value, String field, JsonWriter json) {
     if (value != null) {
-      User user = result.user(value);
+      User user = userFinder.findByLogin(value);
       json
         .prop(field, value)
         .prop(field + "Name", user != null ? user.name() : null);
@@ -242,41 +268,8 @@ public class IssueShowAction implements RequestHandler {
     return null;
   }
 
-  /**
-   * Can be null on project or on removed component
-   */
-  @CheckForNull
-  private Component getSubProject(IssueQueryResult result, @Nullable final ComponentDto component) {
-    if (component != null) {
-      return Iterables.find(result.components(), new Predicate<Component>() {
-        @Override
-        public boolean apply(Component input) {
-          Long subProjectId = component.subProjectId();
-          return subProjectId != null && subProjectId.equals(((ComponentDto) input).getId());
-        }
-      }, null);
-    }
-    return null;
-  }
-
-  /**
-   * Can be null on removed component
-   */
-  @CheckForNull
-  private Component geProject(IssueQueryResult result, @Nullable final ComponentDto component) {
-    if (component != null) {
-      return Iterables.find(result.components(), new Predicate<Component>() {
-        @Override
-        public boolean apply(Component input) {
-          return component.projectId().equals(((ComponentDto) input).getId());
-        }
-      }, null);
-    }
-    return null;
-  }
-
-  private void addCharacteristics(IssueQueryResult result, DefaultIssue issue, JsonWriter json) {
-    String subCharacteristicKey = result.rule(issue).getCharacteristicKey() != null ? result.rule(issue).getCharacteristicKey() : result.rule(issue).getDefaultCharacteristicKey();
+  private void addCharacteristics(Rule rule, JsonWriter json) {
+    String subCharacteristicKey = rule.debtCharacteristicKey();
     DebtCharacteristic subCharacteristic = characteristicByKey(subCharacteristicKey);
     if (subCharacteristic != null) {
       json.prop("subCharacteristic", subCharacteristic.name());
index 85190eebe4e9bff89f41732f59a9dcfa8ee4a61f..74d54fc04152f2166eeb7611efbaaf7afe5c2f24 100644 (file)
@@ -25,21 +25,21 @@ import org.junit.Test;
 import org.sonar.api.component.Component;
 import org.sonar.api.config.Settings;
 import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.IssueQueryResult;
 import org.sonar.api.issue.action.Actions;
 import org.sonar.api.issue.action.Function;
 import org.sonar.api.issue.condition.Condition;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.core.issue.DefaultIssueQueryResult;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.core.issue.db.IssueStorage;
+import org.sonar.core.persistence.DbSession;
 import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collections;
 import java.util.List;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -51,7 +51,11 @@ import static org.mockito.Mockito.*;
 
 public class ActionServiceTest {
 
-  DefaultIssueFinder finder;
+  DbClient dbClient;
+  DbSession session;
+
+  ComponentDao componentDao;
+  IssueService issueService;
   IssueStorage issueStorage;
   IssueUpdater updater;
   PropertiesDao propertiesDao;
@@ -61,13 +65,19 @@ public class ActionServiceTest {
 
   @Before
   public void before() {
-    finder = mock(DefaultIssueFinder.class);
+    dbClient = mock(DbClient.class);
+    session = mock(DbSession.class);
+    when(dbClient.openSession(false)).thenReturn(session);
+
+    componentDao = mock(ComponentDao.class);
+    when(dbClient.componentDao()).thenReturn(componentDao);
+    issueService = mock(IssueService.class);
     issueStorage = mock(IssueStorage.class);
     updater = mock(IssueUpdater.class);
     propertiesDao = mock(PropertiesDao.class);
     settings = new Settings();
     actions = new Actions();
-    actionService = new ActionService(finder, issueStorage, updater, settings, propertiesDao, actions);
+    actionService = new ActionService(dbClient, issueService, issueStorage, updater, settings, propertiesDao, actions);
   }
 
   @Test
@@ -75,12 +85,9 @@ public class ActionServiceTest {
     Function function1 = mock(Function.class);
     Function function2 = mock(Function.class);
 
-    Issue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = mock(DefaultIssueQueryResult.class);
-    when(issueQueryResult.first()).thenReturn(issue);
-
-    when(issueQueryResult.project(issue)).thenReturn(mock(Component.class));
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function1, function2);
 
@@ -99,11 +106,8 @@ public class ActionServiceTest {
     when(userSession.login()).thenReturn("arthur");
 
     DefaultIssue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = mock(DefaultIssueQueryResult.class);
-    when(issueQueryResult.first()).thenReturn(issue);
-    when(issueQueryResult.project(issue)).thenReturn(mock(Component.class));
-
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function);
     assertThat(actionService.execute("ABCD", "link-to-jira", userSession)).isNotNull();
@@ -119,14 +123,9 @@ public class ActionServiceTest {
     UserSession userSession = mock(UserSession.class);
     when(userSession.login()).thenReturn("arthur");
 
-    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = mock(DefaultIssueQueryResult.class);
-    when(issueQueryResult.first()).thenReturn(issue);
-    Component project = mock(Component.class);
-    when(project.key()).thenReturn("struts");
-    when(issueQueryResult.project(issue)).thenReturn(project);
-
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD").setProjectKey("struts");
+    when(componentDao.getByKey(session, "struts")).thenReturn(new ComponentDto().setKey("struts"));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function);
     assertThat(actionService.execute("ABCD", "link-to-jira", userSession)).isNotNull();
@@ -134,30 +133,13 @@ public class ActionServiceTest {
     verify(propertiesDao).selectProjectProperties(eq("struts"));
   }
 
-  @Test
-  public void not_execute_function_if_issue_not_found() {
-    Function function = mock(Function.class);
-
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(Collections.<Issue>emptyList());
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
-
-    actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function);
-    try {
-      actionService.execute("ABCD", "link-to-jira", mock(UserSession.class));
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("No issue found");
-    }
-    verifyZeroInteractions(function);
-  }
-
   @Test
   public void not_execute_function_if_action_not_found() {
     Function function = mock(Function.class);
 
-    Issue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(newArrayList(issue));
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function);
     try {
@@ -173,9 +155,9 @@ public class ActionServiceTest {
   public void not_execute_function_if_action_is_not_supported() {
     Function function = mock(Function.class);
 
-    Issue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(newArrayList(issue));
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new NeverMatch()).setFunctions(function);
     try {
@@ -189,35 +171,20 @@ public class ActionServiceTest {
 
   @Test
   public void list_available_supported_actions() {
-    Issue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(newArrayList(issue));
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch());
     actions.add("tweet").setConditions(new NeverMatch());
     assertThat(actionService.listAvailableActions("ABCD")).hasSize(1);
   }
 
-  @Test
-  public void list_available_actions_throw_exception_if_issue_not_found() {
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(Collections.<Issue>emptyList());
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
-
-    actions.add("link-to-jira").setConditions(new AlwaysMatch());
-    actions.add("tweet").setConditions(new NeverMatch());
-    try {
-      actionService.listAvailableActions("ABCD");
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("No issue found");
-    }
-  }
-
   @Test
   public void return_no_action() {
-    Issue issue = new DefaultIssue().setKey("ABCD");
-    IssueQueryResult issueQueryResult = new DefaultIssueQueryResult(newArrayList(issue));
-    when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
+    DefaultIssue issue = new DefaultIssue().setKey("ABCD");
+    when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
+    when(issueService.getIssueByKey(session, "ABCD")).thenReturn(issue);
 
     assertThat(actionService.listAvailableActions("ABCD")).isEmpty();
   }
index 66a73144b72ddacff668be8de6616e9da1faf394..3379d6eaaf7e7816b0254896885c22009f5528d8 100644 (file)
@@ -26,36 +26,37 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.component.Component;
 import org.sonar.api.i18n.I18n;
-import org.sonar.api.issue.ActionPlan;
 import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueFinder;
-import org.sonar.api.issue.IssueQuery;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.DefaultIssueComment;
 import org.sonar.api.issue.internal.FieldDiffs;
 import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.Rule;
 import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
 import org.sonar.api.user.User;
+import org.sonar.api.user.UserFinder;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.issue.DefaultActionPlan;
-import org.sonar.core.issue.DefaultIssueQueryResult;
 import org.sonar.core.issue.workflow.Transition;
+import org.sonar.core.persistence.DbSession;
 import org.sonar.core.user.DefaultUser;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.db.DbClient;
 import org.sonar.server.debt.DebtModelService;
 import org.sonar.server.issue.ActionService;
 import org.sonar.server.issue.IssueChangelog;
 import org.sonar.server.issue.IssueChangelogService;
 import org.sonar.server.issue.IssueService;
+import org.sonar.server.issue.actionplan.ActionPlanService;
+import org.sonar.server.rule.Rule;
+import org.sonar.server.rule.RuleService;
 import org.sonar.server.user.MockUserSession;
+import org.sonar.server.user.UserSession;
 import org.sonar.server.ws.WsTester;
 
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
@@ -66,11 +67,20 @@ import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+/**
+ * TODO Should be replaced by medium tests, as there are too many dependencies
+ */
 @RunWith(MockitoJUnitRunner.class)
 public class IssueShowActionTest {
 
   @Mock
-  IssueFinder issueFinder;
+  DbClient dbClient;
+
+  @Mock
+  DbSession session;
+
+  @Mock
+  ComponentDao componentDao;
 
   @Mock
   IssueService issueService;
@@ -78,31 +88,42 @@ public class IssueShowActionTest {
   @Mock
   IssueChangelogService issueChangelogService;
 
+  @Mock
+  ActionPlanService actionPlanService;
+
   @Mock
   ActionService actionService;
 
+  @Mock
+  UserFinder userFinder;
+
   @Mock
   DebtModelService debtModel;
 
+  @Mock
+  RuleService ruleService;
+
   @Mock
   I18n i18n;
 
   @Mock
   Durations durations;
 
-  List<Issue> issues;
-  DefaultIssueQueryResult result;
-
   Date issueCreationDate;
 
+  Rule rule;
+
   WsTester tester;
 
   @Before
   public void setUp() throws Exception {
-    issues = new ArrayList<Issue>();
-    result = new DefaultIssueQueryResult(issues);
-    result.addRules(newArrayList(Rule.create("squid", "AvoidCycle").setName("Avoid cycle")));
-    when(issueFinder.find(any(IssueQuery.class))).thenReturn(result);
+    when(dbClient.openSession(false)).thenReturn(session);
+    when(dbClient.componentDao()).thenReturn(componentDao);
+
+    rule = mock(Rule.class);
+    when(rule.key()).thenReturn(RuleKey.of("squid", "AvoidCycle"));
+    when(rule.name()).thenReturn("Avoid cycle");
+    when(ruleService.getNonNullByKey(rule.key())).thenReturn(rule);
 
     when(issueChangelogService.changelog(any(Issue.class))).thenReturn(mock(IssueChangelog.class));
 
@@ -111,14 +132,16 @@ public class IssueShowActionTest {
 
     when(i18n.message(any(Locale.class), eq("created"), eq((String) null))).thenReturn("Created");
 
-    tester = new WsTester(new IssuesWs(new IssueShowAction(issueFinder, issueChangelogService, new IssueActionsWriter(issueService, actionService), debtModel, i18n, durations),
+    tester = new WsTester(new IssuesWs(
+      new IssueShowAction(dbClient, issueService, issueChangelogService,
+        new IssueActionsWriter(issueService, actionService), actionPlanService, userFinder, debtModel, ruleService, i18n, durations),
       mock(IssueSearchAction.class)));
   }
 
   @Test
   public void show_issue() throws Exception {
     String issueKey = "ABCD";
-    Issue issue = new DefaultIssue()
+    DefaultIssue issue = new DefaultIssue()
       .setKey(issueKey)
       .setComponentKey("org.sonar.server.issue.IssueClient")
       .setProjectKey("org.sonar.Sonar")
@@ -129,25 +152,25 @@ public class IssueShowActionTest {
       .setStatus("CLOSED")
       .setSeverity("MAJOR")
       .setCreationDate(issueCreationDate);
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issueKey)).thenReturn(issue);
 
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto file = new ComponentDto()
       .setId(10L)
       .setKey("org.sonar.server.issue.IssueClient")
       .setLongName("SonarQube :: Issue Client")
       .setName("SonarQube :: Issue Client")
       .setQualifier("FIL")
       .setSubProjectId(1L)
-      .setProjectId(1L)
-      ));
+      .setProjectId(1L);
+    when(componentDao.getNullableByKey(session, file.key())).thenReturn(file);
 
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto project = new ComponentDto()
       .setId(1L)
       .setKey("org.sonar.Sonar")
       .setLongName("SonarQube")
       .setName("SonarQube")
-      .setProjectId(1L)
-      ));
+      .setProjectId(1L);
+    when(componentDao.getNullableById(file.projectId(), session)).thenReturn(project);
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
@@ -157,7 +180,7 @@ public class IssueShowActionTest {
   @Test
   public void show_issue_with_sub_project() throws Exception {
     String issueKey = "ABCD";
-    Issue issue = new DefaultIssue()
+    DefaultIssue issue = new DefaultIssue()
       .setKey(issueKey)
       .setComponentKey("org.sonar.server.issue.IssueClient")
       .setProjectKey("org.sonar.Sonar")
@@ -168,31 +191,34 @@ public class IssueShowActionTest {
       .setStatus("CLOSED")
       .setSeverity("MAJOR")
       .setCreationDate(issueCreationDate);
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issueKey)).thenReturn(issue);
 
     // File
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto file = new ComponentDto()
       .setId(10L)
       .setKey("org.sonar.server.issue.IssueClient")
       .setLongName("SonarQube :: Issue Client")
       .setQualifier("FIL")
       .setSubProjectId(2L)
-      .setProjectId(1L)));
+      .setProjectId(1L);
+    when(componentDao.getNullableByKey(session, file.key())).thenReturn(file);
 
     // Module
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto module = new ComponentDto()
       .setId(2L)
       .setKey("org.sonar.server.Server")
       .setLongName("SonarQube :: Server")
       .setQualifier("BRC")
       .setSubProjectId(1L)
-      .setProjectId(1L)));
+      .setProjectId(1L);
+    when(componentDao.getNullableById(file.subProjectId(), session)).thenReturn(module);
 
     // Project
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto project = new ComponentDto()
       .setId(1L)
       .setKey("org.sonar.Sonar")
-      .setLongName("SonarQube")));
+      .setLongName("SonarQube");
+    when(componentDao.getNullableById(file.projectId(), session)).thenReturn(project);
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
@@ -202,7 +228,7 @@ public class IssueShowActionTest {
   @Test
   public void use_project_and_sub_project_names_if_no_long_name() throws Exception {
     String issueKey = "ABCD";
-    Issue issue = new DefaultIssue()
+    DefaultIssue issue = new DefaultIssue()
       .setKey(issueKey)
       .setComponentKey("org.sonar.server.issue.IssueClient")
       .setProjectKey("org.sonar.Sonar")
@@ -214,31 +240,34 @@ public class IssueShowActionTest {
       .setStatus("CLOSED")
       .setSeverity("MAJOR")
       .setCreationDate(issueCreationDate);
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issueKey)).thenReturn(issue);
 
     // File
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto file = new ComponentDto()
       .setId(10L)
       .setKey("org.sonar.server.issue.IssueClient")
       .setLongName("SonarQube :: Issue Client")
       .setQualifier("FIL")
       .setSubProjectId(2L)
-      .setProjectId(1L)));
+      .setProjectId(1L);
+    when(componentDao.getNullableByKey(session, file.key())).thenReturn(file);
 
     // Module
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto module = new ComponentDto()
       .setId(2L)
       .setKey("org.sonar.server.Server")
       .setName("SonarQube :: Server")
       .setQualifier("BRC")
       .setSubProjectId(1L)
-      .setProjectId(1L)));
+      .setProjectId(1L);
+    when(componentDao.getNullableById(file.subProjectId(), session)).thenReturn(module);
 
     // Project
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto project = new ComponentDto()
       .setId(1L)
       .setKey("org.sonar.Sonar")
-      .setName("SonarQube")));
+      .setName("SonarQube");
+    when(componentDao.getNullableById(file.projectId(), session)).thenReturn(project);
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
@@ -248,13 +277,13 @@ public class IssueShowActionTest {
   @Test
   public void show_issue_on_removed_component() throws Exception {
     String issueKey = "ABCD";
-    Issue issue = createIssue();
-    issues.add(issue);
+    DefaultIssue issue = createIssue();
+    when(issueService.getIssueByKey(session, issueKey)).thenReturn(issue);
 
-    Component project = mock(Component.class);
+    ComponentDto project = mock(ComponentDto.class);
     when(project.key()).thenReturn("org.sonar.Sonar");
     when(project.longName()).thenReturn("SonarQube");
-    result.addProjects(newArrayList(project));
+    when(componentDao.getNullableByKey(session, project.key())).thenReturn(project);
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
@@ -264,8 +293,8 @@ public class IssueShowActionTest {
   @Test
   public void show_issue_on_removed_project_and_component() throws Exception {
     String issueKey = "ABCD";
-    Issue issue = createIssue();
-    issues.add(issue);
+    DefaultIssue issue = createIssue();
+    when(issueService.getIssueByKey(session, issueKey)).thenReturn(issue);
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
@@ -274,11 +303,11 @@ public class IssueShowActionTest {
 
   @Test
   public void show_issue_with_action_plan() throws Exception {
-    Issue issue = createStandardIssue()
+    DefaultIssue issue = createStandardIssue()
       .setActionPlanKey("AP-ABCD");
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
-    result.addActionPlans(newArrayList((ActionPlan) new DefaultActionPlan().setKey("AP-ABCD").setName("Version 4.2")));
+    when(actionPlanService.findByKey(eq(issue.actionPlanKey()), any(UserSession.class))).thenReturn(new DefaultActionPlan().setKey("AP-ABCD").setName("Version 4.2"));
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
@@ -287,16 +316,14 @@ public class IssueShowActionTest {
 
   @Test
   public void show_issue_with_users() throws Exception {
-    Issue issue = createStandardIssue()
+    DefaultIssue issue = createStandardIssue()
       .setAssignee("john")
       .setReporter("steven")
       .setAuthorLogin("Henry");
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
-    result.addUsers(Lists.<User>newArrayList(
-      new DefaultUser().setLogin("john").setName("John"),
-      new DefaultUser().setLogin("steven").setName("Steven")
-      ));
+    when(userFinder.findByLogin("john")).thenReturn(new DefaultUser().setLogin("john").setName("John"));
+    when(userFinder.findByLogin("steven")).thenReturn(new DefaultUser().setLogin("steven").setName("Steven"));
 
     MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
@@ -306,8 +333,8 @@ public class IssueShowActionTest {
   @Test
   public void show_issue_with_technical_debt() throws Exception {
     Duration debt = (Duration.create(7260L));
-    Issue issue = createStandardIssue().setDebt(debt);
-    issues.add(issue);
+    DefaultIssue issue = createStandardIssue().setDebt(debt);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
     when(durations.encode(debt)).thenReturn("2h1min");
 
@@ -318,10 +345,10 @@ public class IssueShowActionTest {
 
   @Test
   public void show_issue_with_user_characteristics() throws Exception {
-    Issue issue = createStandardIssue().setDebt(Duration.create(7260L));
-    issues.add(issue);
+    DefaultIssue issue = createStandardIssue().setDebt(Duration.create(7260L));
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
-    result.rule(issue).setCharacteristicKey("K2");
+    when(rule.debtCharacteristicKey()).thenReturn("K2");
     when(debtModel.characteristicById(1)).thenReturn(new DefaultDebtCharacteristic().setKey("K1").setId(1).setName("Maintainability"));
     when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
     when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
@@ -333,10 +360,10 @@ public class IssueShowActionTest {
 
   @Test
   public void show_issue_with_default_characteristics() throws Exception {
-    Issue issue = createStandardIssue().setDebt(Duration.create(7260L));
-    issues.add(issue);
+    DefaultIssue issue = createStandardIssue().setDebt(Duration.create(7260L));
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
-    result.rule(issue).setDefaultCharacteristicKey("K2");
+    when(rule.debtCharacteristicKey()).thenReturn("K2");
     when(debtModel.characteristicById(1)).thenReturn(new DefaultDebtCharacteristic().setKey("K1").setId(1).setName("Maintainability"));
     when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
     when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
@@ -347,37 +374,17 @@ public class IssueShowActionTest {
     request.execute().assertJson(getClass(), "show_issue_with_characteristics.json");
   }
 
-  @Test
-  public void use_user_characteristic_if_both_characteristic_ids_are_defined() throws Exception {
-    Issue issue = createStandardIssue().setDebt(Duration.create(7260L));
-    issues.add(issue);
-
-    result.rule(issue).setCharacteristicKey("K2");
-    when(debtModel.characteristicById(1)).thenReturn(new DefaultDebtCharacteristic().setKey("K1").setId(1).setName("Maintainability"));
-    when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
-    when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
-
-    result.rule(issue).setDefaultCharacteristicKey("K20");
-    when(debtModel.characteristicById(10)).thenReturn(new DefaultDebtCharacteristic().setKey("K10").setId(10).setName("Default Maintainability"));
-    when(debtModel.characteristicById(20)).thenReturn(new DefaultDebtCharacteristic().setKey("K20").setId(20).setName("Default Readability").setParentId(10));
-    when(debtModel.characteristicByKey("K20")).thenReturn(new DefaultDebtCharacteristic().setKey("K20").setId(20).setName("Default Readability").setParentId(10));
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
-    request.execute().assertJson(getClass(), "show_issue_with_characteristics.json");
-  }
-
   @Test
   public void show_issue_with_dates() throws Exception {
     Date creationDate = DateUtils.parseDateTime("2014-01-22T19:10:03+0100");
     Date updateDate = DateUtils.parseDateTime("2014-01-23T19:10:03+0100");
     Date closedDate = DateUtils.parseDateTime("2014-01-24T19:10:03+0100");
 
-    Issue issue = createStandardIssue()
+    DefaultIssue issue = createStandardIssue()
       .setCreationDate(creationDate)
       .setUpdateDate(updateDate)
       .setCloseDate(closedDate);
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
     when(i18n.formatDateTime(any(Locale.class), eq(creationDate))).thenReturn("Jan 22, 2014 10:03 AM");
     when(i18n.formatDateTime(any(Locale.class), eq(updateDate))).thenReturn("Jan 23, 2014 10:03 AM");
@@ -394,7 +401,7 @@ public class IssueShowActionTest {
     Date date1 = DateUtils.parseDateTime("2014-02-22T19:10:03+0100");
     Date date2 = DateUtils.parseDateTime("2014-02-23T19:10:03+0100");
 
-    Issue issue = createStandardIssue()
+    DefaultIssue issue = createStandardIssue()
       .addComment(
         new DefaultIssueComment()
           .setKey("COMMENT-ABCD")
@@ -409,11 +416,10 @@ public class IssueShowActionTest {
           .setUserLogin("arthur")
           .setCreatedAt(date2)
       );
-    issues.add(issue);
-    result.addUsers(Lists.<User>newArrayList(
-      new DefaultUser().setLogin("john").setName("John"),
-      new DefaultUser().setLogin("arthur").setName("Arthur")
-      ));
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
+
+    when(userFinder.findByLogin("john")).thenReturn(new DefaultUser().setLogin("john").setName("John"));
+    when(userFinder.findByLogin("arthur")).thenReturn(new DefaultUser().setLogin("arthur").setName("Arthur"));
 
     when(i18n.ageFromNow(any(Locale.class), eq(date1))).thenReturn("9 days");
     when(i18n.ageFromNow(any(Locale.class), eq(date2))).thenReturn("10 days");
@@ -428,7 +434,7 @@ public class IssueShowActionTest {
     DefaultIssue issue = createStandardIssue()
       .setStatus("RESOLVED")
       .setResolution("FIXED");
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
     when(issueService.listTransitions(eq(issue))).thenReturn(newArrayList(Transition.create("reopen", "RESOLVED", "REOPEN")));
 
@@ -441,7 +447,7 @@ public class IssueShowActionTest {
   public void show_issue_with_actions() throws Exception {
     DefaultIssue issue = createStandardIssue()
       .setStatus("OPEN");
-    issues.add(issue);
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
     MockUserSession.set().setLogin("john");
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
@@ -450,8 +456,8 @@ public class IssueShowActionTest {
 
   @Test
   public void show_issue_with_changelog() throws Exception {
-    Issue issue = createStandardIssue();
-    issues.add(issue);
+    DefaultIssue issue = createStandardIssue();
+    when(issueService.getIssueByKey(session, issue.key())).thenReturn(issue);
 
     Date date1 = DateUtils.parseDateTime("2014-02-22T19:10:03+0100");
     Date date2 = DateUtils.parseDateTime("2014-02-23T19:10:03+0100");
@@ -493,21 +499,23 @@ public class IssueShowActionTest {
   }
 
   private void addComponentAndProject() {
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto file = new ComponentDto()
       .setId(10L)
       .setKey("org.sonar.server.issue.IssueClient")
       .setLongName("SonarQube :: Issue Client")
+      .setName("SonarQube :: Issue Client")
       .setQualifier("FIL")
       .setSubProjectId(1L)
-      .setProjectId(1L)
-      ));
+      .setProjectId(1L);
+    when(componentDao.getNullableByKey(session, file.key())).thenReturn(file);
 
-    result.addComponents(Lists.<Component>newArrayList(new ComponentDto()
+    ComponentDto project = new ComponentDto()
       .setId(1L)
       .setKey("org.sonar.Sonar")
       .setLongName("SonarQube")
-      .setProjectId(1L)
-      ));
+      .setName("SonarQube")
+      .setProjectId(1L);
+    when(componentDao.getNullableById(file.projectId(), session)).thenReturn(project);
   }
 
 }
index ff2fb0fea5a06ada878987d067ccbad451e01159..7f57e4b2d46ece19aadc399d355f68405cc20f28 100644 (file)
@@ -25,9 +25,14 @@ import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.IssueFinder;
 import org.sonar.api.server.ws.RailsHandler;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.api.user.UserFinder;
 import org.sonar.api.utils.Durations;
+import org.sonar.server.db.DbClient;
 import org.sonar.server.debt.DebtModelService;
 import org.sonar.server.issue.IssueChangelogService;
+import org.sonar.server.issue.IssueService;
+import org.sonar.server.issue.actionplan.ActionPlanService;
+import org.sonar.server.rule.RuleService;
 import org.sonar.server.ws.WsTester;
 
 import static org.fest.assertions.Assertions.assertThat;
@@ -50,7 +55,7 @@ public class IssuesWsTest {
     I18n i18n = mock(I18n.class);
     Durations durations = mock(Durations.class);
 
-    showAction = new IssueShowAction(issueFinder, issueChangelogService, actionsWriter, debtModelService, i18n, durations);
+    showAction = new IssueShowAction(mock(DbClient.class), mock(IssueService.class), issueChangelogService, actionsWriter, mock(ActionPlanService.class), mock(UserFinder.class), debtModelService, mock(RuleService.class), i18n, durations);
     searchAction = new IssueSearchAction(issueFinder, actionsWriter, i18n, durations);
     tester = new WsTester(new IssuesWs(showAction, searchAction));
   }