/*
* This program is part of the OpenLMIS logistics management information
* system platform software.
*
* Copyright © 2015 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.openlmis.core.LMISRepositoryUnitTest;
import org.openlmis.core.LMISTestRunner;
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.builder.ProductBuilder;
import org.openlmis.core.model.builder.StockCardBuilder;
import org.openlmis.core.model.repository.ProductRepository;
import org.openlmis.core.model.repository.StockMovementRepository;
import org.openlmis.core.model.repository.StockRepository;
import org.openlmis.core.model.service.StockService;
import org.openlmis.core.view.viewmodel.StockMovementViewModel;
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 org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class StockMovementsPresenterTest extends LMISRepositoryUnitTest {
private StockMovementsPresenter stockMovementsPresenter;
StockRepository mockStockRepository;
ProductRepository productRepository;
StockMovementsPresenter.StockMovementView view;
StockService stockServiceMock;
SharedPreferenceMgr sharedPreferenceMgr;
private StockMovementRepository mockStockMovementRepository;
@Before
public void setup() throws Exception {
mockStockRepository = mock(StockRepository.class);
productRepository = mock(ProductRepository.class);
sharedPreferenceMgr = mock(SharedPreferenceMgr.class);
stockServiceMock = mock(StockService.class);
mockStockMovementRepository = mock(StockMovementRepository.class);
view = mock(StockMovementsPresenter.StockMovementView.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule());
stockMovementsPresenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(StockMovementsPresenter.class);
stockMovementsPresenter.attachView(view);
stockMovementsPresenter.stockCard = StockCardBuilder.buildStockCard();
stockMovementsPresenter.sharedPreferenceMgr = sharedPreferenceMgr;
}
@Test
public void shouldEnableUnpackMenuAndUpdateExpiryDateGroupWhenStockCardSOHIsNotZeroAndKitHasProducts() throws Exception {
//given
StockCard stockCard = createStockCard(100, true);
Product kit = ProductBuilder.buildAdultProduct();
kit.setKit(true);
stockCard.setProduct(kit);
when(mockStockRepository.queryStockCardById(200L)).thenReturn(stockCard);
when(productRepository.queryKitProductByKitCode(kit.getCode())).thenReturn(Arrays.asList(new KitProduct()));
//when
stockMovementsPresenter.setStockCard(200L);
//then
verify(view).updateUnpackKitMenu(true);
verify(view).updateExpiryDateViewGroup();
}
@Test
public void shouldDisableUnpackMenuWhenStockCardSOHIsNotZeroAndKitHasNoProduct() throws Exception {
//given
StockCard stockCard = createStockCard(100, true);
Product kit = ProductBuilder.buildAdultProduct();
kit.setKit(true);
stockCard.setProduct(kit);
when(mockStockRepository.queryStockCardById(200L)).thenReturn(stockCard);
when(productRepository.queryKitProductByKitCode(kit.getCode())).thenReturn(new ArrayList<KitProduct>());
//when
stockMovementsPresenter.setStockCard(200L);
//then
verify(view).updateUnpackKitMenu(false);
}
@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;
}
@Test
public void shouldLoadStockMovementViewModelsObserver() throws Exception {
when(mockStockMovementRepository.listLastFiveStockMovements((long) anyInt())).thenReturn(new ArrayList<StockMovementItem>());
TestSubscriber<List<StockMovementViewModel>> subscriber = new TestSubscriber<>();
stockMovementsPresenter.loadStockMovementViewModelsObserver().subscribe(subscriber);
subscriber.awaitTerminalEvent();
subscriber.assertNoErrors();
subscriber.assertValue(new ArrayList<StockMovementViewModel>());
}
@Test
public void shouldArchiveStockCard() throws Exception {
//given
StockCard stockCard = stockMovementsPresenter.stockCard;
stockCard.getProduct().setArchived(false);
//when
stockMovementsPresenter.archiveStockCard();
//then
assertThat(stockCard.getProduct().isArchived()).isTrue();
verify(mockStockRepository).updateProductOfStockCard(stockCard.getProduct());
}
public class MyTestModule extends AbstractModule {
@Override
protected void configure() {
bind(StockRepository.class).toInstance(mockStockRepository);
bind(ProductRepository.class).toInstance(productRepository);
bind(StockService.class).toInstance(stockServiceMock);
}
}
}