package com.constellio.sdk.tests;
import static org.assertj.core.api.Assertions.assertThat;
import org.joda.time.DateMidnight;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.Seconds;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.constellio.data.utils.TimeProvider;
//Order is important to test this test mecanism
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TimeProviderTest extends ConstellioTest {
LocalDate nowDate;
LocalDateTime nowDateTime;
LocalDateTime tenYearsBeforeDateTime = new LocalDateTime().minusYears(10);
LocalDate tenYearsBeforeDate = new LocalDate().minusYears(10);
LocalDateTime tenYearsBeforeMidnightDateTime = new DateMidnight().toDateTime().toLocalDateTime().minusYears(10);
LocalDateTime fiveYearsBeforeDateTime = new LocalDateTime().minusYears(5);
LocalDate fiveYearsBeforeDate = new LocalDate().minusYears(5);
LocalDateTime fiveYearsBeforeMidnightDateTime = new DateMidnight().toDateTime().toLocalDateTime().minusYears(5);
@BeforeClass
public static void printSystemTime() {
}
@Before
public void setUp()
throws Exception {
nowDate = new LocalDate();
nowDateTime = new LocalDateTime();
}
@Test
public void test1_givenNoFixedTimeThenWorkNormally() {
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), nowDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(nowDate);
}
@Test
public void test2_givenFixedDateTimeThenDateTimeIsFixed() {
givenTimeIs(tenYearsBeforeDateTime);
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), tenYearsBeforeDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(tenYearsBeforeDate);
}
@Test
public void test2_givenFixedDateThenDateIsFixed() {
givenTimeIs(tenYearsBeforeDate);
assertThat(TimeProvider.getLocalDate()).isEqualTo(tenYearsBeforeDate);
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), tenYearsBeforeMidnightDateTime);
}
@Test
public void test4_givenNoFixedTimeThenNowWorkNormally() {
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), nowDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(nowDate);
}
@Test
public void test5_givenFixedChangeDuringTestThenCorrectTimes() {
givenTimeIs(tenYearsBeforeDateTime);
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), tenYearsBeforeDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(tenYearsBeforeDate);
givenTimeIs(fiveYearsBeforeDate);
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), fiveYearsBeforeMidnightDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(fiveYearsBeforeDate);
givenActualTime();
assertTimeEqualOrNearEqual(TimeProvider.getLocalDateTime(), nowDateTime);
assertThat(TimeProvider.getLocalDate()).isEqualTo(nowDate);
}
private void assertTimeEqualOrNearEqual(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
int second = Math.abs(Seconds.secondsBetween(localDateTime1, localDateTime2).getSeconds());
assertThat(second <= 10).isTrue();
}
}