/* * 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.view.viewmodel; 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.MovementReasonManager; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.StockMovementItem; import org.openlmis.core.utils.DateUtil; import java.text.ParseException; import java.util.Arrays; import java.util.Date; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @RunWith(LMISTestRunner.class) public class StockMovementViewModelTest extends LMISRepositoryUnitTest { private StockMovementViewModel stockMovementViewModel; private MovementReasonManager.MovementReason movementReason; @Before public void setup() { stockMovementViewModel = new StockMovementViewModel(); movementReason = new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.RECEIVE, "RECEIVE", "receive"); } @Test public void shouldReturnValidWhenStockMovementViewModelHasAllData() { stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setReceived("100"); assertTrue(stockMovementViewModel.validateInputValid()); } @Test public void shouldReturnFalseIfMovementDateIsMissing() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setReceived("100"); assertFalse(stockMovementViewModel.validateEmpty()); } @Test public void shouldReturnFalseIfReasonIsMissing() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setMovementDate("2016-11-20"); stockMovementViewModel.setReceived("100"); assertFalse(stockMovementViewModel.validateEmpty()); } @Test public void shouldReturnFalseIfAllQuantitiesAreEmpty() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setMovementDate("2016-11-20"); assertFalse(stockMovementViewModel.validateEmpty()); } @Test public void shouldSetRequestedAsNullWhenRequestedIsNull() throws Exception { stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setReceived("100"); StockMovementItem stockMovementItem = stockMovementViewModel.convertViewToModel(new StockCard()); assertNull(stockMovementItem.getRequested()); } @Test public void shouldSetRequestedAsNullWhenRequestedIsEmpty() throws Exception { stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason = new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.ISSUE, "issue", "issue")); stockMovementViewModel.setIssued("100"); stockMovementViewModel.setRequested(""); StockMovementItem stockMovementItem = stockMovementViewModel.convertViewToModel(new StockCard()); assertNull(stockMovementItem.getRequested()); } @Test public void shouldReturnFalseIfReceivedIsZero() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setReceived("0"); assertFalse(stockMovementViewModel.validateQuantitiesNotZero()); } @Test public void shouldReturnFalseIfIssueIsZero() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setIssued("0"); assertFalse(stockMovementViewModel.validateQuantitiesNotZero()); } @Test public void shouldReturnFalseIfNegativeAdjustmentIsZero() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setNegativeAdjustment("0"); assertFalse(stockMovementViewModel.validateQuantitiesNotZero()); } @Test public void shouldReturnFalseIfPositiveAdjustmentIsZero() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setPositiveAdjustment("0"); assertFalse(stockMovementViewModel.validateQuantitiesNotZero()); } @Test public void shouldReturnTrueIfReceivedIsNotZero() { stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason); stockMovementViewModel.setReceived("12"); assertTrue(stockMovementViewModel.validateQuantitiesNotZero()); } @Test public void shouldSetRequestedCorrectlyWhenRequestedNotEmptyAndNotNull() throws Exception { stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); stockMovementViewModel.setStockExistence("123"); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReason(movementReason = new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.ISSUE, "issue", "issue")); stockMovementViewModel.setIssued("100"); stockMovementViewModel.setRequested("999"); StockMovementItem stockMovementItem = stockMovementViewModel.convertViewToModel(new StockCard()); assertThat(stockMovementItem.getRequested(), is(999L)); } @Test public void shouldCalculateNewLotListMovementQuantityToStockOnHandWhenConvertViewModel() throws ParseException { StockCard stockCard = new StockCard(); stockCard.setId(1); stockMovementViewModel.setStockExistence("1"); stockMovementViewModel.setReason(movementReason = new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.RECEIVE, "receive", "entries")); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReceived("0"); stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); LotMovementViewModel lot1 = new LotMovementViewModel(); lot1.setQuantity("1"); lot1.setLotNumber("AAA"); lot1.setExpiryDate(DateUtil.formatDateWithoutDay(new Date())); stockMovementViewModel.getNewLotMovementViewModelList().addAll(Arrays.asList(lot1)); StockMovementItem convertedStockMovementItem = stockMovementViewModel.convertViewToModel(stockCard); assertEquals(2, convertedStockMovementItem.getStockOnHand()); } @Test public void shouldCalculateNewAndExistingLotListMovementQuantityToStockOnHandWhenConvertViewModel() throws ParseException { StockCard stockCard = new StockCard(); stockCard.setId(1); stockMovementViewModel.setStockExistence("1"); stockMovementViewModel.setReason(movementReason = new MovementReasonManager.MovementReason(MovementReasonManager.MovementType.RECEIVE, "receive", "entries")); stockMovementViewModel.setDocumentNo("111"); stockMovementViewModel.setReceived("0"); stockMovementViewModel.setMovementDate(DateUtil.formatDate(new Date())); LotMovementViewModel lot1 = new LotMovementViewModel(); lot1.setQuantity("1"); lot1.setLotNumber("AAA"); lot1.setExpiryDate(DateUtil.formatDateWithoutDay(new Date())); LotMovementViewModel existingLot = new LotMovementViewModel(); existingLot.setQuantity("1"); existingLot.setLotNumber("BBB"); existingLot.setExpiryDate(DateUtil.formatDateWithoutDay(new Date())); stockMovementViewModel.getExistingLotMovementViewModelList().addAll(Arrays.asList(existingLot)); stockMovementViewModel.getNewLotMovementViewModelList().addAll(Arrays.asList(lot1)); StockMovementItem convertedStockMovementItem = stockMovementViewModel.convertViewToModel(stockCard); assertEquals(3, convertedStockMovementItem.getStockOnHand()); } @Test public void shouldValidateEarlyExpiredLotIssued() throws Exception { stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").build()); assertTrue(stockMovementViewModel.validateSoonestToExpireLotsIssued()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").build()); assertFalse(stockMovementViewModel.validateSoonestToExpireLotsIssued()); stockMovementViewModel.existingLotMovementViewModelList.clear(); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").build()); assertFalse(stockMovementViewModel.validateSoonestToExpireLotsIssued()); stockMovementViewModel.existingLotMovementViewModelList.clear(); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("100").build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().build()); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").build()); assertFalse(stockMovementViewModel.validateSoonestToExpireLotsIssued()); } @Test public void shouldValidateLotChange() throws Exception { stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").setHasLotDataChanged(false).build()); assertFalse(stockMovementViewModel.hasLotDataChanged()); stockMovementViewModel.newLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("30").build()); assertTrue(stockMovementViewModel.hasLotDataChanged()); stockMovementViewModel.newLotMovementViewModelList.clear(); stockMovementViewModel.existingLotMovementViewModelList.add(new LotMovementViewModelBuilder().setLotSOH("100").setQuantity("50").setHasLotDataChanged(true).build()); assertTrue(stockMovementViewModel.hasLotDataChanged()); } }