package org.openlmis.core.view.viewmodel;
import org.assertj.core.api.Assertions;
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.manager.MovementReasonManager;
import org.openlmis.core.model.Product;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.model.builder.StockCardBuilder;
import org.openlmis.core.view.holder.StockCardViewHolder;
import static org.assertj.core.util.Lists.newArrayList;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@RunWith(LMISTestRunner.class)
public class InventoryViewModelTest {
private InventoryViewModel viewModel;
@Before
public void setUp() throws Exception {
StockCard stockCard = StockCardBuilder.buildStockCard();
stockCard.setId(1);
stockCard.setAvgMonthlyConsumption(1);
viewModel = new InventoryViewModel(stockCard);
}
@Test
public void shouldBuildEmergencyModel() throws Exception {
StockCard stockCard = new StockCard();
stockCard.setId(1);
stockCard.setProduct(ProductBuilder.buildAdultProduct());
InventoryViewModel inventoryViewModel = InventoryViewModel.buildEmergencyModel(stockCard);
assertThat(inventoryViewModel.getStockCard().getId(), is(1L));
}
@Test
public void shouldValidateReturnTrueWhenProductIsArchived() throws Exception {
StockCard stockCard = new StockCard();
stockCard.setId(1);
Product product = ProductBuilder.buildAdultProduct();
product.setArchived(true);
stockCard.setProduct(product);
InventoryViewModel inventoryViewModel = InventoryViewModel.buildEmergencyModel(stockCard);
inventoryViewModel.setChecked(true);
assertTrue(inventoryViewModel.validate());
}
@Test
public void shouldValidate() throws Exception {
LotMovementViewModel lotMovementViewModel = new LotMovementViewModel("lot1", "Feb 2017", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel.setQuantity("10");
viewModel.setNewLotMovementViewModelList(newArrayList(lotMovementViewModel));
assertTrue(viewModel.validate());
lotMovementViewModel.setQuantity("number");
assertFalse(viewModel.validate());
}
@Test
public void shouldGetNormalLevelWhenSOHGreaterThanAvg() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setStockOnHand(100);
stockCard.setAvgMonthlyConsumption(80);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(100);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_NORMAL);
}
@Test
public void shouldGetNormalLevelWhenAvgMonthlyConsumptionLessThanZero() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setAvgMonthlyConsumption(-1);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(100);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_NORMAL);
}
@Test
public void shouldGetOverLevelWhenSOHSmallerThanAvg() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setStockOnHand(30);
stockCard.setAvgMonthlyConsumption(10);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(30);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_OVER_STOCK);
}
@Test
public void shouldGetLowLevelWhenSOHSmallerThanAvg() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setStockOnHand(2);
stockCard.setAvgMonthlyConsumption(100);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(2);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_LOW_STOCK);
}
@Test
public void shouldGetStockOutLevelWhenSOHIsZero() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setAvgMonthlyConsumption(80);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(0);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_STOCK_OUT);
}
@Test
public void shouldGetStockOutLevelWhenSOHIsZeroEvenAvgMonthlyConsumptionLessThanZero() throws LMISException {
StockCard stockCard = new StockCard();
stockCard.setAvgMonthlyConsumption(-1);
viewModel.setStockCard(stockCard);
viewModel.setStockOnHand(0);
int stockOnHandLevel = viewModel.getStockOnHandLevel();
Assertions.assertThat(stockOnHandLevel).isEqualTo(StockCardViewHolder.STOCK_ON_HAND_STOCK_OUT);
}
@Test
public void shouldReturnFalseWhenLotListIsInvalidate() throws Exception {
StockCard stockCard = new StockCard();
stockCard.setId(1);
Product product = ProductBuilder.buildAdultProduct();
product.setArchived(false);
stockCard.setProduct(product);
InventoryViewModel inventoryViewModel = InventoryViewModel.buildEmergencyModel(stockCard);
inventoryViewModel.setChecked(true);
LotMovementViewModel lotMovementViewModel = new LotMovementViewModel("lotNumber", "2012-09-01", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel.validateLotWithPositiveQuantity();
inventoryViewModel.newLotMovementViewModelList.add(lotMovementViewModel);
assertFalse(inventoryViewModel.validate());
}
@Test
public void shouldReturnTrueWhenLotListIsValid() throws Exception {
StockCard stockCard = new StockCard();
stockCard.setId(1);
Product product = ProductBuilder.buildAdultProduct();
product.setArchived(false);
stockCard.setProduct(product);
InventoryViewModel inventoryViewModel = InventoryViewModel.buildEmergencyModel(stockCard);
inventoryViewModel.setChecked(true);
LotMovementViewModel lotMovementViewModel = new LotMovementViewModel("lotNumber", "2012-09-01", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel.setQuantity("21");
inventoryViewModel.newLotMovementViewModelList.add(lotMovementViewModel);
assertTrue(inventoryViewModel.validate());
}
}