import org.sonar.api.issue.*;
import org.sonar.api.issue.action.Action;
import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.issue.internal.WorkDayDuration;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.RequestHandler;
import org.sonar.api.server.ws.Response;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.issue.ActionService;
import org.sonar.server.issue.IssueService;
+import org.sonar.server.technicaldebt.InternalRubyTechnicalDebtService;
import org.sonar.server.user.UserSession;
import java.util.Arrays;
private final IssueFinder issueFinder;
private final IssueService issueService;
private final ActionService actionService;
+ private final InternalRubyTechnicalDebtService technicalDebtService;
- public IssueShowWsHandler(IssueFinder issueFinder, IssueService issueService, ActionService actionService) {
+ public IssueShowWsHandler(IssueFinder issueFinder, IssueService issueService, ActionService actionService, InternalRubyTechnicalDebtService technicalDebtService) {
this.issueFinder = issueFinder;
this.issueService = issueService;
this.actionService = actionService;
+ this.technicalDebtService = technicalDebtService;
}
@Override
}
private void writeIssue(IssueQueryResult result, DefaultIssue issue, JsonWriter json) {
+ WorkDayDuration technicalDebt = issue.technicalDebt();
+ String techDebtLabel = technicalDebt != null ? technicalDebtService.format(technicalDebt) : null;
+
json
.prop("key", issue.key())
.prop("component", issue.componentKey())
.prop("project", result.project(issue).key())
.prop("rule", issue.ruleKey().toString())
.prop("line", issue.line())
- // TODO
-// .prop("technicalDebt", effortToFix)
+ .prop("technicalDebt", techDebtLabel)
.prop("message", issue.message())
.prop("resolution", issue.resolution())
.prop("status", issue.status())
.prop("userLogin", userLogin)
.prop("userName", userLogin != null ? queryResult.user(userLogin).name() : null)
// TODO convert markdown to HTML
+ // TODO add date
.endObject();
}
json.endArray();
import org.sonar.api.issue.action.Action;
import org.sonar.api.issue.internal.DefaultIssue;
import org.sonar.api.issue.internal.DefaultIssueComment;
+import org.sonar.api.issue.internal.WorkDayDuration;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.server.ws.SimpleRequest;
import org.sonar.api.user.User;
import org.sonar.core.user.DefaultUser;
import org.sonar.server.issue.ActionService;
import org.sonar.server.issue.IssueService;
+import org.sonar.server.technicaldebt.InternalRubyTechnicalDebtService;
import org.sonar.server.user.MockUserSession;
import org.sonar.server.user.UserSession;
import org.sonar.server.ws.WsTester;
@Mock
ActionService actionService;
+ @Mock
+ InternalRubyTechnicalDebtService technicalDebtService;
+
List<Issue> issues;
DefaultIssueQueryResult result;
result.addProjects(newArrayList(component));
when(issueFinder.find(any(IssueQuery.class))).thenReturn(result);
- tester = new WsTester(new IssuesWs(new IssueShowWsHandler(issueFinder, issueService, actionService)));
+ tester = new WsTester(new IssuesWs(new IssueShowWsHandler(issueFinder, issueService, actionService, technicalDebtService)));
}
@Test
tester.execute("show", request).assertJson(getClass(), "show_issue.json");
}
+ @Test
+ public void show_issue_with_technical_debt() throws Exception {
+ String issueKey = "ABCD";
+ WorkDayDuration technicalDebt = WorkDayDuration.of(1, 2, 0);
+ Issue issue = new DefaultIssue()
+ .setKey(issueKey)
+ .setComponentKey("org.sonar.server.issue.IssueClient")
+ .setProjectKey("org.sonar.Sonar")
+ .setRuleKey(RuleKey.of("squid", "AvoidCycle"))
+ .setTechnicalDebt(technicalDebt);
+ issues.add(issue);
+
+ when(technicalDebtService.format(technicalDebt)).thenReturn("2 hours 1 minutes");
+
+ MockUserSession.set();
+ SimpleRequest request = new SimpleRequest().setParam("key", issueKey);
+ tester.execute("show", request).assertJson(getClass(), "show_issue_with_technical_debt.json");
+ }
+
@Test
public void show_issue_with_comments() throws Exception {
String issueKey = "ABCD";