Browse Source

SONAR-4996 Update issue changelog debt to seconds (backend + display)

tags/4.3
Julien Lancelot 10 years ago
parent
commit
d2de9de08f

+ 30
- 37
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/technicaldebt/NewTechnicalDebtDecoratorTest.java View File

@@ -41,7 +41,6 @@ import org.sonar.api.measures.Measure;
import org.sonar.api.measures.Metric;
import org.sonar.api.resources.Resource;
import org.sonar.api.test.IsMeasure;
import org.sonar.api.utils.WorkDuration;
import org.sonar.api.utils.WorkDurationFactory;
import org.sonar.batch.components.Period;
import org.sonar.batch.components.TimeMachineConfiguration;
@@ -78,18 +77,16 @@ public class NewTechnicalDebtDecoratorTest {
Date fiveDaysAgo;
Date fourDaysAgo;

WorkDuration oneDaysWorkDuration = WorkDuration.createFromValueAndUnit(1, WorkDuration.UNIT.DAYS, 8);
WorkDuration twoDaysWorkDuration = WorkDuration.createFromValueAndUnit(2, WorkDuration.UNIT.DAYS, 8);
WorkDuration fiveDaysWorkDuration = WorkDuration.createFromValueAndUnit(5, WorkDuration.UNIT.DAYS, 8);
private static final int HOURS_IN_DAY = 8;

long oneDays = 1 * 8 * 60 * 60;
long twoDays = 2 * 8 * 60 * 60;
long fiveDays = 5 * 8 * 60 * 60;
long oneDay = 1 * HOURS_IN_DAY * 60 * 60L;
long twoDays = 2 * HOURS_IN_DAY * 60 * 60L;
long fiveDays = 5 * HOURS_IN_DAY * 60 * 60L;

@Before
public void setup() {
Settings settings = new Settings();
settings.setProperty(CoreProperties.HOURS_IN_DAY, "8");
settings.setProperty(CoreProperties.HOURS_IN_DAY, HOURS_IN_DAY);

ResourcePerspectives perspectives = mock(ResourcePerspectives.class);
when(perspectives.as(Issuable.class, resource)).thenReturn(issuable);
@@ -122,7 +119,7 @@ public class NewTechnicalDebtDecoratorTest {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(twoDays).setChanges(
newArrayList(
// changelog created at is null because it has just been created on the current analysis
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(null)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(null)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -137,8 +134,8 @@ public class NewTechnicalDebtDecoratorTest {
public void save_on_one_issue_with_changelog() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysWorkDuration), fromWorkDayDuration(fiveDaysWorkDuration)).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(fourDaysAgo)
new FieldDiffs().setDiff("technicalDebt", twoDays, fiveDays).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -151,10 +148,10 @@ public class NewTechnicalDebtDecoratorTest {

@Test
public void save_on_one_issue_with_changelog_only_in_the_past() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDays).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDay).setChanges(
newArrayList(
// Change before all periods
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(elevenDaysAgo)
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(elevenDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -169,9 +166,9 @@ public class NewTechnicalDebtDecoratorTest {
public void save_on_one_issue_with_changelog_having_null_value() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(fiveDaysWorkDuration)).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), null).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", null, fiveDays).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", oneDay, null).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -188,9 +185,9 @@ public class NewTechnicalDebtDecoratorTest {

Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(fiveDaysWorkDuration)).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), null).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", null, fiveDays).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", oneDay, null).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -207,7 +204,7 @@ public class NewTechnicalDebtDecoratorTest {
newArrayList(
new FieldDiffs()
.setDiff("actionPlan", "1.0", "1.1").setCreationDate(fourDaysAgo)
.setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(fourDaysAgo)
.setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -222,15 +219,15 @@ public class NewTechnicalDebtDecoratorTest {
public void save_on_issues_with_changelog() {
Issue issue1 = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysWorkDuration), fromWorkDayDuration(fiveDaysWorkDuration)).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", twoDays, fiveDays).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);
Issue issue2 = new DefaultIssue().setKey("B").setCreationDate(tenDaysAgo).setDebt(twoDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue1, issue2));
@@ -297,15 +294,15 @@ public class NewTechnicalDebtDecoratorTest {
// issue1 and issue2 have changelog
Issue issue1 = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysWorkDuration), fromWorkDayDuration(fiveDaysWorkDuration)).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", twoDays, fiveDays).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);
Issue issue2 = new DefaultIssue().setKey("B").setCreationDate(tenDaysAgo).setDebt(twoDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysWorkDuration), fromWorkDayDuration(twoDaysWorkDuration)).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);

