package org.openlmis.core.view.activity;
import android.content.Intent;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.inject.AbstractModule;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestApp;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.R;
import org.openlmis.core.model.Product;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.presenter.ProductPresenter;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.view.holder.SelectEmergencyProductsViewHolder;
import org.openlmis.core.view.viewmodel.InventoryViewModel;
import org.openlmis.core.view.widget.SingleClickButtonListener;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowToast;
import java.util.ArrayList;
import java.util.List;
import roboguice.RoboGuice;
import rx.Observable;
import rx.Subscriber;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
@RunWith(LMISTestRunner.class)
public class SelectEmergencyProductsActivityTest {
private SelectEmergencyProductsActivity activity;
private ProductPresenter productPresenter;
@Before
public void setUp() throws Exception {
productPresenter = mock(ProductPresenter.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() {
@Override
protected void configure() {
bind(ProductPresenter.class).toInstance(productPresenter);
}
});
when(productPresenter.loadEmergencyProducts()).thenReturn(createDummyObservable());
activity = Robolectric.buildActivity(SelectEmergencyProductsActivity.class).create().start().resume().visible().get();
}
@Test
public void shouldLoadEmergencyProducts() throws Exception {
verify(productPresenter).loadEmergencyProducts();
}
@Test
public void shouldShowToastWhenHasNotChecked() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(100000);
SingleClickButtonListener.isViewClicked = false;
activity.mAdapter.refreshList(getInventoryViewModels());
activity.btnNext.performClick();
assertThat(ShadowToast.getTextOfLatestToast(), is("Please select product"));
}
@Test
public void shouldShowToastWhenMoreThanLimitChecked() throws Exception {
ArrayList<InventoryViewModel> inventoryViewModels = getInventoryViewModels();
for (InventoryViewModel model : inventoryViewModels) {
model.setChecked(true);
}
inventoryViewModels.add(new InventoryViewModel(new ProductBuilder().setPrimaryName("Product name").setCode(String.valueOf("code")).build()));
activity.mAdapter.refreshList(inventoryViewModels);
activity.mAdapter.notifyDataSetChanged();
SelectEmergencyProductsViewHolder viewHolder = activity.mAdapter.onCreateViewHolder(new LinearLayout(activity), 0);
activity.mAdapter.onBindViewHolder(viewHolder, 10);
viewHolder.itemView.findViewById(R.id.touchArea_checkbox).performClick();
assertThat(ShadowToast.getTextOfLatestToast(), is("You can only select 10 products for an emergency requisition"));
}
@Test
public void shouldInflateCurrentDataAfterFilter() throws Exception {
activity.mAdapter.refreshList(getInventoryViewModels());
activity.mAdapter.filter("8");
SelectEmergencyProductsViewHolder viewHolder = activity.mAdapter.onCreateViewHolder(new LinearLayout(activity), 0);
activity.mAdapter.onBindViewHolder(viewHolder, 0);
String actualValue = ((TextView) viewHolder.itemView.findViewById(R.id.tv_product_name)).getText().toString();
assertThat(actualValue, is(activity.mAdapter.getFilteredList().get(0).getStyledName().toString()));
}
@Test
public void shouldGoToNextPage() throws Exception {
LMISTestApp.getInstance().setCurrentTimeMillis(100000);
SingleClickButtonListener.isViewClicked = false;
ArrayList<InventoryViewModel> inventoryViewModels = getInventoryViewModels();
activity.mAdapter.refreshList(inventoryViewModels);
inventoryViewModels.get(0).setChecked(true);
StockCard stockCard = new StockCard();
stockCard.setId(100);
inventoryViewModels.get(0).setStockCard(stockCard);
activity.btnNext.performClick();
Intent startedIntent = shadowOf(activity).getNextStartedActivity();
MatcherAssert.assertThat(startedIntent.getComponent().getClassName(), equalTo(VIARequisitionActivity.class.getName()));
ArrayList<StockCard> stockCards = (ArrayList<StockCard>) startedIntent.getSerializableExtra(Constants.PARAM_SELECTED_EMERGENCY);
MatcherAssert.assertThat(stockCards.get(0).getId(), Matchers.is(100L));
}
private ArrayList<InventoryViewModel> getInventoryViewModels() {
ArrayList<InventoryViewModel> inventoryViewModels = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Product product = new ProductBuilder().setPrimaryName("Product name").setCode(String.valueOf(i)).build();
inventoryViewModels.add(new InventoryViewModel(product));
}
return inventoryViewModels;
}
private Observable<List<InventoryViewModel>> createDummyObservable() {
return Observable.create(new Observable.OnSubscribe<List<InventoryViewModel>>() {
@Override
public void call(Subscriber<? super List<InventoryViewModel>> subscriber) {
}
});
}
}