package com.constellio.app.modules.tasks.model.calculators;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.structures.TaskReminder;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.CalculatorParametersValidatingDependencies;
import com.constellio.sdk.tests.ConstellioTest;
public class TaskNextReminderOnCalculatorTest extends ConstellioTest {
@Mock
CalculatorParameters parameters;
TaskNextReminderOnCalculator calculator;
List<TaskReminder> reminders;
private LocalDate now = LocalDate.now();
LocalDate startDate = now;
LocalDate endDate = now.plusDays(3);
@Before
public void setUp()
throws Exception {
calculator = new TaskNextReminderOnCalculator();
givenTimeIs(now);
}
@Test
public void givenNullParametersOrEmptyRemindersWhenCalculatingThenReturnNull()
throws Exception {
startDate = null;
endDate = now;
reminders = new ArrayList<>();
assertThat(calculate()).isNull();
startDate = now;
endDate = null;
reminders = new ArrayList<>();
assertThat(calculate()).isNull();
startDate = now;
endDate = now;
reminders = null;
assertThat(calculate()).isNull();
startDate = now;
endDate = now;
reminders = new ArrayList<>();
assertThat(calculate()).isNull();
}
@Test
public void givenProcessedReminderWhenCalculatingThenReturnNull()
throws Exception {
reminders = new ArrayList<>();
TaskReminder fixedDateReminder = new TaskReminder().setFixedDate(now.plusDays(1))
.setProcessed(true);
reminders.add(fixedDateReminder);
assertThat(calculate()).isNull();
}
@Test
public void givenFixedDateReminderWhenCalculatingThenReturnFixedDate()
throws Exception {
reminders = new ArrayList<>();
TaskReminder fixedDateReminder = new TaskReminder().setFixedDate(now.plusDays(1));
reminders.add(fixedDateReminder);
assertThat(calculate()).isEqualTo(fixedDateReminder.getFixedDate());
}
@Test
public void givenReminderWithTodayDateAndReminderWithTomorrowDateWhenCalculatingThenReturnTodayDate()
throws Exception {
reminders = new ArrayList<>();
TaskReminder reminderWithTodayDate = new TaskReminder().setFixedDate(now);
reminders.add(reminderWithTodayDate);
TaskReminder reminderWithTomorrowDate = new TaskReminder().setFixedDate(now.plusDays(1));
reminders.add(reminderWithTomorrowDate);
assertThat(calculate()).isEqualTo(reminderWithTodayDate.getFixedDate());
}
@Test
public void givenProcessedReminderWithTodayDateAndReminderWithTomorrowDateWhenCalculatingThenReturnTomorrowDate()
throws Exception {
reminders = new ArrayList<>();
TaskReminder reminderWithTodayDate = new TaskReminder().setFixedDate(now)
.setProcessed(true);
reminders.add(reminderWithTodayDate);
TaskReminder reminderWithTomorrowDate = new TaskReminder().setFixedDate(now.plusDays(1));
reminders.add(reminderWithTomorrowDate);
assertThat(calculate()).isEqualTo(reminderWithTomorrowDate.getFixedDate());
}
@Test
public void givenReminderWithFlexibleDate2DaysAfterEndDateWhenCalculatingThenReturn2DaysAfterEndDate()
throws Exception {
reminders = new ArrayList<>();
TaskReminder taskReminder = new TaskReminder().setBeforeRelativeDate(false).setNumberOfDaysToRelativeDate(2)
.setRelativeDateMetadataCode(Task.DUE_DATE);
reminders.add(taskReminder);
assertThat(calculate()).isEqualTo(endDate.plusDays(2));
}
@Test
public void givenReminderWithFlexibleDate3BeforeStartDateWhenCalculatingThenReturn3DaysBeforeStartDate()
throws Exception {
reminders = new ArrayList<>();
TaskReminder taskReminder = new TaskReminder().setBeforeRelativeDate(true).setNumberOfDaysToRelativeDate(3)
.setRelativeDateMetadataCode(Task.START_DATE);
reminders.add(taskReminder);
assertThat(calculate()).isEqualTo(startDate.minusDays(3));
}
private LocalDate calculate() {
when(parameters.get(calculator.remindersLocalDependency)).thenReturn(reminders);
when(parameters.get(calculator.startDateLocalDependency)).thenReturn(startDate);
when(parameters.get(calculator.endDateLocalDependency)).thenReturn(endDate);
return calculator.calculate(new CalculatorParametersValidatingDependencies(parameters, calculator));
}
}