package org.openlmis.core.presenter;
import android.support.annotation.NonNull;
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.model.Product;
import org.openlmis.core.model.RnrFormItem;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.model.helper.RnrFormHelper;
import org.openlmis.core.model.repository.ProductProgramRepository;
import org.openlmis.core.model.repository.ProductRepository;
import org.openlmis.core.model.repository.ProgramRepository;
import org.openlmis.core.model.repository.RnrFormItemRepository;
import org.openlmis.core.model.repository.StockRepository;
import org.openlmis.core.view.viewmodel.AddDrugsToViaInventoryViewModel;
import org.openlmis.core.view.viewmodel.InventoryViewModel;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import roboguice.RoboGuice;
import rx.Observable;
import rx.observers.TestSubscriber;
import static org.assertj.core.util.Lists.newArrayList;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class AddDrugsToVIAPresenterTest {
private AddDrugsToVIAPresenter presenter;
private ProductRepository productRepository;
private ProgramRepository programRepository;
private ProductProgramRepository productProgramRepository;
private RnrFormItemRepository rnrFormItemRepository;
private StockRepository stockRepository;
private RnrFormHelper rnrFormHelper;
@Before
public void setup() throws Exception {
productRepository = mock(ProductRepository.class);
programRepository = mock(ProgramRepository.class);
productProgramRepository = mock(ProductProgramRepository.class);
rnrFormItemRepository = mock(RnrFormItemRepository.class);
stockRepository = mock(StockRepository.class);
rnrFormHelper = mock(RnrFormHelper.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() {
@Override
protected void configure() {
bind(ProductRepository.class).toInstance(productRepository);
bind(ProgramRepository.class).toInstance(programRepository);
bind(ProductProgramRepository.class).toInstance(productProgramRepository);
bind(RnrFormItemRepository.class).toInstance(rnrFormItemRepository);
bind(StockRepository.class).toInstance(stockRepository);
bind(RnrFormHelper.class).toInstance(rnrFormHelper);
}
});
presenter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(AddDrugsToVIAPresenter.class);
}
@Test
public void loadActiveProductsNotInVIAForm() throws Exception {
Product product1 = new ProductBuilder().setCode("P1").setPrimaryName("A1").build();
Product product2 = new ProductBuilder().setCode("P2").setPrimaryName("A2").build();
Product product3 = new ProductBuilder().setCode("P3").setPrimaryName("A3").build();
Product product4 = new ProductBuilder().setCode("P4").setPrimaryName("A4").build();
when(productRepository.queryActiveProductsInVIAProgramButNotInDraftVIAForm()).thenReturn(newArrayList(product1, product2, product3, product4));
TestSubscriber<Void> subscriber = new TestSubscriber<>();
presenter.loadActiveProductsNotInVIAForm(newArrayList("P3", "P4")).subscribe(subscriber);
subscriber.awaitTerminalEvent();
subscriber.assertNoErrors();
assertThat(presenter.getInventoryViewModelList().size(), is(2));
assertThat(presenter.getInventoryViewModelList().get(0).getProductName(), is("A1"));
assertThat(presenter.getInventoryViewModelList().get(1).getProductName(), is("A2"));
}
@Test
public void shouldConvertViewModelsToRnrFormList() throws Exception {
InventoryViewModel inventoryViewModel1 = buildInventoryViewModel("P1", "12");
inventoryViewModel1.setChecked(true);
InventoryViewModel inventoryViewModel2 = buildInventoryViewModel("P2", "34");
inventoryViewModel2.setChecked(true);
when(productRepository.getByCode("P1")).thenReturn(new ProductBuilder().setCode("P1").setIsActive(true).setIsArchived(false).build());
when(productRepository.getByCode("P2")).thenReturn(new ProductBuilder().setCode("P2").setIsActive(true).setIsArchived(true).build());
presenter.getInventoryViewModelList().addAll(newArrayList(inventoryViewModel1, inventoryViewModel2));
TestSubscriber<ArrayList<RnrFormItem>> subscriber = new TestSubscriber<>();
Observable observable = presenter.convertViewModelsToRnrFormItems();
observable.subscribe(subscriber);
subscriber.awaitTerminalEvent();
subscriber.assertNoErrors();
assertThat(subscriber.getOnNextEvents().get(0).size(), is(2));
assertThat(subscriber.getOnNextEvents().get(0).get(0).getProduct().getCode(), is("P1"));
assertThat(subscriber.getOnNextEvents().get(0).get(0).getRequestAmount(), is(12L));
assertThat(subscriber.getOnNextEvents().get(0).get(1).getProduct().getCode(), is("P2"));
assertThat(subscriber.getOnNextEvents().get(0).get(1).getRequestAmount(), is(34L));
}
@NonNull
private InventoryViewModel buildInventoryViewModel(String productCode, String quantity) {
Product product1 = new ProductBuilder().setCode(productCode).setPrimaryName("product 1").setIsActive(true).build();
AddDrugsToViaInventoryViewModel inventoryViewModel1 = new AddDrugsToViaInventoryViewModel(product1);
inventoryViewModel1.setQuantity(quantity);
return inventoryViewModel1;
}
}