package org.openlmis.core.view.holder;
import android.view.LayoutInflater;
import android.view.View;
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.Lot;
import org.openlmis.core.model.LotOnHand;
import org.openlmis.core.model.Product;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.model.builder.StockCardBuilder;
import org.openlmis.core.model.service.StockService;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.viewmodel.InventoryViewModel;
import org.robolectric.RuntimeEnvironment;
import java.util.Date;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@RunWith(LMISTestRunner.class)
public class StockCardViewHolderTest {
private StockCardViewHolder viewHolder;
private StockCardViewHolder.OnItemViewClickListener mockedListener;
private StockService stockService;
protected StockCard stockCard;
@Before
public void setUp() {
mockedListener = mock(StockCardViewHolder.OnItemViewClickListener.class);
View view = LayoutInflater.from(RuntimeEnvironment.application).inflate(R.layout.item_stockcard, null, false);
viewHolder = new StockCardViewHolder(view, mockedListener);
stockService = mock(StockService.class);
viewHolder.stockService = stockService;
stockCard = new StockCard();
final Product product = new Product();
product.setPrimaryName("product");
stockCard.setProduct(product);
}
@Test
public void shouldShowIconWhenExpireDateInCurrentMonth() throws Exception {
StockCard stockCard = StockCardBuilder.buildStockCard();
Lot lot = new Lot();
lot.setExpirationDate(DateUtil.parseString("2016-02-16", DateUtil.DB_DATE_FORMAT));
LotOnHand lotOnHand = new LotOnHand(lot, stockCard, 100L);
stockCard.getLotOnHandListWrapper().add(lotOnHand);
InventoryViewModel inventoryViewModel = new InventoryViewModel(stockCard);
Date mockCurrentDate = DateUtil.parseString("15/02/2016", DateUtil.SIMPLE_DATE_FORMAT);
LMISTestApp.getInstance().setCurrentTimeMillis(mockCurrentDate.getTime());
viewHolder.populate(inventoryViewModel, "");
assertThat(viewHolder.lyExpiryDateWarning.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void shouldShowIconWhenExpireDateBeforeCurrentTime() throws Exception {
StockCard stockCard = StockCardBuilder.buildStockCard();
Lot lot = new Lot();
lot.setExpirationDate(DateUtil.parseString("2016-01-14", DateUtil.DB_DATE_FORMAT));
LotOnHand lotOnHand = new LotOnHand(lot, stockCard, 100L);
stockCard.getLotOnHandListWrapper().add(lotOnHand);
InventoryViewModel inventoryViewModel = new InventoryViewModel(stockCard);
Date mockCurrentDate = DateUtil.parseString("16/02/2016", DateUtil.SIMPLE_DATE_FORMAT);
LMISTestApp.getInstance().setCurrentTimeMillis(mockCurrentDate.getTime());
viewHolder.populate(inventoryViewModel, "");
assertThat(viewHolder.lyExpiryDateWarning.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void shouldHideIconWhenExpireDateAfterThreeMonthsWithCurrentTime() throws Exception {
StockCard stockCard = StockCardBuilder.buildStockCard();
Lot lot = new Lot();
lot.setExpirationDate(DateUtil.parseString("2016-06-17", DateUtil.DB_DATE_FORMAT));
LotOnHand lotOnHand = new LotOnHand(lot, stockCard, 100L);
stockCard.getLotOnHandListWrapper().add(lotOnHand);
InventoryViewModel inventoryViewModel = new InventoryViewModel(stockCard);
Date mockCurrentDate = DateUtil.parseString("16/02/2016", DateUtil.SIMPLE_DATE_FORMAT);
LMISTestApp.getInstance().setCurrentTimeMillis(mockCurrentDate.getTime());
viewHolder.populate(inventoryViewModel, "");
assertThat(viewHolder.lyExpiryDateWarning.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void shouldHideExpiryNotifyIconWhenExpiryDateIsEmpty() {
Date mockCurrentDate = DateUtil.parseString("16/02/2016", DateUtil.SIMPLE_DATE_FORMAT);
LMISTestApp.getInstance().setCurrentTimeMillis(mockCurrentDate.getTime());
StockCard stockCard = StockCardBuilder.buildStockCard();
// The expiry date icon shows in the previous view
InventoryViewModel inventoryViewModel = new InventoryViewModel(stockCard);
viewHolder.populate(inventoryViewModel, "");
// Reuse the view with the empty expiry dates
InventoryViewModel secondInventoryViewModel = new InventoryViewModel(stockCard);
viewHolder.populate(secondInventoryViewModel, "");
assertThat(viewHolder.lyExpiryDateWarning.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void shouldNotShowExpiryDateWarningWhenStockOnHandIsZero() {
Date mockCurrentDate = DateUtil.parseString("16/02/2016", DateUtil.SIMPLE_DATE_FORMAT);
LMISTestApp.getInstance().setCurrentTimeMillis(mockCurrentDate.getTime());
StockCard stockCard = StockCardBuilder.buildStockCard();
stockCard.setStockOnHand(0);
InventoryViewModel inventoryViewModel = new InventoryViewModel(stockCard);
viewHolder.inflateData(inventoryViewModel, "");
assertThat(viewHolder.lyExpiryDateWarning.getVisibility()).isEqualTo(View.GONE);
}
}