package org.openlmis.core.model.repository;
import android.support.annotation.NonNull;
import org.hamcrest.core.Is;
import org.joda.time.DateTime;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.model.DraftInventory;
import org.openlmis.core.model.DraftLotItem;
import org.openlmis.core.model.Inventory;
import org.openlmis.core.model.Lot;
import org.openlmis.core.model.LotMovementItem;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.Product;
import org.openlmis.core.model.ProductProgram;
import org.openlmis.core.model.Program;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.model.StockMovementItem;
import org.openlmis.core.model.builder.LotBuilder;
import org.openlmis.core.model.builder.LotMovementItemBuilder;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.model.builder.ProductProgramBuilder;
import org.openlmis.core.model.builder.ProgramBuilder;
import org.openlmis.core.model.builder.StockMovementItemBuilder;
import org.openlmis.core.utils.DateUtil;
import org.robolectric.RuntimeEnvironment;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import roboguice.RoboGuice;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.openlmis.core.manager.MovementReasonManager.MovementType.RECEIVE;
import static org.roboguice.shaded.goole.common.collect.Lists.newArrayList;
@RunWith(LMISTestRunner.class)
public class InventoryRepositoryTest {
private InventoryRepository repository;
private StockRepository stockRepository;
private ProgramRepository programRepository;
private ProductRepository productRepository;
private ProductProgramRepository productProgramRepository;
@Before
public void setup() throws LMISException {
repository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(InventoryRepository.class);
stockRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(StockRepository.class);
programRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramRepository.class);
productRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductRepository.class);
productProgramRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductProgramRepository.class);
}
@Test
public void shouldQueryPeriodInventory() throws Exception {
repository.save(getInventory(DateUtil.parseString("2016-01-22 11:33:44", DateUtil.DATE_TIME_FORMAT)));
repository.save(getInventory(DateUtil.parseString("2016-02-01 11:33:44", DateUtil.DATE_TIME_FORMAT)));
repository.save(getInventory(DateUtil.parseString("2016-02-18 11:33:44", DateUtil.DATE_TIME_FORMAT)));
repository.save(getInventory(DateUtil.parseString("2016-02-22 11:33:44", DateUtil.DATE_TIME_FORMAT)));
repository.save(getInventory(DateUtil.parseString("2016-02-25 11:33:44", DateUtil.DATE_TIME_FORMAT)));
repository.save(getInventory(DateUtil.parseString("2016-02-26 11:33:44", DateUtil.DATE_TIME_FORMAT)));
List<Inventory> inventories = repository.queryPeriodInventory(new Period(new DateTime("2016-01-21"), new DateTime("2016-02-20")));
assertThat(inventories.size(), is(3));
assertThat(inventories.get(0).getCreatedAt(), is(DateUtil.parseString("2016-02-25 11:33:44", DateUtil.DATE_TIME_FORMAT)));
}
@Test
public void shouldSaveDraftInventoryAndDraftLotItem() throws LMISException, ParseException {
Product product = ProductBuilder.create().setProductId(1L).setCode("p1").setIsActive(true).setIsKit(false).build();
StockCard stockCard = createNewStockCard("code", null, product, true);
StockMovementItem stockMovementItem1 = new StockMovementItemBuilder().withMovementDate("2016-10-10").withMovementType(RECEIVE).build();
Lot lot1 = new LotBuilder().setLotNumber("A111").setProduct(stockCard.getProduct()).build();
LotMovementItem lotMovementItem1 = new LotMovementItemBuilder().setStockMovementItem(stockMovementItem1).setLot(lot1).setMovementQuantity(100L).setStockOnHand(0L).build();
stockMovementItem1.setLotMovementItemListWrapper(newArrayList(lotMovementItem1));
stockMovementItem1.setStockCard(stockCard);
stockRepository.addStockMovementAndUpdateStockCard(stockMovementItem1);
DraftInventory draftInventory = new DraftInventory();
draftInventory.setStockCard(stockCard);
DraftLotItem draftLotItem = new DraftLotItem();
draftLotItem.setProduct(product);
draftLotItem.setLotNumber("A111");
draftLotItem.setExpirationDate(new Date());
draftLotItem.setDraftInventory(draftInventory);
draftLotItem.setNewAdded(false);
draftLotItem.setQuantity(20L);
draftInventory.setDraftLotItemListWrapper(newArrayList(draftLotItem));
draftInventory.setQuantity(20L);
draftInventory.setExpireDates("Feb 2015");
repository.createDraft(draftInventory);
DraftInventory draftInventoryQueried = repository.queryAllDraft().get(0);
assertThat(draftInventoryQueried.getDraftLotItemListWrapper().get(0).getLotNumber(), is("A111"));
assertThat(draftInventoryQueried.getDraftLotItemListWrapper().get(0).getProduct(), is(product));
assertThat(draftInventoryQueried.getDraftLotItemListWrapper().get(0).getExpirationDate(), is(DateUtil.parseString(DateUtil.formatDate(new Date(), DateUtil.DB_DATE_FORMAT),DateUtil.DB_DATE_FORMAT)));
assertThat(draftInventoryQueried.getStockCard().getProduct(), is(product));
assertThat(draftInventoryQueried.getDraftLotItemListWrapper().get(0).isNewAdded(), is(false));
assertThat(draftInventoryQueried.getDraftLotItemListWrapper().get(0).getQuantity(), is(20L));
}
@Test
public void shouldClearDraftInventory() throws Exception {
saveDraftInventory();
Assert.assertThat(repository.queryAllDraft().size(), Is.is(2));
repository.clearDraft();
Assert.assertThat(repository.queryAllDraft().size(), Is.is(0));
}
@NonNull
private Inventory getInventory(Date date) {
Inventory inventory = new Inventory();
inventory.setCreatedAt(date);
inventory.setUpdatedAt(date);
return inventory;
}
private void saveDraftInventory() throws LMISException {
DraftInventory draftInventory1 = new DraftInventory();
draftInventory1.setQuantity(10L);
draftInventory1.setExpireDates("11/10/2015");
DraftInventory draftInventory2 = new DraftInventory();
draftInventory2.setQuantity(20L);
draftInventory2.setExpireDates("12/10/2015");
repository.createDraft(draftInventory1);
repository.createDraft(draftInventory2);
}
private StockCard createNewStockCard(String code, String parentCode, Product product, boolean isEmergency) throws LMISException {
StockCard stockCard = new StockCard();
Program program = createNewProgram(code, parentCode, isEmergency);
programRepository.createOrUpdate(program);
productRepository.createOrUpdate(product);
ProductProgram productProgram = new ProductProgramBuilder()
.setProductCode(product.getCode())
.setProgramCode(program.getProgramCode())
.setActive(true).build();
productProgramRepository.createOrUpdate(productProgram);
stockCard.setProduct(product);
stockCard.setCreatedAt(new Date());
stockRepository.createOrUpdate(stockCard);
return stockCard;
}
@NonNull
private Program createNewProgram(String code, String parentCode, boolean isSupportEmergency) throws LMISException {
Program program = new ProgramBuilder().setProgramCode(code).setParentCode(parentCode).setSupportEmergency(isSupportEmergency).build();
programRepository.createOrUpdate(program);
return program;
}
}