package de.asideas.crowdsource.service.statistics;
import de.asideas.crowdsource.domain.model.ProjectEntity;
import de.asideas.crowdsource.presentation.project.Project;
import de.asideas.crowdsource.presentation.statistics.requests.TimeRangedStatisticsRequest;
import de.asideas.crowdsource.presentation.statistics.results.LineChartStatisticsResult;
import de.asideas.crowdsource.repository.ProjectRepository;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.*;
import java.util.concurrent.Future;
import static de.asideas.crowdsource.domain.shared.StatisticsTypes.SUM_CREATED_PROJECT;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class CreatedProjectSumActionTest {
@InjectMocks
private CreatedProjectSumAction instance;
@Mock
private ProjectRepository projectRepository;
private List<ProjectEntity> projectEntityList;
@Before
public void setUp() throws Exception {
projectEntityList = new ArrayList<>();
for(int i = 0; i < 10; i++) {
ProjectEntity entity = new ProjectEntity();
entity.setCreatedDate(DateTime.now().minusDays(i));
projectEntityList.add(entity);
}
when(projectRepository.findByCreatedDateBetween(any(DateTime.class), any(DateTime.class))).thenReturn(projectEntityList);
}
@Test
public void getCreatedProjectSumByTimeRange_provide_correct_name_of_statistic() throws Exception {
final DateTime startDate = DateTime.now().minusDays(10);
final DateTime endDate = DateTime.now();
Future<LineChartStatisticsResult> result = instance.getCreatedProjectSumByTimeRange(new TimeRangedStatisticsRequest(startDate, endDate));
verify(projectRepository).findByCreatedDateBetween(startDate.withTimeAtStartOfDay(), endDate.plusDays(1).withTimeAtStartOfDay());
assertThat(result.get().getName(), is(SUM_CREATED_PROJECT.getDisplayName()));
}
@Test
public void getCreatedProjectSumByTimeRange_provide_correct_sum_all() throws Exception {
final DateTime startDate = DateTime.now().minusDays(9);
final DateTime endDate = DateTime.now();
Future<LineChartStatisticsResult> result = instance.getCreatedProjectSumByTimeRange(new TimeRangedStatisticsRequest(startDate, endDate));
verify(projectRepository).findByCreatedDateBetween(startDate.withTimeAtStartOfDay(), endDate.plusDays(1).withTimeAtStartOfDay());
assertThat(result.get().getData().size(), is(10));
assertThat(result.get().getData().stream().map(e -> e.getData()).reduce(0L, Long::sum), is(10L));
}
@Test
public void getCreatedProjectSumByTimeRange_provide_correct_sum_empty() throws Exception {
final DateTime startDate = DateTime.now().minusDays(20);
final DateTime endDate = DateTime.now().minusDays(11);
when(projectRepository.findByCreatedDateBetween(eq(startDate.withTimeAtStartOfDay()), eq(endDate.plusDays(1).withTimeAtStartOfDay()))).thenReturn(Collections.emptyList());
Future<LineChartStatisticsResult> result = instance.getCreatedProjectSumByTimeRange(new TimeRangedStatisticsRequest(startDate, endDate));
verify(projectRepository).findByCreatedDateBetween(startDate.withTimeAtStartOfDay(), endDate.plusDays(1).withTimeAtStartOfDay());
assertThat(result.get().getData().stream().map(e -> e.getData()).reduce(0L, Long::sum), is(0L));
}
@Test
public void getCreatedProjectSumByTimeRange_provide_correct_sum_on_same_day() throws Exception {
final DateTime startDate = DateTime.now().minusDays(1);
ProjectEntity entity = new ProjectEntity();
entity.setCreatedDate(DateTime.now().minusDays(1));
when(projectRepository.findByCreatedDateBetween(eq(startDate.withTimeAtStartOfDay()), any(DateTime.class))).thenReturn(Arrays.asList(entity, entity, entity));
Future<LineChartStatisticsResult> result = instance.getCreatedProjectSumByTimeRange(new TimeRangedStatisticsRequest(startDate, startDate));
verify(projectRepository).findByCreatedDateBetween(startDate.withTimeAtStartOfDay(), startDate.plusDays(1).withTimeAtStartOfDay());
assertThat(result.get().getData().size(), is(1));
assertThat(result.get().getData().stream().map(e -> e.getData()).findFirst().get(), is(3L));
}
}