@@ -338,10 +335,10 @@ public class NewTechnicalDebtDecoratorTest {
*/
@Test
public void not_return_negative_debt() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDays).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDay).setChanges(
newArrayList(
// changelog created at is null because it has just been created on the current analysis
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysWorkDuration), fromWorkDayDuration(oneDaysWorkDuration)).setCreationDate(null)
new FieldDiffs().setDiff("technicalDebt", twoDays, oneDay).setCreationDate(null)
)
);
when(issuable.issues()).thenReturn(newArrayList(issue));
@@ -352,11 +349,7 @@ public class NewTechnicalDebtDecoratorTest {
verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_TECHNICAL_DEBT, 0.0, 0.0)));
}

private Long fromWorkDayDuration(WorkDuration workDayDuration) {
return workDayDuration.toLong();
}


class IsVariationMeasure extends ArgumentMatcher<Measure> {
Metric metric = null;
Double var1 = null;

+ 2
- 2
sonar-batch/src/main/java/org/sonar/batch/debt/IssueChangelogDebtCalculator.java View File

@@ -123,7 +123,7 @@ public class IssueChangelogDebtCalculator implements BatchComponent {
if (entry.getKey().equals(IssueUpdater.TECHNICAL_DEBT)) {
Long newValue = entry.getValue().newValueLong();
if (newValue != null) {
return workDurationFactory.createFromWorkingLong(newValue);
return workDurationFactory.createFromSeconds(newValue);
}
}
}
@@ -136,7 +136,7 @@ public class IssueChangelogDebtCalculator implements BatchComponent {
if (entry.getKey().equals(IssueUpdater.TECHNICAL_DEBT)) {
Long value = entry.getValue().oldValueLong();
if (value != null) {
return workDurationFactory.createFromWorkingLong(value);
return workDurationFactory.createFromSeconds(value);
}
}
}

+ 19
- 26
sonar-batch/src/test/java/org/sonar/batch/debt/IssueChangelogDebtCalculatorTest.java View File

@@ -39,6 +39,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class IssueChangelogDebtCalculatorTest {

private static final int HOURS_IN_DAY = 8;

IssueChangelogDebtCalculator issueChangelogDebtCalculator;

Date rightNow = new Date();
@@ -48,13 +49,9 @@ public class IssueChangelogDebtCalculatorTest {
Date fiveDaysAgo = DateUtils.addDays(rightNow, -5);
Date fourDaysAgo = DateUtils.addDays(rightNow, -4);

WorkDuration oneDaysDebt = WorkDuration.createFromValueAndUnit(1, WorkDuration.UNIT.DAYS, HOURS_IN_DAY);
WorkDuration twoDaysDebt = WorkDuration.createFromValueAndUnit(2, WorkDuration.UNIT.DAYS, HOURS_IN_DAY);
WorkDuration fiveDaysDebt = WorkDuration.createFromValueAndUnit(5, WorkDuration.UNIT.DAYS, HOURS_IN_DAY);

Long oneDaysDebtInSec = 1 * HOURS_IN_DAY * 60 * 60L;
Long twoDaysDebtInSec = 2 * HOURS_IN_DAY * 60 * 60L;
Long fiveDaysDebtInSec = 5 * HOURS_IN_DAY * 60 * 60L;
long oneDay = 1 * HOURS_IN_DAY * 60 * 60L;
long twoDays = 2 * HOURS_IN_DAY * 60 * 60L;
long fiveDays = 5 * HOURS_IN_DAY * 60 * 60L;

@Before
public void setUp() throws Exception {
@@ -66,10 +63,10 @@ public class IssueChangelogDebtCalculatorTest {

@Test
public void calculate_new_technical_debt_with_one_diff_in_changelog() throws Exception {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(twoDaysDebtInSec).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(twoDays).setChanges(
newArrayList(
// changelog created at is null because it has just been created on the current analysis
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysDebt), fromWorkDayDuration(twoDaysDebt)).setCreationDate(null)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(null)
)
);

@@ -84,10 +81,10 @@ public class IssueChangelogDebtCalculatorTest {

@Test
public void calculate_new_technical_debt_with_many_diffs_in_changelog() throws Exception {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDaysDebtInSec).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysDebt), fromWorkDayDuration(fiveDaysDebt)).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysDebt), fromWorkDayDuration(twoDaysDebt)).setCreationDate(fourDaysAgo)
new FieldDiffs().setDiff("technicalDebt", twoDays, fiveDays).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo)
)
);

