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.LMISTestRunner; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.model.Inventory; import org.openlmis.core.model.Period; import org.openlmis.core.model.repository.InventoryRepository; import org.openlmis.core.model.service.RequisitionPeriodService; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.view.viewmodel.SelectInventoryViewModel; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import roboguice.RoboGuice; import rx.observers.TestSubscriber; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(LMISTestRunner.class) public class SelectPeriodPresenterTest { private SelectPeriodPresenter.SelectPeriodView view; private InventoryRepository inventoryRepository; private SelectPeriodPresenter selectPeriodPresenter; private RequisitionPeriodService mockRequisitionPeriodService; @Before public void setUp() throws Exception { view = mock(SelectPeriodPresenter.SelectPeriodView.class); inventoryRepository = mock(InventoryRepository.class); mockRequisitionPeriodService = mock(RequisitionPeriodService.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() { @Override protected void configure() { bind(InventoryRepository.class).toInstance(inventoryRepository); bind(RequisitionPeriodService.class).toInstance(mockRequisitionPeriodService); } }); selectPeriodPresenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(SelectPeriodPresenter.class); selectPeriodPresenter.attachView(view); } @Test public void shouldGetPeriodInventoryWhenLoadData() throws LMISException { List<Inventory> inventories = Arrays.asList( generateInventoryWithDate("2020-02-21 13:00:00"), generateInventoryWithDate("2020-02-21 09:00:00"), generateInventoryWithDate("2020-02-19 12:00:00")); when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(inventories); TestSubscriber<List<SelectInventoryViewModel>> testSubscriber = new TestSubscriber<>(); selectPeriodPresenter = spy(selectPeriodPresenter); when(selectPeriodPresenter.getSubscriber()).thenReturn(testSubscriber); selectPeriodPresenter.loadData("MMIA"); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); verify(mockRequisitionPeriodService).generateNextPeriod("MMIA", null); verify(inventoryRepository).queryPeriodInventory(any(Period.class)); assertThat(testSubscriber.getOnNextEvents().get(0).size(), is(3)); assertTrue(testSubscriber.getOnNextEvents().get(0).get(0).isShowTime()); assertFalse(testSubscriber.getOnNextEvents().get(0).get(2).isShowTime()); } @Test public void shouldRefreshDateAfterLoadPeriods() throws LMISException { List<SelectInventoryViewModel> inventories = Arrays.asList(new SelectInventoryViewModel(new Inventory())); selectPeriodPresenter.getSubscriber().onNext(inventories); verify(view).refreshDate(inventories); } @Test public void shouldGenerateDefaultInventoryViewModelsWhenThereIsNoInventoryDone() throws Exception { when(inventoryRepository.queryPeriodInventory(any(Period.class))).thenReturn(new ArrayList<Inventory>()); Period period = new Period(new DateTime("2015-06-18"), new DateTime("2015-07-20")); when(mockRequisitionPeriodService.generateNextPeriod("MMIA", null)).thenReturn(period); TestSubscriber<List<SelectInventoryViewModel>> testSubscriber = new TestSubscriber<>(); selectPeriodPresenter = spy(selectPeriodPresenter); when(selectPeriodPresenter.getSubscriber()).thenReturn(testSubscriber); selectPeriodPresenter.loadData("MMIA"); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); verify(mockRequisitionPeriodService).generateNextPeriod("MMIA", null); verify(inventoryRepository).queryPeriodInventory(any(Period.class)); List<SelectInventoryViewModel> inventoryViewModels = testSubscriber.getOnNextEvents().get(0); assertThat(inventoryViewModels.size(), is(8)); assertThat(DateUtil.formatDate(inventoryViewModels.get(0).getInventoryDate(), DateUtil.DATE_TIME_FORMAT), is("2015-07-18 23:59:59")); assertThat(DateUtil.formatDate(inventoryViewModels.get(7).getInventoryDate(), DateUtil.DATE_TIME_FORMAT), is("2015-07-25 23:59:59")); } private Inventory generateInventoryWithDate(String formattedDate) { Inventory inventory = new Inventory(); inventory.setCreatedAt(DateUtil.parseString(formattedDate, DateUtil.DATE_TIME_FORMAT)); inventory.setUpdatedAt(DateUtil.parseString(formattedDate, DateUtil.DATE_TIME_FORMAT)); return inventory; } }