package org.openlmis.core.model.service;
import com.google.inject.AbstractModule;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestApp;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.StockMovementItem;
import org.openlmis.core.model.repository.StockMovementRepository;
import org.openlmis.core.model.repository.StockRepository;
import org.openlmis.core.utils.DateUtil;
import org.robolectric.RuntimeEnvironment;
import roboguice.RoboGuice;
import static junit.framework.Assert.assertNull;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class ProgramDataFormPeriodServiceTest {
private StockRepository mockStockRepository;
ProgramDataFormPeriodService periodService;
private StockMovementRepository mockStockMovementRepository;
@Before
public void setup() throws LMISException {
mockStockRepository = mock(StockRepository.class);
mockStockMovementRepository = mock(StockMovementRepository.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule());
periodService = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramDataFormPeriodService.class);
}
@Test
public void shouldGenerateFirstPeriodBasedOnFirstMovementDate() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2016-10-18", DateUtil.DB_DATE_FORMAT).getTime());
StockMovementItem stockMovementItem = new StockMovementItem();
stockMovementItem.setMovementDate(DateUtil.parseString("2016-10-10", DateUtil.DB_DATE_FORMAT));
when(mockStockMovementRepository.getFirstStockMovement()).thenReturn(stockMovementItem);
assertThat(periodService.getFirstStandardPeriod().getBegin(), is(new DateTime(DateUtil.parseString("2016-09-21", DateUtil.DB_DATE_FORMAT))));
assertThat(periodService.getFirstStandardPeriod().getEnd(), is(new DateTime(DateUtil.parseString("2016-10-20", DateUtil.DB_DATE_FORMAT))));
}
@Test
public void shouldNotGenerateFirstPeriodIfNoMovement() throws Exception {
when(mockStockMovementRepository.getFirstStockMovement()).thenReturn(null);
assertNull(periodService.getFirstStandardPeriod());
}
@Test
public void shouldNotGenerateFirstPeriodIfThereIsMovementButNotPass18thYet() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2016-10-10", DateUtil.DB_DATE_FORMAT).getTime());
StockMovementItem stockMovementItem = new StockMovementItem();
stockMovementItem.setMovementDate(DateUtil.parseString("2016-10-10", DateUtil.DB_DATE_FORMAT));
when(mockStockMovementRepository.getFirstStockMovement()).thenReturn(stockMovementItem);
assertNull(periodService.getFirstStandardPeriod());
}
@Test
public void shouldGenerateNextPeriodShouldNotGenerateNextPeriodIfDateIsBefore18th() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2016-09-16", DateUtil.DB_DATE_FORMAT).getTime());
//2016-7-21 to 2016-8-20
Period period = Period.of(DateUtil.parseString("2016-08-12",DateUtil.DB_DATE_FORMAT));
assertNull(periodService.generateNextPeriod(period));
}
@Test
public void shouldGenerateNextPeriodShouldGenerateNextPeriodIfDateIsAfter18th() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2016-09-19", DateUtil.DB_DATE_FORMAT).getTime());
//2016-7-21 to 2016-8-20
Period period = Period.of(DateUtil.parseString("2016-08-12",DateUtil.DB_DATE_FORMAT));
assertThat(periodService.generateNextPeriod(period).getBegin(), is(new DateTime(DateUtil.parseString("2016-08-21", DateUtil.DB_DATE_FORMAT))));
assertThat(periodService.generateNextPeriod(period).getEnd(), is(new DateTime(DateUtil.parseString("2016-09-20", DateUtil.DB_DATE_FORMAT))));
}
public class MyTestModule extends AbstractModule {
@Override
protected void configure() {
bind(StockRepository.class).toInstance(mockStockRepository);
bind(StockMovementRepository.class).toInstance(mockStockMovementRepository);
}
}
}