package org.openlmis.core.presenter;
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.manager.SharedPreferenceMgr;
import org.openlmis.core.model.Inventory;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.Program;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.model.SyncError;
import org.openlmis.core.model.SyncType;
import org.openlmis.core.model.builder.ProgramBuilder;
import org.openlmis.core.model.repository.InventoryRepository;
import org.openlmis.core.model.repository.RnrFormRepository;
import org.openlmis.core.model.repository.StockRepository;
import org.openlmis.core.model.repository.SyncErrorsRepository;
import org.openlmis.core.model.service.RequisitionPeriodService;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.viewmodel.RnRFormViewModel;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import roboguice.RoboGuice;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.util.Lists.newArrayList;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class RnRFormListPresenterTest {
RnRFormListPresenter presenter;
private List<RnRForm> rnRForms;
SyncErrorsRepository syncErrorsRepository;
private RnrFormRepository rnrFormRepository;
private StockRepository stockRepository;
private SharedPreferenceMgr sharedPreferenceMgr;
private Period periodFebToMar;
private Period periodMarToApl;
private Period periodAplToMay;
private RequisitionPeriodService requisitionPeriodService;
private InventoryRepository inventoryRepository;
private RnRForm rnRForm1;
private RnRForm rnRForm2;
private RnRForm rnRForm3;
private Program program;
@Before
public void setUp() {
rnrFormRepository = mock(RnrFormRepository.class);
stockRepository = mock(StockRepository.class);
syncErrorsRepository = mock(SyncErrorsRepository.class);
sharedPreferenceMgr = mock(SharedPreferenceMgr.class);
requisitionPeriodService = mock(RequisitionPeriodService.class);
inventoryRepository = mock(InventoryRepository.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() {
@Override
protected void configure() {
bind(SyncErrorsRepository.class).toInstance(syncErrorsRepository);
bind(RnrFormRepository.class).toInstance(rnrFormRepository);
bind(StockRepository.class).toInstance(stockRepository);
bind(SharedPreferenceMgr.class).toInstance(sharedPreferenceMgr);
bind(RequisitionPeriodService.class).toInstance(requisitionPeriodService);
bind(InventoryRepository.class).toInstance(inventoryRepository);
}
});
presenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(RnRFormListPresenter.class);
rnRForms = createRnRForms();
program = new ProgramBuilder().setProgramCode("VIA").build();
periodFebToMar = new Period(new DateTime(DateUtil.parseString("2016-02-18", DateUtil.DB_DATE_FORMAT)), new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
periodMarToApl = new Period(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)), new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
periodAplToMay = new Period(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)), new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
rnRForm1 = createRnrFormByPeriod(RnRForm.STATUS.AUTHORIZED, periodFebToMar.getBegin().toDate(), periodFebToMar.getEnd().toDate(), program);
rnRForm2 = createRnrFormByPeriod(RnRForm.STATUS.AUTHORIZED, periodMarToApl.getBegin().toDate(), periodMarToApl.getEnd().toDate(), program);
rnRForm3 = createRnrFormByPeriod(RnRForm.STATUS.DRAFT, periodAplToMay.getBegin().toDate(), periodAplToMay.getEnd().toDate(), program);
}
@Test
public void shouldBuildFormListViewModels() throws LMISException {
presenter.setProgramCode("MMIA");
Collections.reverse(rnRForms);
when(rnrFormRepository.listInclude(any(RnRForm.Emergency.class), anyString())).thenReturn(rnRForms);
when(syncErrorsRepository.getBySyncTypeAndObjectId(any(SyncType.class), anyLong()))
.thenReturn(Arrays.asList(new SyncError("Error1", SyncType.RnRForm, 1), new SyncError("Error2", SyncType.RnRForm, 1)));
List<RnRFormViewModel> resultViewModels = presenter.buildFormListViewModels();
assertThat(resultViewModels.size()).isEqualTo(3);
assertThat(resultViewModels.get(0).getSyncServerErrorMessage()).isEqualTo("Error2");
}
protected RnRForm createRnrFormByPeriod(RnRForm.STATUS status, Date periodBegin, Date periodEnd, Program program) {
RnRForm rnRForm1 = new RnRForm();
rnRForm1.setPeriodBegin(periodBegin);
rnRForm1.setPeriodEnd(periodEnd);
rnRForm1.setStatus(status);
rnRForm1.setProgram(program);
return rnRForm1;
}
@Test
public void shouldGenerate1CanNotDoInventoryAnd2HistoricalViewModelsWhenThereIsNoMissedRnrAndTwoRnrDoneAndItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.Yes, program.getProgramCode())).thenReturn(newArrayList(rnRForm1, rnRForm2));
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(false);
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(periodMarToApl.getEnd());
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(periodFebToMar.getEnd());
}
@Test
public void shouldGenerate1CanDoInventoryAnd2HistoricalViewModelsAndSortCorrectlyWhenThereIsNoMissedRnrAndTwoRnrDoneAndItIs20May() throws Exception {
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-20", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.Yes, program.getProgramCode())).thenReturn(newArrayList(rnRForm1, rnRForm2));
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(false);
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
when(inventoryRepository.queryPeriodInventory(periodAplToMay)).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(periodMarToApl.getEnd());
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(periodFebToMar.getEnd());
}
@Test
public void shouldGenerate1InventoryDoneAnd2HistoricalViewModelsAndSortCorrectlyWhenThereIsNoMissedRnrAndTwoRnrDoneAndInventoryDoneForThisPeriod() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-20", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.Yes, program.getProgramCode())).thenReturn(newArrayList(rnRForm1, rnRForm2));
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(false);
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
when(inventoryRepository.queryPeriodInventory(periodAplToMay)).thenReturn(newArrayList(new Inventory()));
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_INVENTORY_DONE);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(periodMarToApl.getEnd());
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(periodFebToMar.getEnd());
}
@Test
public void shouldGenerate1CreatedNotCompletedAndTwoHistoricalViewModelsAndSortCorrectlyWhenThereIsNoMissedRnrAndTwoRnrDoneAndItIs20May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-20", DateUtil.DB_DATE_FORMAT)).getMillis());
RnRForm rnRForm3 = createRnrFormByPeriod(RnRForm.STATUS.DRAFT, periodAplToMay.getBegin().toDate(), periodAplToMay.getEnd().toDate(), program);
when(rnrFormRepository.listInclude(any(RnRForm.Emergency.class), anyString())).thenReturn(newArrayList(rnRForm1, rnRForm2, rnRForm3));
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(false);
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_CREATED_BUT_UNCOMPLETED);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(periodMarToApl.getEnd());
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(periodFebToMar.getEnd());
}
@Test
public void shouldGenerate1CanNotDoInventoryViewModelsWhenThereIsNoMissedRnrAndThereIsNoHistoricalRnrAndItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.list()).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(1);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
}
@Test
public void shouldGenerate1CanDoInventoryViewModelsWhenThereIsNoMissedRnrAndThereIsNoHistoricalRnrAndItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.list()).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
when(inventoryRepository.queryPeriodInventory(periodAplToMay)).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(1);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
}
@Test
public void shouldGenerate1InventoryDoneViewModelsWhenThereIsNoMissedRnrAndThereIsNoHistoricalRnrAndItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.list()).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
when(inventoryRepository.queryPeriodInventory(periodAplToMay)).thenReturn(newArrayList(new Inventory()));
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(1);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_INVENTORY_DONE);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
}
@Test
public void shouldGenerate1CreatedNotCompletedViewModelsWhenThereIsNoMissedRnrAndThereIsOneDraftRnrAndItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(any(RnRForm.Emergency.class), anyString())).thenReturn(newArrayList(rnRForm3));
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodAplToMay);
when(inventoryRepository.queryPeriodInventory(periodAplToMay)).thenReturn(newArrayList(new Inventory()));
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(1);
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_CREATED_BUT_UNCOMPLETED);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(periodAplToMay.getEnd());
}
@Test
public void shouldGenerate1SelectPeriodAnd1MissedPeriodAnd1HistoricalRnRViewModelsWhenThereIsOneRnrDoneAndMissed2RnrAndThereIsNoInventoryIsDoneForTheFirstMissedRnrItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(any(RnRForm.Emergency.class), anyString())).thenReturn(newArrayList(rnRForm1));
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodMarToApl);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(1);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
}
@Test
public void shouldGenerate1CreateRnrFormAnd1MissedPeriodAnd1HistoricalViewModelsWhenThereIsNoRnrInDBAndMissed2RnrAndThereInventoryIsDoneForTheFirstMissedRnrItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.Yes, program.getProgramCode())).thenReturn(newArrayList(rnRForm1));
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodMarToApl);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(1);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(newArrayList(new Inventory()));
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_INVENTORY_DONE);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
}
@Test
public void shouldGenerate1SelectPeriodAnd2MissedPeriodAnd1HistoricalViewModelsWhenThereIsNoRnrInDBAndMissed3RnrAndItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.Yes, program.getProgramCode())).thenReturn(newArrayList(rnRForm1));
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodMarToApl);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(2);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(4);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-06-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(3).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(3).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
}
@Test
public void shouldGenerate2MissedPeriodAnd1HistoricalAnd1CreatedNotCpmletedViewModelsWhenThereIs1RnrDoneAnd1DraftRnrAndMissed2RnrAndItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
Period periodMayToJun = new Period(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)), new DateTime(DateUtil.parseString("2016-06-18", DateUtil.DB_DATE_FORMAT)));
when(rnrFormRepository.listInclude(any(RnRForm.Emergency.class), anyString())).thenReturn(newArrayList(rnRForm2, rnRForm3));
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodMayToJun);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(1);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-06-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(4);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-07-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-06-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_CREATED_BUT_UNCOMPLETED);
assertThat(rnRFormViewModels.get(3).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(3).getType()).isEqualTo(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
}
@Test
public void shouldGenerate1SelectPeriodAnd2MissedPeriodViewModelsWhenThereIsNoRnrInDBAndMissed3RnrAndThereIsNoInventoryIsDoneForTheFirstMissedRnrItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.No, program.getProgramCode())).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodFebToMar);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(2);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD);
}
@Test
public void shouldGenerate1CreateRnrFormAnd2MissedPeriodViewModelsWhenThereIsNoRnrInDBAndMissed3RnrAndThereInventoryIsDoneForTheFirstMissedRnrItIs17May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-17", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.No, program.getProgramCode())).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodFebToMar);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(2);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(newArrayList(new Inventory()));
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(3);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_INVENTORY_DONE);
}
@Test
public void shouldGenerate1SelectPeriodAnd3MissedPeriodViewModelsWhenThereIsNoRnrInDBAndMissed3RnrAndThereIsNoInventoryIsDoneForTheFirstMissedRnrItIs18May() throws Exception {
Program program = new ProgramBuilder().setProgramCode("VIA").build();
presenter.setProgramCode(program.getProgramCode());
LMISTestApp.getInstance().setCurrentTimeMillis(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)).getMillis());
when(rnrFormRepository.listInclude(RnRForm.Emergency.No, program.getProgramCode())).thenReturn(new ArrayList<RnRForm>());
when(requisitionPeriodService.generateNextPeriod(program.getProgramCode(), null)).thenReturn(periodFebToMar);
when(requisitionPeriodService.hasMissedPeriod(program.getProgramCode())).thenReturn(true);
when(requisitionPeriodService.getMissedPeriodOffsetMonth(program.getProgramCode())).thenReturn(3);
when(requisitionPeriodService.getCurrentMonthInventoryBeginDate()).thenReturn(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>());
List<RnRFormViewModel> rnRFormViewModels = presenter.buildFormListViewModels();
assertThat(rnRFormViewModels.size()).isEqualTo(4);
assertThat(rnRFormViewModels.get(0).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-06-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(0).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(1).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-05-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(1).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(2).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-04-18", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(2).getType()).isEqualTo(RnRFormViewModel.TYPE_MISSED_PERIOD);
assertThat(rnRFormViewModels.get(3).getPeriodEndMonth()).isEqualTo(new DateTime(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT)));
assertThat(rnRFormViewModels.get(3).getType()).isEqualTo(RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD);
}
private List<RnRForm> createRnRForms() {
return newArrayList(createRnRForm(RnRForm.STATUS.DRAFT), createRnRForm(RnRForm.STATUS.AUTHORIZED), createRnRForm(RnRForm.STATUS.AUTHORIZED));
}
private RnRForm createRnRForm(RnRForm.STATUS status) {
Program program = new Program();
program.setProgramCode("MMIA");
program.setProgramName("MMIA");
RnRForm rnRForm = RnRForm.init(program, DateUtil.today());
rnRForm.setId(1L);
rnRForm.setStatus(status);
rnRForm.setSynced(true);
return rnRForm;
}
}