package com.constellio.app.modules.rm.model.calculators;
import static java.util.Arrays.asList;
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.doReturn;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
import org.joda.time.LocalDate;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Spy;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.CopyRetentionRuleBuilder;
import com.constellio.app.modules.rm.model.enums.FolderStatus;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.CalculatorParametersValidatingDependencies;
import com.constellio.model.entities.calculators.DynamicDependencyValues;
import com.constellio.sdk.tests.ConstellioTest;
public class FolderCopyRulesExpectedTransferDatesCalculatorTest extends ConstellioTest {
@Mock DynamicDependencyValues dynamicDependencyValues;
@Spy FolderCopyRulesExpectedTransferDatesCalculator calculator;
@Mock CalculatorParameters params;
LocalDate actualTransferDate, decommissioningDate;
int configNumberOfYearWhenVariableDelay = 666;
List<CopyRetentionRule> applicableCopyRules;
int confiRequiredDaysBeforeYearEnd;
String configYearEnd;
FolderStatus status = null;
boolean calculatedMetadatasBasedOnFirstTimerangePartParam = true;
CopyRetentionRuleBuilder copyBuilder = CopyRetentionRuleBuilder.UUID();
@Test
public void givenMultipleApplicableCopyRulesThenCalculateDateForEachAndReturnEndOFYearDates()
throws Exception {
CopyRetentionRule copyRule1 = copy("3-2-D");
CopyRetentionRule copyRule2 = copy("5-2-T");
CopyRetentionRule copyRule3 = copy("1-0-D");
CopyRetentionRule copyRule4 = copy("3-2-C");
LocalDate copyRule1Result = new LocalDate(2013, 1, 1);
LocalDate copyRule2Result = new LocalDate(2013, 3, 5);
LocalDate copyRule3Result = new LocalDate(2011, 3, 31);
LocalDate copyRule4Result = null;
confiRequiredDaysBeforeYearEnd = 30;
configYearEnd = "03/31";
applicableCopyRules = Arrays.asList(copyRule1, copyRule2, copyRule3, copyRule4);
doReturn(copyRule1Result).when(calculator).calculateForCopyRule(eq(0), eq(copyRule1), any(CalculatorParameters.class));
doReturn(copyRule2Result).when(calculator).calculateForCopyRule(eq(1), eq(copyRule2), any(CalculatorParameters.class));
doReturn(copyRule3Result).when(calculator).calculateForCopyRule(eq(2), eq(copyRule3), any(CalculatorParameters.class));
doReturn(copyRule4Result).when(calculator).calculateForCopyRule(eq(3), eq(copyRule4), any(CalculatorParameters.class));
assertThat(calculate())
.containsExactly(new LocalDate(2013, 3, 31), new LocalDate(2014, 3, 31), new LocalDate(2011, 3, 31), null);
}
@Test
public void whenCalculatingFolderWithNoDecommissioningDateThenReturnNull()
throws Exception {
assertThat(calculateFor(4, copy("5-5-C"))).isNull();
}
@Test
public void whenCalculatingFolderWithActualTransferDateThenReturnNull()
throws Exception {
actualTransferDate = new LocalDate(2013, 1, 1);
assertThat(calculateFor(4, copy("5-5-C"))).isNull();
}
@Test
public void whenCalculatingFolderWithFixedPeriodThenIncrementByActivePeriod()
throws Exception {
configNumberOfYearWhenVariableDelay = 666;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("3-5-C"))).isEqualTo(new LocalDate(2015, 1, 15));
}
@Test
public void givenNoCalculatioOfVariablePeriodWhenCalculatingFolderWithFixedPeriodThenIncrementByActivePeriod()
throws Exception {
configNumberOfYearWhenVariableDelay = -1;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("4-6-C"))).isEqualTo(new LocalDate(2016, 1, 15));
}
@Test
public void givenInactiveFolderWithoutActualTransferDateThenNoTransferDateCalculated()
throws Exception {
status = FolderStatus.INACTIVE_DEPOSITED;
configNumberOfYearWhenVariableDelay = -1;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("4-6-C"))).isNull();
}
@Test
public void givenNoCalculatioOfVariablePeriodWhenCalculatingFolderWithVariablePeriodThenReturnNull()
throws Exception {
configNumberOfYearWhenVariableDelay = -1;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("888-5-C"))).isNull();
}
@Test
public void whenCalculatingFolderWithVariablePeriodThenReturnNull()
throws Exception {
configNumberOfYearWhenVariableDelay = 2;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("999-5-C"))).isEqualTo(new LocalDate(2014, 1, 15));
}
@Test
public void givenFixedYearOfZeroOnVariablePeriodsWhenCalculatingFolderWithVariablePeriodThenReturnNull()
throws Exception {
configNumberOfYearWhenVariableDelay = 0;
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("888-5-C"))).isEqualTo(new LocalDate(2012, 1, 15));
}
@Test
public void givenFixedValueOfZeroForSemiActivePeriodWhenCalculatingExpectedTransferDateThenReturnNull()
throws Exception {
decommissioningDate = new LocalDate(2012, 1, 15);
assertThat(calculateFor(4, copy("888-0-C"))).isNull();
}
private CopyRetentionRule copy(String delays) {
return copyBuilder.newPrincipal(asList("PA", "MD"), delays);
}
private LocalDate calculateFor(int index, CopyRetentionRule copy) {
if (status == null) {
status = actualTransferDate == null ? FolderStatus.ACTIVE : FolderStatus.SEMI_ACTIVE;
}
when(params.get(calculator.statusParam)).thenReturn(status);
when(params.get(calculator.actualTransferDateParam)).thenReturn(actualTransferDate);
when(params.get(calculator.configNumberOfYearWhenVariableDelayPeriodParam))
.thenReturn(configNumberOfYearWhenVariableDelay);
when(params.get(calculator.decommissioningDateParam)).thenReturn(decommissioningDate);
when(params.get(calculator.datesAndDateTimesParam)).thenReturn(dynamicDependencyValues);
when(params.get(calculator.calculatedMetadatasBasedOnFirstTimerangePartParam))
.thenReturn(calculatedMetadatasBasedOnFirstTimerangePartParam);
when(params.get(calculator.configAddYearIfCalculationDateIsEndOfYearParam)).thenReturn(true);
return calculator.calculateForCopyRule(index, copy, new CalculatorParametersValidatingDependencies(params, calculator));
}
private List<LocalDate> calculate() {
FolderStatus status = actualTransferDate == null ? FolderStatus.ACTIVE : FolderStatus.SEMI_ACTIVE;
when(params.get(calculator.statusParam)).thenReturn(status);
when(params.get(calculator.actualTransferDateParam)).thenReturn(actualTransferDate);
when(params.get(calculator.applicableCopyRulesParam)).thenReturn(applicableCopyRules);
when(params.get(calculator.configNumberOfYearWhenVariableDelayPeriodParam))
.thenReturn(configNumberOfYearWhenVariableDelay);
when(params.get(calculator.decommissioningDateParam)).thenReturn(decommissioningDate);
when(params.get(calculator.configYearEndParam)).thenReturn(configYearEnd);
when(params.get(calculator.configRequiredDaysBeforeYearEndParam)).thenReturn(confiRequiredDaysBeforeYearEnd);
when(params.get(calculator.datesAndDateTimesParam)).thenReturn(dynamicDependencyValues);
when(params.get(calculator.calculatedMetadatasBasedOnFirstTimerangePartParam))
.thenReturn(calculatedMetadatasBasedOnFirstTimerangePartParam);
when(params.get(calculator.configAddYearIfCalculationDateIsEndOfYearParam)).thenReturn(true);
return calculator.calculate(new CalculatorParametersValidatingDependencies(params, calculator));
}
}