package org.openlmis.core.model; import com.google.inject.AbstractModule; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.model.builder.StockCardBuilder; import org.openlmis.core.model.builder.StockMovementItemBuilder; import org.openlmis.core.model.repository.ProductRepository; import org.openlmis.core.model.repository.ProgramRepository; import org.openlmis.core.utils.DateUtil; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import roboguice.RoboGuice; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @RunWith(LMISTestRunner.class) public class StockCardTest { private ProductRepository mockProductRepository; private ProgramRepository mockProgramRepository; private StockCard stockCard; private List<StockMovementItem> wrapper; private StockMovementItem item1; private StockMovementItem item2; private StockMovementItem item3; @Before public void setUp() throws Exception { mockProductRepository = mock(ProductRepository.class); mockProgramRepository = mock(ProgramRepository.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule()); stockCard = StockCardBuilder.buildStockCard(); wrapper = new ArrayList<>(); StockMovementItemBuilder builder = new StockMovementItemBuilder(); item1 = builder.build(); item2 = builder.build(); item3 = builder.build(); wrapper.add(item1); wrapper.add(item2); wrapper.add(item3); stockCard.setStockMovementItemsWrapper(wrapper); } @Test public void shouldInitStockMovementFromStockCard() throws Exception { StockCard stockCard = StockCardBuilder.buildStockCard(); stockCard.setStockOnHand(200); StockMovementItem stockMovementItem = stockCard.generateInitialStockMovementItem(); assertThat(stockMovementItem.getMovementQuantity(), is(200L)); assertThat(stockMovementItem.getStockOnHand(), is(200L)); assertThat(stockMovementItem.getReason(), is(MovementReasonManager.INVENTORY)); assertThat(stockMovementItem.getMovementType(), is(MovementReasonManager.MovementType.PHYSICAL_INVENTORY)); assertThat(stockMovementItem.getStockCard(), is(stockCard)); } @Test public void shouldGetCMM() throws Exception { stockCard.setAvgMonthlyConsumption(0.7777777f); assertThat(stockCard.getCMM(), is(0.78f)); stockCard.setAvgMonthlyConsumption(12.3849f); assertThat(stockCard.getCMM(), is(12.38f)); stockCard.setAvgMonthlyConsumption(2234f); assertThat(stockCard.getCMM(), is(2234f)); } @Test public void shouldGetIsLowStockAvg() throws Exception { stockCard.setStockOnHand(1); stockCard.setAvgMonthlyConsumption(100.5f); assertTrue(stockCard.isLowStock()); } @Test public void shouldGetOverStockAvg() throws Exception { stockCard.setStockOnHand(220); stockCard.setAvgMonthlyConsumption(100.5f); assertTrue(stockCard.isOverStock()); } @Test public void shouldGetNonEmptyLotOnHandList() throws Exception { Lot lot1 = new Lot(); lot1.setExpirationDate(DateUtil.parseString("Sep 2014", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand1 = new LotOnHand(); lotOnHand1.setLot(lot1); lotOnHand1.setQuantityOnHand(1L); Lot lot2 = new Lot(); lot2.setExpirationDate(DateUtil.parseString("Jan 2013", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand2 = new LotOnHand(); lotOnHand2.setLot(lot2); lotOnHand2.setQuantityOnHand(0L); Lot lot3 = new Lot(); lot3.setExpirationDate(DateUtil.parseString("Feb 2014", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand3 = new LotOnHand(); lotOnHand3.setLot(lot3); lotOnHand3.setQuantityOnHand(1L); stockCard.setLotOnHandListWrapper(Arrays.asList(lotOnHand1, lotOnHand2, lotOnHand3)); assertThat(stockCard.getNonEmptyLotOnHandList().size(), is(2)); assertThat(stockCard.getNonEmptyLotOnHandList().get(0), is(lotOnHand1)); assertThat(stockCard.getNonEmptyLotOnHandList().get(1), is(lotOnHand3)); } public class MyTestModule extends AbstractModule { @Override protected void configure() { bind(ProductRepository.class).toInstance(mockProductRepository); bind(ProgramRepository.class).toInstance(mockProgramRepository); } } @Test public void shouldGetEarliestLotExpirationDate() throws Exception { stockCard.setLotOnHandListWrapper(new ArrayList<LotOnHand>()); assertNull(stockCard.getEarliestLotExpiryDate()); Lot lot1 = new Lot(); lot1.setExpirationDate(DateUtil.parseString("Sep 2014", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand1 = new LotOnHand(); lotOnHand1.setLot(lot1); lotOnHand1.setQuantityOnHand(1L); Lot lot2 = new Lot(); lot2.setExpirationDate(DateUtil.parseString("Jan 2013", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand2 = new LotOnHand(); lotOnHand2.setLot(lot2); lotOnHand2.setQuantityOnHand(0L); Lot lot3 = new Lot(); lot3.setExpirationDate(DateUtil.parseString("Feb 2014", DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); LotOnHand lotOnHand3 = new LotOnHand(); lotOnHand3.setLot(lot3); lotOnHand3.setQuantityOnHand(1L); stockCard.setLotOnHandListWrapper(Arrays.asList(lotOnHand1, lotOnHand2, lotOnHand3)); assertThat(DateUtil.formatDate(stockCard.getEarliestLotExpiryDate(), DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR), is("Feb 2014")); } @Test public void shouldGetLatestMovementDate() throws Exception { item1.setMovementDate(DateUtil.parseString("2016-02-19", DateUtil.DB_DATE_FORMAT)); item2.setMovementDate(DateUtil.parseString("2016-03-19", DateUtil.DB_DATE_FORMAT)); item3.setMovementDate(DateUtil.parseString("2016-03-18", DateUtil.DB_DATE_FORMAT)); assertEquals(item2.getMovementDate(), stockCard.getLastStockMovementDate()); } }