@@ -101,14 +98,14 @@ public class IssueChangelogDebtCalculatorTest {

@Test
public void changelog_can_be_in_wrong_order() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDaysDebtInSec).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(fiveDays).setChanges(
newArrayList(
// 3rd
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysDebt)).setCreationDate(nineDaysAgo),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo),
// 1st
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysDebt), fromWorkDayDuration(fiveDaysDebt)).setCreationDate(rightNow),
new FieldDiffs().setDiff("technicalDebt", twoDays, fiveDays).setCreationDate(rightNow),
// 2nd
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysDebt), fromWorkDayDuration(twoDaysDebt)).setCreationDate(fourDaysAgo)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(fourDaysAgo)
)
);

@@ -120,9 +117,9 @@ public class IssueChangelogDebtCalculatorTest {

@Test
public void calculate_new_technical_debt_with_null_date() throws Exception {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(twoDaysDebtInSec).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(twoDays).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysDebt), fromWorkDayDuration(twoDaysDebt)).setCreationDate(null)
new FieldDiffs().setDiff("technicalDebt", oneDay, twoDays).setCreationDate(null)
)
);

@@ -134,8 +131,8 @@ public class IssueChangelogDebtCalculatorTest {
public void calculate_new_technical_debt_when_new_debt_is_null() throws Exception {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(null).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(oneDaysDebt), null).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", null, fromWorkDayDuration(oneDaysDebt)).setCreationDate(nineDaysAgo)
new FieldDiffs().setDiff("technicalDebt", oneDay, null).setCreationDate(null),
new FieldDiffs().setDiff("technicalDebt", null, oneDay).setCreationDate(nineDaysAgo)
)
);

@@ -151,17 +148,13 @@ public class IssueChangelogDebtCalculatorTest {

@Test
public void not_return_negative_debt() {
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDaysDebtInSec).setChanges(
Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo).setDebt(oneDay).setChanges(
newArrayList(
new FieldDiffs().setDiff("technicalDebt", fromWorkDayDuration(twoDaysDebt), fromWorkDayDuration(oneDaysDebt)).setCreationDate(null)
new FieldDiffs().setDiff("technicalDebt", twoDays, oneDay).setCreationDate(null)
)
);

assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow)).isNull();
}

private Long fromWorkDayDuration(WorkDuration workDayDuration) {
return workDayDuration.toLong();
}

}

+ 1
- 10
sonar-core/src/main/java/org/sonar/core/issue/IssueUpdater.java View File

@@ -29,7 +29,6 @@ import org.sonar.api.issue.internal.DefaultIssue;
import org.sonar.api.issue.internal.DefaultIssueComment;
import org.sonar.api.issue.internal.IssueChangeContext;
import org.sonar.api.user.User;
import org.sonar.api.utils.WorkDurationFactory;

