package org.openlmis.core.network.adapter;
import com.google.gson.JsonParser;
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.LotMovementItem;
import org.openlmis.core.model.LotOnHand;
import org.openlmis.core.model.Product;
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.StockCardBuilder;
import org.openlmis.core.model.builder.StockMovementItemBuilder;
import org.openlmis.core.model.repository.ProductRepository;
import org.openlmis.core.model.repository.ProgramRepository;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.utils.JsonFileReader;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List;
import roboguice.RoboGuice;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class StockCardAdapterTest {
private StockCardAdapter stockCardAdapter;
private ProductRepository mockProductRepository;
private ProgramRepository mockProgramRepository;
private StockCard stockCard;
private List<StockMovementItem> wrapper;
private StockMovementItem item1;
private StockMovementItem item2;
private StockMovementItem item3;
@Before
public void setUp() throws Exception {
mockProductRepository = mock(ProductRepository.class);
mockProgramRepository = mock(ProgramRepository.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule());
stockCardAdapter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(StockCardAdapter.class);
stockCard = StockCardBuilder.buildStockCard();
wrapper = new ArrayList<>();
StockMovementItemBuilder builder = new StockMovementItemBuilder();
item1 = builder.build();
item2 = builder.build();
item3 = builder.build();
wrapper.add(item1);
wrapper.add(item2);
wrapper.add(item3);
}
@Test
public void shouldDeserializeStockCard() throws Exception {
Product product = ProductBuilder.buildAdultProduct();
product.setCode("08S42");
when(mockProductRepository.getByCode("08S42")).thenReturn(product);
String json = JsonFileReader.readJson(getClass(), "StockCardWithMovement.json");
StockCard stockCard = stockCardAdapter.deserialize(new JsonParser().parse(json), null, null);
assertNotNull(json);
assertThat(stockCard.getStockOnHand(), is(480L));
assertThat(stockCard.getProduct().getCode(), is("08S42"));
List<StockMovementItem> stockMovementItemsWrapper = stockCard.getStockMovementItemsWrapper();
assertThat(stockMovementItemsWrapper.size(), is(3));
}
@Test
public void shouldDeserializeStockCardWithLots() throws Exception {
Product product = ProductBuilder.buildAdultProduct();
product.setCode("08R01");
when(mockProductRepository.getByCode("08R01")).thenReturn(product);
String json = JsonFileReader.readJson(getClass(), "StockCardResponseWithLots.json");
StockCard stockCard = stockCardAdapter.deserialize(new JsonParser().parse(json), null, null);
assertNotNull(json);
List<LotOnHand> lotsOnHandWrapper = stockCard.getLotOnHandListWrapper();
assertThat(lotsOnHandWrapper.size(), is(2));
assertThat(lotsOnHandWrapper.get(0).getLot().getLotNumber(), is("test3"));
assertThat(lotsOnHandWrapper.get(0).getQuantityOnHand(), is(300L));
assertThat(lotsOnHandWrapper.get(0).getLot().getExpirationDate(), is(DateUtil.parseString("2016-07-31", DateUtil.DB_DATE_FORMAT)));
List<StockMovementItem> stockMovementItems = stockCard.getStockMovementItemsWrapper();
assertEquals(1, stockMovementItems.size());
assertEquals(700, stockMovementItems.get(0).getMovementQuantity());
assertEquals(700, stockMovementItems.get(0).getStockOnHand());
List<LotMovementItem> lotMovementItems = stockMovementItems.get(0).getLotMovementItemListWrapper();
assertEquals(2, lotMovementItems.size());
assertThat(lotMovementItems.get(0).getMovementQuantity(), is(300L));
assertThat(lotMovementItems.get(1).getMovementQuantity(), is(400L));
assertEquals("08R01", lotMovementItems.get(0).getLot().getProduct().getCode());
assertEquals("08R01", lotMovementItems.get(1).getLot().getProduct().getCode());
}
@Test
public void shouldSetupExpireDate() {
item1.setExpireDates("2015-02-15");
item2.setExpireDates("2015-03-15");
item3.setExpireDates("2015-04-15");
stockCard.setStockMovementItemsWrapper(wrapper);
stockCardAdapter.setupStockCardExpireDates(stockCard);
assertThat(stockCard.getExpireDates(), is(item3.getExpireDates()));
}
public class MyTestModule extends AbstractModule {
@Override
protected void configure() {
bind(ProductRepository.class).toInstance(mockProductRepository);
bind(ProgramRepository.class).toInstance(mockProgramRepository);
}
}
}