package org.openlmis.core.model;
import org.junit.Before;
import org.junit.Test;
import org.openlmis.core.manager.MovementReasonManager;
import org.openlmis.core.model.builder.StockCardBuilder;
import org.openlmis.core.model.builder.StockMovementItemBuilder;
import org.openlmis.core.view.viewmodel.LotMovementViewModel;
import java.text.ParseException;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.roboguice.shaded.goole.common.collect.Lists.newArrayList;
public class StockMovementItemTest {
private StockMovementItem stockMovementItem;
@Before
public void setUp() throws Exception {
stockMovementItem = new StockMovementItem();
stockMovementItem.setStockOnHand(100);
stockMovementItem.setMovementQuantity(50);
}
@Test
public void shouldSetInitialAmountCorrectWhenTypeIsIssue() throws Exception {
//given
stockMovementItem.setMovementType(MovementReasonManager.MovementType.ISSUE);
//when
long calculatePreviousSOH = stockMovementItem.calculatePreviousSOH();
//then
assertThat(calculatePreviousSOH, is(150L));
}
@Test
public void shouldSetInitialAmountCorrectWhenTypeIsNegative() throws Exception {
//given
stockMovementItem.setMovementType(MovementReasonManager.MovementType.NEGATIVE_ADJUST);
//when
long calculatePreviousSOH = stockMovementItem.calculatePreviousSOH();
//then
assertThat(calculatePreviousSOH, is(150L));
}
@Test
public void shouldSetInitialAmountCorrectWhenTypeIsReceive() throws Exception {
//given
stockMovementItem.setMovementType(MovementReasonManager.MovementType.RECEIVE);
//when
long calculatePreviousSOH = stockMovementItem.calculatePreviousSOH();
//then
assertThat(calculatePreviousSOH, is(50L));
}
@Test
public void shouldSetInitialAmountCorrectWhenTypeIsPositive() throws Exception {
//given
stockMovementItem.setMovementType(MovementReasonManager.MovementType.POSITIVE_ADJUST);
//when
long calculatePreviousSOH = stockMovementItem.calculatePreviousSOH();
//then
assertThat(calculatePreviousSOH, is(50L));
}
@Test
public void shouldSetInitialAmountCorrectWhenTypeIsPhysical() throws Exception {
//given
stockMovementItem.setMovementType(MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
stockMovementItem.setMovementQuantity(0L);
//when
long calculatePreviousSOH = stockMovementItem.calculatePreviousSOH();
//then
assertThat(calculatePreviousSOH, is(100L));
}
@Test
public void shouldPopulateAllLotQuantitiesAndCalculateNewSOHForStockItem() throws ParseException {
LotMovementViewModel lotMovementViewModel1 = new LotMovementViewModel("ABC", "Dec 2016", "10", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel1.setQuantity("10");
LotMovementViewModel lotMovementViewModel2 = new LotMovementViewModel("DEF", "Nov 2016", "20", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel2.setQuantity("15");
LotMovementViewModel lotMovementViewModel3 = new LotMovementViewModel("HIJ", "Oct 2016", "30", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel3.setQuantity("5");
List<LotMovementViewModel> lotMovementViewModelList = newArrayList(lotMovementViewModel1, lotMovementViewModel2, lotMovementViewModel3);
StockCard stockCard = StockCardBuilder.buildStockCard();
StockMovementItem stockMovementItem = new StockMovementItemBuilder().withMovementDate("2016-11-30").withStockOnHand(100).build();
stockMovementItem.setStockCard(stockCard);
stockMovementItem.populateLotQuantitiesAndCalculateNewSOH(lotMovementViewModelList, MovementReasonManager.MovementType.ISSUE);
assertThat(stockMovementItem.getStockOnHand(), is(70L));
assertThat(stockMovementItem.getMovementQuantity(), is(30L));
}
@Test
public void shouldPopulateLotQuantitiesAndCalculateNewSOH() throws ParseException {
LotMovementViewModel lotMovementViewModel1 = new LotMovementViewModel("ABC", "Dec 2016", "10", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel1.setQuantity("10");
LotMovementViewModel lotMovementViewModel2 = new LotMovementViewModel("DEF", "Nov 2016", "20", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel2.setQuantity("15");
LotMovementViewModel lotMovementViewModel3 = new LotMovementViewModel("HIJ", "Oct 2016", "50", MovementReasonManager.MovementType.ISSUE);
lotMovementViewModel3.setQuantity("5");
List<LotMovementViewModel> lotMovementViewModelList = newArrayList(lotMovementViewModel1, lotMovementViewModel2, lotMovementViewModel3);
StockCard stockCard = StockCardBuilder.buildStockCard();
stockCard.setStockOnHand(80L);
StockMovementItem stockMovementItem = new StockMovementItemBuilder().withMovementDate("2016-11-30").build();
stockMovementItem.setStockOnHand(80L);
stockMovementItem.setStockCard(stockCard);
stockMovementItem.populateLotQuantitiesAndCalculateNewSOH(lotMovementViewModelList, MovementReasonManager.MovementType.ISSUE);
assertThat(stockMovementItem.getMovementQuantity(), is(30L));
assertThat(stockMovementItem.getStockOnHand(), is(50L));
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(0).getMovementQuantity(), is(-10L));
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(1).getMovementQuantity(), is(-15L));
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(2).getMovementQuantity(), is(-5L));
}
@Test
public void populateLotAndResetStockOnHandOfLotAccordingPhysicalAdjustment() throws ParseException {
LotMovementViewModel lotMovementViewModel1 = new LotMovementViewModel("ABC", "Dec 2016", "10", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel1.setQuantity("10");
LotMovementViewModel lotMovementViewModel2 = new LotMovementViewModel("DEF", "Nov 2016", "20", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel2.setQuantity("15");
LotMovementViewModel lotMovementViewModel3 = new LotMovementViewModel("HIJ", "Oct 2016", "30", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModel3.setQuantity("5");
LotMovementViewModel lotMovementViewModelNew = new LotMovementViewModel("HIJ", "Oct 2016", "0L", MovementReasonManager.MovementType.PHYSICAL_INVENTORY);
lotMovementViewModelNew.setQuantity("10");
List<LotMovementViewModel> lotMovementViewModelList = newArrayList(lotMovementViewModel1, lotMovementViewModel2, lotMovementViewModel3);
List<LotMovementViewModel> newLotMovementViewModelList = newArrayList(lotMovementViewModelNew);
StockCard stockCard = StockCardBuilder.buildStockCard();
StockMovementItem stockMovementItem = new StockMovementItemBuilder().withMovementDate("2016-11-30").build();
stockMovementItem.setStockCard(stockCard);
stockMovementItem.populateLotAndResetStockOnHandOfLotAccordingPhysicalAdjustment(lotMovementViewModelList, newLotMovementViewModelList);
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(0).getStockOnHand(), is(10L));
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(1).getMovementQuantity(), is(-5L));
assertThat(stockMovementItem.getLotMovementItemListWrapper().get(2).getMovementQuantity(), is(-25L));
assertThat(stockMovementItem.getNewAddedLotMovementItemListWrapper().get(0).getMovementQuantity(), is(10L));
}
}