package org.openlmis.rnr.repository.mapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.openlmis.core.builder.ProcessingPeriodBuilder;
import org.openlmis.core.builder.ProductBuilder;
import org.openlmis.core.builder.ProgramBuilder;
import org.openlmis.core.domain.*;
import org.openlmis.core.repository.mapper.*;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.db.categories.IntegrationTests;
import org.openlmis.rnr.builder.RegimenLineItemBuilder;
import org.openlmis.rnr.domain.RegimenLineItem;
import org.openlmis.rnr.domain.Rnr;
import org.openlmis.rnr.domain.RnrLineItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static com.natpryce.makeiteasy.MakeItEasy.*;
import static org.junit.Assert.assertEquals;
import static org.openlmis.core.builder.FacilityBuilder.defaultFacility;
import static org.openlmis.core.builder.ProcessingPeriodBuilder.*;
import static org.openlmis.core.builder.ProcessingScheduleBuilder.defaultProcessingSchedule;
import static org.openlmis.rnr.builder.RnrLineItemBuilder.*;
import static org.openlmis.rnr.domain.RnrStatus.INITIATED;
@Category(IntegrationTests.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:test-applicationContext-requisition.xml")
@TransactionConfiguration(defaultRollback = true, transactionManager = "openLmisTransactionManager")
@Transactional
public class RnrMapperForSIMAMIT {
@Autowired
private FacilityMapper facilityMapper;
@Autowired
private ProcessingPeriodMapper processingPeriodMapper;
@Autowired
private ProcessingScheduleMapper processingScheduleMapper;
@Autowired
private ProgramMapper programMapper;
@Autowired
private ProductCategoryMapper productCategoryMapper;
@Autowired
private RequisitionMapper requisitionMapper;
@Autowired
private RnrLineItemMapper rnrLineItemMapper;
@Autowired
private ProductMapper productMapper;
@Autowired
private ProgramProductMapper programProductMapper;
@Autowired
private RnrMapperForSIMAM rnrMapperForSIMAM;
@Autowired
private RegimenLineItemMapper regimenLineItemMapper;
private Rnr requisition;
private Program program;
private Facility facility;
private Product product1;
private Product product2;
private RnrLineItem rnrLineItem1;
private RnrLineItem rnrLineItem2;
@Before
public void setUp() {
facility = make(a(defaultFacility));
facilityMapper.insert(facility);
program = make(a(ProgramBuilder.defaultProgram));
programMapper.insert(program);
ProcessingSchedule processingSchedule = make(a(defaultProcessingSchedule));
processingScheduleMapper.insert(processingSchedule);
ProcessingPeriod processingPeriod = make(a(defaultProcessingPeriod,
with(scheduleId, processingSchedule.getId()), with(startDate, new Date()), with(endDate, new Date()),
with(ProcessingPeriodBuilder.name, "Period 1")));
processingPeriodMapper.insert(processingPeriod);
requisition = new Rnr(new Facility(facility.getId()), new Program(program.getId()), processingPeriod, false, MODIFIED_BY, 1L);
requisition.setStatus(INITIATED);
requisitionMapper.insert(requisition);
ProductCategory productCategory = new ProductCategory("C1", "Category 1", 1);
productCategoryMapper.insert(productCategory);
product1 = make(a(ProductBuilder.defaultProduct, with(ProductBuilder.code, "P1"), with(ProductBuilder.fullSupply, true)));
product2 = make(a(ProductBuilder.defaultProduct, with(ProductBuilder.code, "P2"), with(ProductBuilder.fullSupply, true)));
productMapper.insert(product1);
productMapper.insert(product2);
ProgramProduct programProduct1 = new ProgramProduct(program, product1, 1, true);
ProgramProduct programProduct2 = new ProgramProduct(program, product2, 1, true);
programProduct1.setProductCategory(productCategory);
programProduct2.setProductCategory(productCategory);
programProductMapper.insert(programProduct1);
programProductMapper.insert(programProduct2);
rnrLineItem1 = make(a(defaultRnrLineItem, with(fullSupply, true), with(productCode, product1.getCode())));
rnrLineItem2 = make(a(defaultRnrLineItem, with(fullSupply, false), with(productCode, product2.getCode())));
rnrLineItem1.setRnrId(requisition.getId());
rnrLineItem2.setRnrId(requisition.getId());
rnrLineItemMapper.insert(rnrLineItem1, Collections.EMPTY_LIST.toString());
rnrLineItemMapper.insert(rnrLineItem2, Collections.EMPTY_LIST.toString());
rnrLineItemMapper.update(rnrLineItem1);
rnrLineItemMapper.update(rnrLineItem2);
requisitionMapper.update(requisition);
requisition.setClientSubmittedTime(DateUtil.parseDate("2015-11-11 11:11:11"));
requisitionMapper.updateClientFields(requisition);
}
@Test
public void shouldGetRnrItemsForSIMAM() {
List<Map<String, String>> itemsData = rnrMapperForSIMAM.getRnrItemsForSIMAMImport(requisition);
assertEquals(2, itemsData.size());
assertEquals(requisition.getId().intValue(), itemsData.get(0).get("id"));
assertEquals(requisition.getId().intValue(), itemsData.get(1).get("id"));
assertEquals(program.getCode(), itemsData.get(0).get("program_code"));
assertEquals(program.getCode(), itemsData.get(1).get("program_code"));
assertEquals(facility.getName(), itemsData.get(0).get("facility_name"));
assertEquals(facility.getName(), itemsData.get(1).get("facility_name"));
assertEquals("2015-11-11", new SimpleDateFormat("yyyy-MM-dd").format(itemsData.get(0).get("date")));
assertEquals("2015-11-11", new SimpleDateFormat("yyyy-MM-dd").format(itemsData.get(1).get("date")));
assertEquals("a" + product2.getCode(), itemsData.get(0).get("product_code").toString());
assertEquals("a" + product1.getCode(), itemsData.get(1).get("product_code").toString());
assertEquals(rnrLineItem2.getBeginningBalance(), itemsData.get(0).get("beginning_balance"));
assertEquals(rnrLineItem1.getBeginningBalance(), itemsData.get(1).get("beginning_balance"));
assertEquals(rnrLineItem2.getQuantityDispensed(), itemsData.get(0).get("quantity_dispensed"));
assertEquals(rnrLineItem1.getQuantityDispensed(), itemsData.get(1).get("quantity_dispensed"));
assertEquals(rnrLineItem2.getQuantityReceived(), itemsData.get(0).get("quantity_received"));
assertEquals(rnrLineItem1.getQuantityReceived(), itemsData.get(1).get("quantity_received"));
assertEquals(rnrLineItem2.getTotalLossesAndAdjustments(), itemsData.get(0).get("total_losses_and_adjustments"));
assertEquals(rnrLineItem1.getTotalLossesAndAdjustments(), itemsData.get(1).get("total_losses_and_adjustments"));
assertEquals(rnrLineItem2.getStockInHand(), itemsData.get(0).get("stock_in_hand"));
assertEquals(rnrLineItem1.getStockInHand(), itemsData.get(1).get("stock_in_hand"));
assertEquals(rnrLineItem2.getQuantityApproved(), itemsData.get(0).get("quantity_approved"));
assertEquals(rnrLineItem1.getQuantityApproved(), itemsData.get(1).get("quantity_approved"));
}
@Test
public void shouldGetRegimenItemsForSIMAM() {
RegimenLineItem regimenLineItem1 = make(a(RegimenLineItemBuilder.defaultRegimenLineItem,
with(RegimenLineItemBuilder.name, "regimen1"),
with(RegimenLineItemBuilder.patientsOnTreatment, 500)));
regimenLineItem1.setRnrId(requisition.getId());
RegimenLineItem regimenLineItem2 = make(a(RegimenLineItemBuilder.defaultRegimenLineItem,
with(RegimenLineItemBuilder.name, "regimen2"),
with(RegimenLineItemBuilder.patientsOnTreatment, 1000)));
regimenLineItem2.setRnrId(requisition.getId());
regimenLineItemMapper.insert(regimenLineItem1);
regimenLineItemMapper.insert(regimenLineItem2);
regimenLineItemMapper.update(regimenLineItem1);
regimenLineItemMapper.update(regimenLineItem2);
List<Map<String, String>> regimenItemsForSIMAMImport = rnrMapperForSIMAM.getRegimenItemsForSIMAMImport(requisition);
assertEquals(2, regimenItemsForSIMAMImport.size());
assertEquals(requisition.getId().intValue(), regimenItemsForSIMAMImport.get(0).get("requisition_id"));
assertEquals(requisition.getId().intValue(), regimenItemsForSIMAMImport.get(1).get("requisition_id"));
assertEquals(program.getCode(), regimenItemsForSIMAMImport.get(0).get("program_code"));
assertEquals(program.getCode(), regimenItemsForSIMAMImport.get(1).get("program_code"));
assertEquals("2015-11-11", new SimpleDateFormat("yyyy-MM-dd").format(regimenItemsForSIMAMImport.get(0).get("date")));
assertEquals("2015-11-11", new SimpleDateFormat("yyyy-MM-dd").format(regimenItemsForSIMAMImport.get(1).get("date")));
assertEquals("regimen1", regimenItemsForSIMAMImport.get(0).get("regimen_name"));
assertEquals("regimen2", regimenItemsForSIMAMImport.get(1).get("regimen_name"));
assertEquals(500, regimenItemsForSIMAMImport.get(0).get("total"));
assertEquals(1000, regimenItemsForSIMAMImport.get(1).get("total"));
}
}