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.mockito.InjectMocks; import org.openlmis.core.LMISTestApp; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.model.Period; import org.openlmis.core.model.Program; import org.openlmis.core.model.ProgramDataForm; import org.openlmis.core.model.builder.ProgramDataFormBuilder; import org.openlmis.core.model.repository.ProgramDataFormRepository; import org.openlmis.core.model.service.ProgramDataFormPeriodService; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.view.viewmodel.RapidTestReportViewModel; import org.robolectric.RuntimeEnvironment; import roboguice.RoboGuice; import static junit.framework.Assert.assertNull; import static org.assertj.core.util.Lists.newArrayList; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(LMISTestRunner.class) public class RapidTestReportsPresenterTest { private ProgramDataFormRepository programDataFormRepository; private ProgramDataFormPeriodService periodService; @InjectMocks private RapidTestReportsPresenter presenter; @Before public void setUp() { programDataFormRepository = mock(ProgramDataFormRepository.class); periodService = mock(ProgramDataFormPeriodService.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() { @Override protected void configure() { bind(ProgramDataFormRepository.class).toInstance(programDataFormRepository); bind(ProgramDataFormPeriodService.class).toInstance(periodService); } }); presenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(RapidTestReportsPresenter.class); } @Test public void shouldGenerateViewModelsForAllPeriods() throws Exception { //today period is 2016-12-21 to 2017-01-20 LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2017-3-18", DateUtil.DB_DATE_FORMAT).getTime()); //first period is 2016-09-21 to 2016-10-20 Period firstPeriod = new Period(new DateTime(DateUtil.parseString("2016-09-21", DateUtil.DB_DATE_FORMAT))); Period secondPeriod = new Period(new DateTime(DateUtil.parseString("2016-10-21", DateUtil.DB_DATE_FORMAT))); Period thirdPeriod = new Period(new DateTime(DateUtil.parseString("2016-11-21", DateUtil.DB_DATE_FORMAT))); Period fourthPeriod = new Period(new DateTime(DateUtil.parseString("2016-12-21", DateUtil.DB_DATE_FORMAT))); Period fifthPeriod = new Period(new DateTime(DateUtil.parseString("2017-01-21", DateUtil.DB_DATE_FORMAT))); Period sixthPeriod = new Period(new DateTime(DateUtil.parseString("2017-02-21", DateUtil.DB_DATE_FORMAT))); when(periodService.getFirstStandardPeriod()).thenReturn(firstPeriod); when(periodService.generateNextPeriod(firstPeriod)).thenReturn(secondPeriod); when(periodService.generateNextPeriod(secondPeriod)).thenReturn(thirdPeriod); when(periodService.generateNextPeriod(thirdPeriod)).thenReturn(fourthPeriod); when(periodService.generateNextPeriod(fourthPeriod)).thenReturn(fifthPeriod); when(periodService.generateNextPeriod(fifthPeriod)).thenReturn(sixthPeriod); when(periodService.generateNextPeriod(sixthPeriod)).thenReturn(null); Program programRapidTest = new Program("RapidTest", "Rapid Test", null, false, null); ProgramDataForm programDataForm1 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-10-21", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .setProgram(programRapidTest) .build(); ProgramDataForm programDataForm2 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-12-21", DateUtil.DB_DATE_FORMAT)) .setProgram(programRapidTest) .setStatus(ProgramDataForm.STATUS.AUTHORIZED) .build(); ProgramDataForm programDataForm3 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2017-01-21", DateUtil.DB_DATE_FORMAT)) .setProgram(programRapidTest) .setStatus(ProgramDataForm.STATUS.DRAFT) .build(); ProgramDataForm programDataForm4 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-11-21", DateUtil.DB_DATE_FORMAT)) .setProgram(programRapidTest) .setSynced(true) .setStatus(ProgramDataForm.STATUS.AUTHORIZED) .build(); when(programDataFormRepository.listByProgramCode(Constants.RAPID_TEST_CODE)) .thenReturn(newArrayList(programDataForm1, programDataForm2, programDataForm3, programDataForm4)); presenter.generateViewModelsForAllPeriods(); assertThat(presenter.getViewModelList().size(), is(6)); assertNull(presenter.getViewModelList().get(5).getRapidTestForm().getStatus()); assertThat(presenter.getViewModelList().get(4).getRapidTestForm().getStatus(), is(ProgramDataForm.STATUS.SUBMITTED)); assertThat(presenter.getViewModelList().get(4).getStatus(), is(RapidTestReportViewModel.Status.INCOMPLETE)); assertThat(presenter.getViewModelList().get(3).getRapidTestForm().getStatus(), is(ProgramDataForm.STATUS.AUTHORIZED)); assertThat(presenter.getViewModelList().get(3).getStatus(), is(RapidTestReportViewModel.Status.SYNCED)); assertThat(presenter.getViewModelList().get(2).getRapidTestForm().getStatus(), is(ProgramDataForm.STATUS.AUTHORIZED)); assertThat(presenter.getViewModelList().get(2).getStatus(), is(RapidTestReportViewModel.Status.COMPLETED)); assertThat(presenter.getViewModelList().get(1).getRapidTestForm().getStatus(), is(ProgramDataForm.STATUS.DRAFT)); assertThat(presenter.getViewModelList().get(1).getStatus(), is(RapidTestReportViewModel.Status.INCOMPLETE)); assertNull(presenter.getViewModelList().get(0).getRapidTestForm().getStatus()); } }