/* * 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 junit.framework.Assert; import org.hamcrest.core.Is; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.MockitoAnnotations; import org.openlmis.core.LMISTestApp; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.R; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.exceptions.ViewNotMatchException; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.model.BaseInfoItem; import org.openlmis.core.model.KitProduct; import org.openlmis.core.model.Product; import org.openlmis.core.model.RnRForm; import org.openlmis.core.model.RnrFormItem; 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.RnrFormItemBuilder; 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.RnrFormItemRepository; import org.openlmis.core.model.repository.StockMovementRepository; import org.openlmis.core.model.repository.StockRepository; import org.openlmis.core.model.repository.VIARepository; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.view.viewmodel.RequisitionFormItemViewModel; import org.openlmis.core.view.viewmodel.ViaKitsViewModel; import org.roboguice.shaded.goole.common.collect.Lists; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowToast; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; import roboguice.RoboGuice; import rx.observers.TestSubscriber; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.assertj.core.util.Lists.newArrayList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.openlmis.core.model.Product.IsKit; @RunWith(LMISTestRunner.class) public class VIARequisitionPresenterTest { private VIARequisitionPresenter presenter; private org.openlmis.core.view.fragment.VIARequisitionFragment VIARequisitionFragment; private VIARepository mockRnrFormRepository; private ProductRepository mockProductRepository; private StockRepository mockStockRepository; private RnrFormItemRepository mockRnrFormItemRepository; private StockMovementRepository mockStockMovementRepository; @Before public void setup() throws ViewNotMatchException { mockRnrFormRepository = mock(VIARepository.class); mockProductRepository = mock(ProductRepository.class); mockStockRepository = mock(StockRepository.class); mockRnrFormItemRepository = mock(RnrFormItemRepository.class); mockStockMovementRepository = mock(StockMovementRepository.class); VIARequisitionFragment = mock(org.openlmis.core.view.fragment.VIARequisitionFragment.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule()); MockitoAnnotations.initMocks(this); presenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(VIARequisitionPresenter.class); presenter.attachView(VIARequisitionFragment); } @Test public void shouldReturnFalseWhenRequestAmountIsNull() throws Exception { List<RequisitionFormItemViewModel> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { list.add(new RequisitionFormItemViewModel(createRnrFormItem(i))); list.get(i).setRequestAmount(""); } presenter.requisitionFormItemViewModels = list; assertFalse(presenter.validateRnrFormItems()); verify(VIARequisitionFragment).showListInputError(anyInt()); } @Test public void shouldValidateFormReturnFalseWhenConsultationNumbersInvalid() throws Exception { presenter.rnRForm = createRnrForm(RnRForm.Emergency.No); when(VIARequisitionFragment.validateConsultationNumber()).thenReturn(false); boolean result = presenter.validateForm(); assertFalse(result); } @Test public void shouldNotValidateKitAndConsultaionNumberWhenFormIsEmergency() throws Exception { presenter.rnRForm = createRnrForm(RnRForm.Emergency.Yes); verify(VIARequisitionFragment, never()).validateConsultationNumber(); } @Test public void shouldValidateFormReturnTrueWhenRnrIsEmergency() throws Exception { presenter = spy(presenter); doReturn(true).when(presenter).validateRnrFormItems(); RnRForm rnRForm = new RnRForm(); rnRForm.setEmergency(true); presenter.rnRForm = rnRForm; when(VIARequisitionFragment.validateConsultationNumber()).thenReturn(false); boolean result = presenter.validateForm(); assertTrue(result); } @Test public void shouldReturnTrueWhenValidateFormSuccess() throws Exception { when(VIARequisitionFragment.validateConsultationNumber()).thenReturn(true); presenter.rnRForm = createRnrForm(RnRForm.Emergency.No); List<RequisitionFormItemViewModel> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { RequisitionFormItemViewModel requisitionFormItemViewModel = new RequisitionFormItemViewModel(createRnrFormItem(i)); requisitionFormItemViewModel.setRequestAmount("12"); list.add(requisitionFormItemViewModel); } presenter.requisitionFormItemViewModels = list; assertTrue(presenter.validateRnrFormItems()); assertTrue(presenter.validateForm()); } @Test public void shouldGetRnRFormById() throws Exception { presenter.getRnrForm(1); verify(mockRnrFormRepository).queryRnRForm(anyInt()); verify(mockRnrFormRepository, never()).queryUnAuthorized(); } @Test public void shouldGetInitForm() throws LMISException, SQLException { when(mockRnrFormRepository.queryUnAuthorized()).thenReturn(null); presenter.getRnrForm(0); verify(mockRnrFormRepository).queryUnAuthorized(); verify(mockRnrFormRepository).initNormalRnrForm(null); } @Test public void shouldGetDraftForm() throws LMISException { when(mockRnrFormRepository.queryUnAuthorized()).thenReturn(new RnRForm()); presenter.getRnrForm(0); verify(mockRnrFormRepository).queryUnAuthorized(); verify(mockRnrFormRepository, never()).initNormalRnrForm(null); } @Test public void shouldSubmitAfterSignedAndStatusIsDraft() throws LMISException { //given RnRForm form = getRnRFormWithStatus(RnRForm.STATUS.DRAFT); presenter.rnRForm = form; //when presenter.processSign("userSignature"); waitObservableToExecute(); //then assertThat(RnRForm.STATUS.SUBMITTED, is(form.getStatus())); verify(mockRnrFormRepository).createOrUpdateWithItems(form); } @Test public void shouldCompleteAfterSignedAndStatusIsSubmit() throws LMISException { //given RnRForm form = getRnRFormWithStatus(RnRForm.STATUS.SUBMITTED); presenter.rnRForm = form; //when presenter.processSign("userSignature"); waitObservableToExecute(); //then verify(mockRnrFormRepository).createOrUpdateWithItems(form); assertThat(RnRForm.STATUS.AUTHORIZED, is(form.getStatus())); } private RnRForm getRnRFormWithStatus(RnRForm.STATUS status) { final RnRForm form = new RnRForm(); form.setStatus(status); form.setRnrFormItemListWrapper(new ArrayList<RnrFormItem>()); form.setBaseInfoItemListWrapper(new ArrayList<BaseInfoItem>() {{ add(new BaseInfoItem(VIARepository.ATTR_CONSULTATION, BaseInfoItem.TYPE.STRING, form)); }}); return form; } private void waitObservableToExecute() { try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } @NonNull private RnRForm createRnrForm(RnRForm.Emergency emergency) { RnRForm rnRForm = new RnRForm(); rnRForm.setEmergency(emergency.Emergency()); return rnRForm; } @Test public void shouldHighLightRequestAmountWhenFormStatusIsDraft() { updateFormUIWithStatus(RnRForm.STATUS.DRAFT); verify(VIARequisitionFragment).highLightRequestAmount(); verify(VIARequisitionFragment, never()).highLightApprovedAmount(); } @Test public void shouldHighLightApproveAmountWhenFormStatusIsSubmitted() { updateFormUIWithStatus(RnRForm.STATUS.SUBMITTED); verify(VIARequisitionFragment).highLightApprovedAmount(); verify(VIARequisitionFragment, never()).highLightRequestAmount(); } @Test public void shouldNotHighLightAnyColumnWhenFormStatusIsAuthorized() { updateFormUIWithStatus(RnRForm.STATUS.AUTHORIZED); verify(VIARequisitionFragment, never()).highLightApprovedAmount(); verify(VIARequisitionFragment, never()).highLightRequestAmount(); } @Test public void shouldCallSetProcessButtonNameWithSubmitWhenFormStatusIsSubmitted() { updateFormUIWithStatus(RnRForm.STATUS.DRAFT); verify(VIARequisitionFragment).setProcessButtonName(LMISTestApp.getContext().getString(R.string.btn_submit)); } @Test public void shouldCallSetProcessButtonNameWithCompleteWhenFormStatusIsAuthorized() { updateFormUIWithStatus(RnRForm.STATUS.SUBMITTED); verify(VIARequisitionFragment).setProcessButtonName(LMISTestApp.getContext().getString(R.string.btn_complete)); } @Test public void shouldNotGetConsultantNumberWhenRnRFormIsNullOrInfoItemsIsNull() { presenter.rnRForm = null; assertNull(presenter.getConsultationNumbers()); RnRForm rnRForm = mock(RnRForm.class); when(rnRForm.getBaseInfoItemListWrapper()).thenReturn(new ArrayList<BaseInfoItem>()); presenter.rnRForm = rnRForm; assertNull(presenter.getConsultationNumbers()); } @Test public void shouldGetConsultantNumber() { BaseInfoItem baseInfoItem = new BaseInfoItem(); baseInfoItem.setValue("123"); ArrayList<BaseInfoItem> items = newArrayList(baseInfoItem); RnRForm rnRForm = mock(RnRForm.class); presenter.rnRForm = rnRForm; when(rnRForm.getBaseInfoItemListWrapper()).thenReturn(items); assertThat(presenter.getConsultationNumbers(), is("123")); } @Test public void shouldShowErrorMSGWhenThereWasARequisitionInTheSamePeriod() throws Exception { when(mockRnrFormRepository.isPeriodUnique(any(RnRForm.class))).thenReturn(false); when(VIARequisitionFragment.validateConsultationNumber()).thenReturn(true); presenter.rnRForm = createRnrForm(RnRForm.Emergency.No); presenter.processRequisition("123"); Assert.assertEquals(LMISTestApp.getContext().getResources().getString(R.string.msg_requisition_not_unique), ShadowToast.getTextOfLatestToast()); } @Test public void shouldNotShowErrorMSGWhenThereWasNoARequisitionInTheSamePeriod() throws Exception { RnRForm rnRForm = new RnRForm(); rnRForm.setBaseInfoItemListWrapper(newArrayList(new BaseInfoItem())); presenter.rnRForm = rnRForm; List<RequisitionFormItemViewModel> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { list.add(new RequisitionFormItemViewModel(createRnrFormItem(i))); list.get(i).setRequestAmount(String.valueOf(i)); list.get(i).setAdjustedTotalRequest(String.valueOf(i)); } ViaKitsViewModel viaKitsViewModel = buildDefaultViaKit(); presenter.setViaKitsViewModel(viaKitsViewModel); presenter.requisitionFormItemViewModels = list; when(mockRnrFormRepository.isPeriodUnique(any(RnRForm.class))).thenReturn(true); when(VIARequisitionFragment.validateConsultationNumber()).thenReturn(true); presenter.processRequisition("123"); assertNull(ShadowToast.getLatestToast()); Assert.assertEquals(5, presenter.rnRForm.getRnrFormItemListWrapper().size()); assertThat(presenter.getRnRForm().getRnrFormItemListWrapper().get(3).getCalculatedOrderQuantity(), is(1L)); } @Test public void shouldInitViaKitsViewModel() throws Exception { RnRForm rnRForm = mock(RnRForm.class); when(mockRnrFormRepository.queryRnRForm(1L)).thenReturn(rnRForm); when(rnRForm.getRnrItems(IsKit.No)).thenReturn(new ArrayList<RnrFormItem>()); RnrFormItem rnrKitItem1 = new RnrFormItemBuilder() .setProduct(new ProductBuilder().setCode("SCOD10").build()) .setReceived(100) .setIssued(50) .build(); RnrFormItem rnrKitItem2 = new RnrFormItemBuilder() .setProduct(new ProductBuilder().setCode("SCOD12").build()) .setReceived(300) .setIssued(110) .build(); List<RnrFormItem> rnrFormItems = Lists.newArrayList(rnrKitItem1, rnrKitItem2); when(rnRForm.getRnrItems(IsKit.Yes)).thenReturn(rnrFormItems); TestSubscriber<RnRForm> testSubscriber = new TestSubscriber<>(); presenter.getRnrFormObservable(1L).subscribe(testSubscriber); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); assertEquals("50", presenter.getViaKitsViewModel().getKitsOpenedHF()); assertEquals("100", presenter.getViaKitsViewModel().getKitsReceivedHF()); assertEquals("110", presenter.getViaKitsViewModel().getKitsOpenedCHW()); assertEquals("300", presenter.getViaKitsViewModel().getKitsReceivedCHW()); } @Test public void shouldSaveForm() throws Exception { RnRForm rnRForm = new RnRForm(); rnRForm.setBaseInfoItemListWrapper(newArrayList(new BaseInfoItem())); presenter.rnRForm = rnRForm; List<RequisitionFormItemViewModel> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { list.add(new RequisitionFormItemViewModel(createRnrFormItem(i))); list.get(i).setRequestAmount(""); } ViaKitsViewModel viaKitsViewModel = buildDefaultViaKit(); presenter.setViaKitsViewModel(viaKitsViewModel); presenter.requisitionFormItemViewModels = list; TestSubscriber<RnRForm> subscriber = new TestSubscriber<>(); presenter.getSaveFormObservable("100").subscribe(subscriber); subscriber.awaitTerminalEvent(); verify(mockRnrFormRepository).createOrUpdateWithItems(rnRForm); subscriber.assertNoErrors(); assertEquals(5, presenter.getRnRForm().getRnrFormItemListWrapper().size()); } @Test public void shouldSetAdjustKitProductAmount() throws Exception { RnRForm rnRForm = new RnRForm(); presenter.rnRForm = rnRForm; ArrayList<RnrFormItem> rnrFormItemListWrapper = new ArrayList<>(); RnrFormItem rnrFormItem = createRnrFormItem(1); rnrFormItem.setInitialAmount(1000); rnrFormItem.setCalculatedOrderQuantity(400L); rnrFormItemListWrapper.add(rnrFormItem); rnRForm.setRnrFormItemListWrapper(rnrFormItemListWrapper); ArrayList<KitProduct> kitProducts = new ArrayList<>(); KitProduct kitProduct = new KitProduct(); kitProduct.setQuantity(2); kitProduct.setKitCode("kit"); kitProducts.add(kitProduct); when(mockProductRepository.queryKitProductByProductCode("code")).thenReturn(kitProducts); Product product = new Product(); product.setPrimaryName("KitName"); when(mockProductRepository.getByCode("kit")).thenReturn(product); StockCard stockCard = new StockCard(); stockCard.setStockOnHand(100L); when(mockStockRepository.queryStockCardByProductId(product.getId())).thenReturn(stockCard); List<RequisitionFormItemViewModel> viewModelsFromRnrForm = presenter.getViewModelsFromRnrForm(rnRForm); assertThat(viewModelsFromRnrForm.size(), is(1)); assertThat(viewModelsFromRnrForm.get(0).getAdjustedTotalRequest(), is("200")); assertThat(viewModelsFromRnrForm.get(0).getAdjustmentViewModels().size(), is(1)); assertThat(viewModelsFromRnrForm.get(0).getAdjustmentViewModels().get(0).getQuantity(), is(2)); assertThat(viewModelsFromRnrForm.get(0).getAdjustmentViewModels().get(0).getKitStockOnHand(), is(100L)); assertThat(viewModelsFromRnrForm.get(0).getAdjustmentViewModels().get(0).getKitName(), is("KitName")); } @Test public void shouldNotSetAdjustKitProductAmountInHistoryForm() throws Exception { RnRForm rnRForm = new RnRForm(); presenter.rnRForm = rnRForm; presenter.isHistoryForm = true; ArrayList<RnrFormItem> rnrFormItemListWrapper = new ArrayList<>(); RnrFormItem rnrFormItem = createRnrFormItem(1); rnrFormItem.setInitialAmount(1000); rnrFormItem.setCalculatedOrderQuantity(400L); rnrFormItemListWrapper.add(rnrFormItem); rnRForm.setRnrFormItemListWrapper(rnrFormItemListWrapper); ArrayList<KitProduct> kitProducts = new ArrayList<>(); KitProduct kitProduct = new KitProduct(); kitProduct.setQuantity(2); kitProduct.setKitCode("kit"); kitProducts.add(kitProduct); when(mockProductRepository.queryKitProductByProductCode("code")).thenReturn(kitProducts); Product product = new Product(); product.setPrimaryName("KitName"); when(mockProductRepository.getByCode("kit")).thenReturn(product); StockCard stockCard = new StockCard(); stockCard.setStockOnHand(100L); when(mockStockRepository.queryStockCardByProductId(product.getId())).thenReturn(stockCard); List<RequisitionFormItemViewModel> viewModelsFromRnrForm = presenter.getViewModelsFromRnrForm(rnRForm); assertThat(viewModelsFromRnrForm.size(), is(1)); assertThat(viewModelsFromRnrForm.get(0).getAdjustedTotalRequest(), is("400")); assertNull(viewModelsFromRnrForm.get(0).getAdjustmentViewModels()); } @Test public void shouldNotAddAdjustItemsWhenKitIsNotFound() throws LMISException { RnRForm rnRForm = new RnRForm(); presenter.rnRForm = rnRForm; List<RnrFormItem> rnrFormItemListWrapper = new ArrayList<>(); RnrFormItem rnrFormItem = createRnrFormItem(1); rnrFormItem.setInitialAmount(1000); rnrFormItem.setCalculatedOrderQuantity(500L); rnrFormItemListWrapper.add(rnrFormItem); rnRForm.setRnrFormItemListWrapper(rnrFormItemListWrapper); ArrayList<KitProduct> kitProducts = new ArrayList<>(); KitProduct kitProduct = new KitProduct(); kitProduct.setQuantity(2); kitProduct.setKitCode("kit"); kitProducts.add(kitProduct); when(mockProductRepository.queryKitProductByProductCode("code")).thenReturn(kitProducts); Product product = new Product(); product.setPrimaryName("KitName"); when(mockProductRepository.getByCode("kit")).thenReturn(product); when(mockStockRepository.queryStockCardByProductId(product.getId())).thenReturn(null); List<RequisitionFormItemViewModel> viewModelsFromRnrForm = presenter.getViewModelsFromRnrForm(rnRForm); assertThat(viewModelsFromRnrForm.size(), is(1)); assertThat(viewModelsFromRnrForm.get(0).getAdjustmentViewModels().size(), is(0)); } @Test public void shouldInitEmergencyRnr() throws Exception { ArrayList<StockCard> stockCards = newArrayList(); Date periodEndDate = new Date(); RnRForm rnRForm = new RnRForm(); when(mockRnrFormRepository.initEmergencyRnrForm(periodEndDate, stockCards)).thenReturn(rnRForm); ArrayList<RnrFormItem> rnrFormItems = new ArrayList<>(); when(mockRnrFormRepository.generateRnrFormItems(rnRForm, stockCards)).thenReturn(rnrFormItems); RnRForm rnRForm1 = presenter.initEmergencyRnr(stockCards, periodEndDate); org.junit.Assert.assertThat(rnRForm1.getRnrFormItemListWrapper(), Is.<List<RnrFormItem>>is(rnrFormItems)); verify(mockRnrFormRepository, never()).createRnRsWithItems(newArrayList(rnRForm)); } @Test public void shouldOnlyUpdateUIWhenProcessEmergencyAndDraftSignature() throws Exception { presenter = spy(presenter); RnRForm rnRForm = new RnRForm(); rnRForm.setStatus(RnRForm.STATUS.DRAFT); rnRForm.setEmergency(true); presenter.rnRForm = rnRForm; presenter.processSign("sign"); verify(presenter).updateUIAfterSubmit(); reset(presenter); presenter.processSign("sign"); verify(presenter, never()).updateUIAfterSubmit(); } @Test public void shouldCreateAndUpdateRnrFormWhenAuthoriseEmergencyViaForm() throws Exception { RnRForm rnRForm = new RnRForm(); rnRForm.setEmergency(true); presenter.rnRForm = rnRForm; TestSubscriber<Void> testSubscriber = new TestSubscriber<>(); presenter.createOrUpdateRnrForm().subscribe(testSubscriber); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); verify(mockRnrFormRepository).createOrUpdateWithItems(rnRForm); } @Test public void shouldNotCreateAndUpdateRnrFormWhenAuthoriseNormalViaForm() throws Exception { RnRForm rnRForm = new RnRForm(); presenter.rnRForm = rnRForm; rnRForm.setEmergency(false); TestSubscriber<Void> testSubscriber = new TestSubscriber<>(); presenter.createOrUpdateRnrForm().subscribe(testSubscriber); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); verify(mockRnrFormRepository, never()).createAndRefresh(rnRForm); verify(mockRnrFormRepository).createOrUpdateWithItems(rnRForm); } @Test public void shouldAddNewlyAddedProductsOnVIAFormAsStockCards() throws Exception { RnRForm rnRForm = new RnRForm(); rnRForm.setStatus(RnRForm.STATUS.AUTHORIZED); rnRForm.setRnrFormItemListWrapper(newArrayList(createRnrFormItem(1))); presenter.rnRForm = rnRForm; RnrFormItem item1 = createRnrFormItem(2); RnrFormItem item2 = createRnrFormItem(3); RnrFormItem item3 = createRnrFormItem(4); when(mockRnrFormItemRepository.listAllNewRnrItems()).thenReturn(newArrayList(item1, item2, item3)); presenter.createStockCardsOrUnarchiveAndAddToFormForAdditionalRnrItems(); ArgumentCaptor<StockCard> captor = ArgumentCaptor.forClass(StockCard.class); verify(mockStockRepository, times(3)).createOrUpdateStockCardWithStockMovement(captor.capture()); List<StockCard> captorAllValues = captor.getAllValues(); assertThat((captorAllValues.get(0)).getProduct().getId(), is(2L)); assertThat((captorAllValues.get(1)).getProduct().getId(), is(3L)); assertThat((captorAllValues.get(2)).getProduct().getId(), is(4L)); assertThat(rnRForm.getRnrFormItemListWrapper().size(), is(4)); } @Test public void shouldDeleteNewRnrFormItem() throws Exception { Product product = new Product(); RnrFormItem rnrFormItem = new RnrFormItemBuilder().setProduct(product).setRequestAmount(100L).build(); TestSubscriber<Void> testSubscriber = new TestSubscriber<>(); presenter.removeRnrItem(rnrFormItem).subscribe(testSubscriber); testSubscriber.awaitTerminalEvent(); testSubscriber.assertNoErrors(); verify(mockRnrFormItemRepository).deleteRnrItem(rnrFormItem); } @Test public void shouldPopulateAdditionalRnrFormItemsViewModels() throws Exception { presenter.requisitionFormItemViewModels = new ArrayList<>(); Product product1 = new ProductBuilder().setCode("P1").setIsActive(true).setIsArchived(true).build(); Product product2 = new ProductBuilder().setCode("P2").setIsActive(true).setIsArchived(false).build(); RnrFormItem rnrFormItem1 = new RnrFormItemBuilder().setProduct(product1).setRequestAmount(100L).build(); RnrFormItem rnrFormItem2 = new RnrFormItemBuilder().setProduct(product2).setRequestAmount(200L).build(); when(mockProductRepository.getByCode("P1")).thenReturn(new ProductBuilder().setCode("P1").setIsActive(true).setIsArchived(false).build()); when(mockProductRepository.getByCode("P2")).thenReturn(new ProductBuilder().setCode("P2").setIsActive(true).setIsArchived(true).build()); StockCard stockCard = new StockCard(); stockCard.setId(1L); when(mockStockRepository.queryStockCardByProductId(anyLong())).thenReturn(stockCard); presenter.populateAdditionalDrugsViewModels(newArrayList(rnrFormItem1, rnrFormItem2), new Date()); assertThat(presenter.requisitionFormItemViewModels.size(), is(2)); assertThat(presenter.requisitionFormItemViewModels.get(0).getFmn(), is("P1")); assertThat(presenter.requisitionFormItemViewModels.get(1).getFmn(), is("P2")); assertThat(presenter.requisitionFormItemViewModels.get(0).getRequestAmount(), is("100")); assertThat(presenter.requisitionFormItemViewModels.get(1).getRequestAmount(), is("200")); assertThat(presenter.requisitionFormItemViewModels.get(0).getApprovedAmount(), is("100")); assertThat(presenter.requisitionFormItemViewModels.get(1).getApprovedAmount(), is("200")); } @Test public void shouldAssignValuesToSelectedArchivedProducts() throws Exception { Date periodBegin = DateUtil.parseString("2016-01-21", DateUtil.DB_DATE_FORMAT); Date periodEnd = DateUtil.parseString("2016-02-20", DateUtil.DB_DATE_FORMAT); Product product1 = new ProductBuilder().setCode("P1").setIsActive(true).setIsArchived(true).build(); Product product2 = new ProductBuilder().setCode("P2").setIsActive(true).setIsArchived(false).build(); RnrFormItem rnrFormItem1 = new RnrFormItemBuilder().setProduct(product1).setRequestAmount(100L).build(); RnrFormItem rnrFormItem2 = new RnrFormItemBuilder().setProduct(product2).setRequestAmount(200L).build(); when(mockProductRepository.getByCode("P1")).thenReturn(product1); when(mockProductRepository.getByCode("P2")).thenReturn(product2); StockCard stockCard = new StockCardBuilder().setStockOnHand(0L).setProduct(product1).build(); StockMovementItem stockMovementItem1 = new StockMovementItemBuilder().withStockOnHand(50).withQuantity(10).withMovementType(MovementReasonManager.MovementType.ISSUE).withDocumentNo("123").build(); StockMovementItem stockMovementItem2 = new StockMovementItemBuilder().build(); StockMovementItem stockMovementItem3 = new StockMovementItemBuilder().build(); when(mockStockRepository.queryStockCardByProductId(product1.getId())).thenReturn(stockCard); when(mockStockMovementRepository.queryStockItemsByCreatedDate(stockCard.getId(), periodBegin, periodEnd)).thenReturn(newArrayList(stockMovementItem1, stockMovementItem2, stockMovementItem3)); presenter.requisitionFormItemViewModels = new ArrayList<>(); presenter.periodEndDate = periodEnd; presenter.populateAdditionalDrugsViewModels(newArrayList(rnrFormItem1, rnrFormItem2), periodBegin); assertThat(presenter.requisitionFormItemViewModels.get(0).getInitAmount(), is("60")); } private ViaKitsViewModel buildDefaultViaKit() { ViaKitsViewModel viaKitsViewModel = new ViaKitsViewModel(); viaKitsViewModel.setKitsOpenedCHW("10"); viaKitsViewModel.setKitsReceivedCHW("20"); viaKitsViewModel.setKitsOpenedHF("30"); viaKitsViewModel.setKitsReceivedHF("40"); Product usKit = new ProductBuilder().setCode(ViaKitsViewModel.US_KIT).build(); Product apeKit = new ProductBuilder().setCode(ViaKitsViewModel.APE_KIT).build(); viaKitsViewModel.setKitItems(Lists.newArrayList(new RnrFormItemBuilder().setProduct(usKit).build(), new RnrFormItemBuilder().setProduct(apeKit).build())); return viaKitsViewModel; } private void updateFormUIWithStatus(RnRForm.STATUS status) { RnRForm form = new RnRForm(); form.setStatus(status); presenter.rnRForm = form; presenter.updateFormUI(); } private RnrFormItem createRnrFormItem(int i) { Product product = new Product(); product.setId(i); product.setCode("code"); RnrFormItem rnrFormItem = new RnrFormItem(); rnrFormItem.setInventory(1000); rnrFormItem.setIssued(i); rnrFormItem.setProduct(product); return rnrFormItem; } public class MyTestModule extends AbstractModule { @Override protected void configure() { bind(VIARepository.class).toInstance(mockRnrFormRepository); bind(ProductRepository.class).toInstance(mockProductRepository); bind(StockRepository.class).toInstance(mockStockRepository); bind(RnrFormItemRepository.class).toInstance(mockRnrFormItemRepository); bind(StockMovementRepository.class).toInstance(mockStockMovementRepository); } } }