/* * This program is part of the OpenLMIS logistics management information * system platform software. * * Copyright © 2016 ThoughtWorks, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. This program is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. You should * have received a copy of the GNU Affero General Public License along with * this program. If not, see http://www.gnu.org/licenses. For additional * information contact info@OpenLMIS.org */ package org.openlmis.core.presenter; import android.support.annotation.NonNull; import com.google.inject.AbstractModule; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.manager.SharedPreferenceMgr; import org.openlmis.core.model.KitProduct; import org.openlmis.core.model.Product; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.StockMovementItem; import org.openlmis.core.model.repository.StockRepository; import org.openlmis.core.view.viewmodel.LotMovementViewModel; import org.openlmis.core.view.viewmodel.LotMovementViewModelBuilder; import org.openlmis.core.view.viewmodel.StockMovementViewModel; import org.robolectric.RuntimeEnvironment; import java.util.Arrays; import roboguice.RoboGuice; import rx.observers.TestSubscriber; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(LMISTestRunner.class) public class NewStockMovementPresenterTest { private NewStockMovementPresenter newStockMovementPresenter; private StockRepository stockRepositoryMock; NewStockMovementPresenter.NewStockMovementView view; @Before public void setup() throws Exception { stockRepositoryMock = mock(StockRepository.class); view = mock(NewStockMovementPresenter.NewStockMovementView.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule()); newStockMovementPresenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(NewStockMovementPresenter.class); newStockMovementPresenter.attachView(view); } @Test public void shouldSaveStockItemWhenSaving() throws Exception { StockCard stockCard = createStockCard(0, true); StockMovementViewModel stockMovementViewModel = newStockMovementPresenter.getViewModel(); when(stockRepositoryMock.queryStockCardById(anyLong())).thenReturn(stockCard); newStockMovementPresenter.loadData(1L, MovementReasonManager.MovementType.RECEIVE, false); stockMovementViewModel.getTypeQuantityMap().put(MovementReasonManager.MovementType.RECEIVE, "10"); stockMovementViewModel.setReason(new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.RECEIVE, "code", "desc")); stockMovementViewModel.setMovementDate("10/02/2016"); LotMovementViewModel lotMovementViewModel = new LotMovementViewModelBuilder().setExpiryDate("Jan 2016").setQuantity("50").build(); stockMovementViewModel.getNewLotMovementViewModelList().add(lotMovementViewModel); TestSubscriber<StockMovementViewModel> subscriber = new TestSubscriber<>(); newStockMovementPresenter.getSaveMovementObservable().subscribe(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); ArgumentCaptor<StockMovementItem> captor = ArgumentCaptor.forClass(StockMovementItem.class); verify(stockRepositoryMock).addStockMovementAndUpdateStockCard(captor.capture()); StockMovementItem stockMovementItemSaved = captor.getAllValues().get(0); assertThat(stockMovementItemSaved.getStockOnHand(), is(50L)); assertThat(stockMovementItemSaved.getStockCard(), is(stockCard)); assertFalse(SharedPreferenceMgr.getInstance().isNeedShowProductsUpdateBanner()); } @Test public void shouldUpdateBannerPreferenceWhenSaving() throws Exception { StockCard stockCard = createStockCard(0, true); stockCard.getProduct().setActive(false); when(stockRepositoryMock.queryStockCardById(anyLong())).thenReturn(stockCard); StockMovementViewModel stockMovementViewModel = newStockMovementPresenter.getViewModel(); newStockMovementPresenter.loadData(1L, MovementReasonManager.MovementType.RECEIVE, false); stockMovementViewModel.getTypeQuantityMap().put(MovementReasonManager.MovementType.RECEIVE, "0"); stockMovementViewModel.setReason(new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.RECEIVE, "code", "desc")); stockMovementViewModel.setMovementDate("10/02/2016"); TestSubscriber<StockMovementViewModel> subscriber = new TestSubscriber<>(); newStockMovementPresenter.getSaveMovementObservable().subscribe(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); assertTrue(SharedPreferenceMgr.getInstance().isNeedShowProductsUpdateBanner()); } @NonNull private StockCard createStockCard(int stockOnHand, boolean isKit) { StockCard stockCard = new StockCard(); stockCard.setId(200L); stockCard.setStockOnHand(stockOnHand); Product product = new Product(); product.setActive(true); product.setKit(isKit); product.setKitProductList(Arrays.asList(new KitProduct())); stockCard.setProduct(product); return stockCard; } public class MyTestModule extends AbstractModule { @Override protected void configure() { bind(StockRepository.class).toInstance(stockRepositoryMock); } } }