import javax.annotation.Nullable;
import java.util.Calendar;
@@ -49,12 +48,6 @@ public class IssueUpdater implements BatchComponent, ServerComponent {
public static final String ACTION_PLAN = "actionPlan";
public static final String TECHNICAL_DEBT = "technicalDebt";

private final WorkDurationFactory workDurationFactory;

public IssueUpdater(WorkDurationFactory workDurationFactory) {
this.workDurationFactory = workDurationFactory;
}

public boolean setSeverity(DefaultIssue issue, String severity, IssueChangeContext context) {
if (issue.manualSeverity()) {
throw new IllegalStateException("Severity can't be changed");
@@ -209,9 +202,7 @@ public class IssueUpdater implements BatchComponent, ServerComponent {
Long oldValue = issue.debt();
if (!Objects.equal(value, oldValue)) {
issue.setDebt(value);
Long oldValueInLong = oldValue != null ? workDurationFactory.createFromSeconds(oldValue).toLong() : null;
Long newValueInLong = value != null ? workDurationFactory.createFromSeconds(value).toLong() : null;
issue.setFieldChange(context, TECHNICAL_DEBT, oldValueInLong, newValueInLong);
issue.setFieldChange(context, TECHNICAL_DEBT, oldValue, value);
issue.setUpdateDate(context.date());
issue.setChanged(true);
return true;

+ 5
- 12
sonar-core/src/test/java/org/sonar/core/issue/IssueUpdaterTest.java View File

@@ -21,15 +21,11 @@ package org.sonar.core.issue;

import org.junit.Before;
import org.junit.Test;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.issue.ActionPlan;
import org.sonar.api.issue.internal.DefaultIssue;
import org.sonar.api.issue.internal.FieldDiffs;
import org.sonar.api.issue.internal.IssueChangeContext;
import org.sonar.api.user.User;
import org.sonar.api.utils.WorkDuration;
import org.sonar.api.utils.WorkDurationFactory;
import org.sonar.core.user.DefaultUser;

import java.util.Date;
@@ -46,10 +42,7 @@ public class IssueUpdaterTest {

@Before
public void setUp() throws Exception {
Settings settings = new Settings();
settings.setProperty(CoreProperties.HOURS_IN_DAY, 8);

updater = new IssueUpdater(new WorkDurationFactory(settings));
updater = new IssueUpdater();
}

@Test
@@ -388,8 +381,8 @@ public class IssueUpdaterTest {
assertThat(issue.mustSendNotifications()).isFalse();

FieldDiffs.Diff diff = issue.currentChange().get(TECHNICAL_DEBT);
assertThat(diff.oldValue()).isEqualTo(WorkDuration.createFromValueAndUnit(10, WorkDuration.UNIT.DAYS, 8).toLong());
assertThat(diff.newValue()).isEqualTo(WorkDuration.createFromValueAndUnit(15, WorkDuration.UNIT.DAYS, 8).toLong());
assertThat(diff.oldValue()).isEqualTo(previousDebt);
assertThat(diff.newValue()).isEqualTo(newDebt);
}

@Test
@@ -403,7 +396,7 @@ public class IssueUpdaterTest {

FieldDiffs.Diff diff = issue.currentChange().get(TECHNICAL_DEBT);
assertThat(diff.oldValue()).isNull();
assertThat(diff.newValue()).isEqualTo(WorkDuration.createFromValueAndUnit(15, WorkDuration.UNIT.DAYS, 8).toLong());
assertThat(diff.newValue()).isEqualTo(newDebt);
}

@Test
@@ -416,7 +409,7 @@ public class IssueUpdaterTest {
assertThat(issue.mustSendNotifications()).isFalse();

FieldDiffs.Diff diff = issue.currentChange().get(TECHNICAL_DEBT);
assertThat(diff.oldValue()).isEqualTo(WorkDuration.createFromValueAndUnit(10, WorkDuration.UNIT.DAYS, 8).toLong());
assertThat(diff.oldValue()).isEqualTo(previousDebt);
assertThat(diff.newValue()).isNull();
}


+ 1
- 1
sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java View File

@@ -42,7 +42,7 @@ import static org.mockito.Mockito.mock;

public class IssueWorkflowTest {

IssueUpdater updater = new IssueUpdater(null);
IssueUpdater updater = new IssueUpdater();
IssueWorkflow workflow = new IssueWorkflow(new FunctionExecutor(updater), updater);

@Test

+ 4
- 0
sonar-plugin-api/src/main/java/org/sonar/api/utils/WorkDurationFactory.java View File

@@ -36,6 +36,10 @@ public final class WorkDurationFactory implements BatchComponent, ServerComponen
this.settings = settings;
}

/**
* @deprecated since 4.3
*/
@Deprecated
public WorkDuration createFromWorkingValue(int value, WorkDuration.UNIT unit) {
return WorkDuration.createFromValueAndUnit(value, unit, hoursInDay());
}

+ 3
- 6
sonar-server/src/main/java/org/sonar/server/issue/IssueChangelogFormatter.java View File

@@ -21,7 +21,6 @@ package org.sonar.server.issue;

import org.sonar.api.ServerComponent;
import org.sonar.api.issue.internal.FieldDiffs;
import org.sonar.api.utils.WorkDurationFactory;
import org.sonar.core.i18n.DefaultI18n;
import org.sonar.core.issue.IssueUpdater;
import org.sonar.server.technicaldebt.DebtFormatter;
@@ -39,12 +38,10 @@ public class IssueChangelogFormatter implements ServerComponent {

private final DefaultI18n defaultI18n;
private final DebtFormatter debtFormatter;
private final WorkDurationFactory workDurationFactory;

public IssueChangelogFormatter(DefaultI18n defaultI18n, DebtFormatter debtFormatter, WorkDurationFactory workDurationFactory) {
public IssueChangelogFormatter(DefaultI18n defaultI18n, DebtFormatter debtFormatter) {
this.defaultI18n = defaultI18n;
this.debtFormatter = debtFormatter;
this.workDurationFactory = workDurationFactory;
}

public List<String> format(Locale locale, FieldDiffs diffs) {
@@ -76,10 +73,10 @@ public class IssueChangelogFormatter implements ServerComponent {
String oldValueString = oldValue != null && !"".equals(oldValue) ? oldValue.toString() : null;
if (IssueUpdater.TECHNICAL_DEBT.equals(key)) {
if (newValueString != null) {
newValueString = debtFormatter.formatWorkDuration(locale, workDurationFactory.createFromWorkingLong(Long.parseLong(newValueString)));
newValueString = debtFormatter.format(locale, Long.parseLong(newValueString));
}
if (oldValueString != null) {
oldValueString = debtFormatter.formatWorkDuration(locale, workDurationFactory.createFromWorkingLong(Long.parseLong(oldValueString)));
oldValueString = debtFormatter.format(locale, Long.parseLong(oldValueString));
}
}
return new IssueChangelogDiffFormat(oldValueString, newValueString);

+ 1
- 1
sonar-server/src/main/java/org/sonar/server/technicaldebt/DebtFormatter.java View File

@@ -41,7 +41,7 @@ public class DebtFormatter implements ServerComponent {
return formatWorkDuration(locale, workDurationFactory.createFromSeconds(debt));
}

public String formatWorkDuration(Locale locale, WorkDuration debt) {
private String formatWorkDuration(Locale locale, WorkDuration debt) {
StringBuilder message = new StringBuilder();
if (debt.days() > 0) {
message.append(defaultI18n.message(locale, "issue.technical_debt.x_days", null, debt.days()));

+ 3
- 6
sonar-server/src/main/webapp/WEB-INF/app/models/issue.rb View File

@@ -74,8 +74,8 @@ class Issue
hash_diff = {}
hash_diff[:key] = key
if key == 'technicalDebt'
hash_diff[:newValue] = work_duration_to_hash(Internal.technical_debt.toTechnicalDebt(diff.newValue())) if diff.newValue.present?
hash_diff[:oldValue] = work_duration_to_hash(Internal.technical_debt.toTechnicalDebt(diff.oldValue())) if diff.oldValue.present?
hash_diff[:newValue] = debt_to_hash(diff.newValue()) if diff.newValue.present?
hash_diff[:oldValue] = debt_to_hash(diff.oldValue()) if diff.oldValue.present?
else
hash_diff[:newValue] = diff.newValue() if diff.newValue.present?
hash_diff[:oldValue] = diff.oldValue() if diff.oldValue.present?
@@ -92,10 +92,7 @@ class Issue
private

def self.debt_to_hash(debt)
work_duration_to_hash(Internal.technical_debt.toWorkDuration(debt))
end

def self.work_duration_to_hash(work_duration)
work_duration = work_duration_to_hash(Internal.technical_debt.toWorkDuration(debt))
{
:days => work_duration.days(),
:hours => work_duration.hours(),

+ 6
- 12
sonar-server/src/test/java/org/sonar/server/issue/IssueChangelogFormatterTest.java View File

@@ -24,11 +24,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.issue.internal.FieldDiffs;
import org.sonar.api.utils.WorkDuration;
import org.sonar.api.utils.WorkDurationFactory;
import org.sonar.core.i18n.DefaultI18n;
import org.sonar.server.technicaldebt.DebtFormatter;

@@ -55,9 +51,7 @@ public class IssueChangelogFormatterTest {

@Before
public void before() {
Settings settings = new Settings();
settings.setProperty(CoreProperties.HOURS_IN_DAY, HOURS_IN_DAY);
formatter = new IssueChangelogFormatter(i18n, debtFormatter, new WorkDurationFactory(settings));
formatter = new IssueChangelogFormatter(i18n, debtFormatter);
}

@Test
@@ -135,10 +129,10 @@ public class IssueChangelogFormatterTest {
@Test
public void format_technical_debt_with_old_and_new_value() {
FieldDiffs diffs = new FieldDiffs();
diffs.setDiff("technicalDebt", "500", "10000");
diffs.setDiff("technicalDebt", "18000", "28800");

when(debtFormatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(5, WorkDuration.UNIT.HOURS, HOURS_IN_DAY))).thenReturn("5 hours");
when(debtFormatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(1, WorkDuration.UNIT.DAYS, HOURS_IN_DAY))).thenReturn("1 days");
when(debtFormatter.format(DEFAULT_LOCALE, 18000)).thenReturn("5 hours");
when(debtFormatter.format(DEFAULT_LOCALE, 28800)).thenReturn("1 days");

when(i18n.message(DEFAULT_LOCALE, "issue.changelog.field.technicalDebt", null)).thenReturn("Technical Debt");
when(i18n.message(DEFAULT_LOCALE, "issue.changelog.changed_to", null, "Technical Debt", "1 days")).thenReturn("Technical Debt changed to 1 days");
@@ -153,9 +147,9 @@ public class IssueChangelogFormatterTest {
@Test
public void format_technical_debt_with_new_value_only() {
FieldDiffs diffs = new FieldDiffs();
diffs.setDiff("technicalDebt", null, "10000");
diffs.setDiff("technicalDebt", null, "28800");

when(debtFormatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(1, WorkDuration.UNIT.DAYS, 8))).thenReturn("1 days");
when(debtFormatter.format(DEFAULT_LOCALE, 28800)).thenReturn("1 days");

when(i18n.message(DEFAULT_LOCALE, "issue.changelog.field.technicalDebt", null)).thenReturn("Technical Debt");
when(i18n.message(DEFAULT_LOCALE, "issue.changelog.changed_to", null, "Technical Debt", "1 days")).thenReturn("Technical Debt changed to 1 days");

+ 0
- 12
sonar-server/src/test/java/org/sonar/server/technicaldebt/DebtFormatterTest.java View File

@@ -24,7 +24,6 @@ import org.junit.Before;
import org.junit.Test;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.utils.WorkDuration;
import org.sonar.api.utils.WorkDurationFactory;
import org.sonar.core.i18n.DefaultI18n;

@@ -73,15 +72,4 @@ public class DebtFormatterTest {
assertThat(formatter.format(DEFAULT_LOCALE, 5 * ONE_DAY + 2 * ONE_HOUR + ONE_MINUTE)).isEqualTo("5 days 2 hours");
}

@Test
public void format_work_duration() {
assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(5, WorkDuration.UNIT.DAYS, HOURS_IN_DAY))).isEqualTo("5 days");
assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(2, WorkDuration.UNIT.HOURS, HOURS_IN_DAY))).isEqualTo("2 hours");
assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.createFromValueAndUnit(1, WorkDuration.UNIT.MINUTES, HOURS_IN_DAY))).isEqualTo("1 minutes");

assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.create(5, 2, 0, HOURS_IN_DAY))).isEqualTo("5 days 2 hours");
assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.create(0, 2, 1, HOURS_IN_DAY))).isEqualTo("2 hours 1 minutes");
assertThat(formatter.formatWorkDuration(DEFAULT_LOCALE, WorkDuration.create(5, 2, 10, HOURS_IN_DAY))).isEqualTo("5 days 2 hours");
}

}

Loading…
Cancel
Save