/*
* This program is part of the OpenLMIS logistics management information system platform software.
* Copyright © 2013 VillageReach
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses. For additional information contact info@OpenLMIS.org.
*/
package org.openlmis.pod.repository.mapper;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.openlmis.context.ShipmentTestContext;
import org.openlmis.core.query.QueryExecutor;
import org.openlmis.db.categories.IntegrationTests;
import org.openlmis.order.domain.Order;
import org.openlmis.pod.domain.OrderPOD;
import org.openlmis.pod.domain.OrderPODLineItem;
import org.openlmis.rnr.domain.Rnr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItems;
@Category(IntegrationTests.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class PODMapperIT extends ShipmentTestContext {
@Autowired
PODMapper mapper;
@Autowired
QueryExecutor queryExecutor;
private String productCode;
private Order order;
private String dispensingUnit;
private String productCategory;
private String productName;
private Integer productCategoryDisplayOrder;
private Integer productDisplayOrder;
@Before
public void setUp() throws Exception {
productCode = "P10";
dispensingUnit = "Tablets";
productCategory = "productCategory";
productName = "productName";
order = insertOrder(productCode);
productCategoryDisplayOrder = 10;
productDisplayOrder = 10;
}
@Test
public void shouldInsertPOD() {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.setDeliveredBy("deliveredBy");
orderPod.setReceivedBy("acceptedBy");
Date receivedDate = new Date();
orderPod.setReceivedDate(receivedDate);
Rnr rnr = order.getRnr();
orderPod.fillPOD(rnr);
mapper.insertPOD(orderPod);
OrderPOD savedOrderPod = mapper.getPODByOrderId(orderPod.getOrderId());
assertThat(savedOrderPod.getId(), is(notNullValue()));
assertThat(savedOrderPod.getFacilityId(), is(rnr.getFacility().getId()));
assertThat(savedOrderPod.getProgramId(), is(rnr.getProgram().getId()));
assertThat(savedOrderPod.getPeriodId(), is(rnr.getPeriod().getId()));
assertThat(savedOrderPod.getDeliveredBy(), is("deliveredBy"));
assertThat(savedOrderPod.getReceivedBy(), is("acceptedBy"));
assertThat(savedOrderPod.getReceivedDate(), is(receivedDate));
assertThat(savedOrderPod.getOrderNumber(), is("OYELL_FVR00000001R"));
}
@Test
public void shouldInsertPODLineItem() {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.setFacilityId(order.getRnr().getFacility().getId());
orderPod.setPeriodId(order.getRnr().getPeriod().getId());
orderPod.setProgramId(1L);
mapper.insertPOD(orderPod);
Integer quantityShipped = 1000;
Integer quantityReturned = 55;
OrderPODLineItem orderPodLineItem = new OrderPODLineItem(orderPod.getId(), productCode, productCategory,
productCategoryDisplayOrder, productDisplayOrder, 100, productName, dispensingUnit, 10, quantityShipped, quantityReturned, true, "P98",
"notes");
mapper.insertPODLineItem(orderPodLineItem);
List<OrderPODLineItem> orderPodLineItems = mapper.getPODLineItemsByPODId(orderPod.getId());
assertThat(orderPodLineItems.size(), is(1));
assertThat(orderPodLineItems.get(0).getProductCode(), is(productCode));
assertThat(orderPodLineItems.get(0).getReplacedProductCode(), is("P98"));
assertThat(orderPodLineItems.get(0).getDispensingUnit(), is(dispensingUnit));
assertThat(orderPodLineItems.get(0).getPacksToShip(), is(10));
assertThat(orderPodLineItems.get(0).getProductName(), is(productName));
assertThat(orderPodLineItems.get(0).getProductCategory(), is(productCategory));
assertThat(orderPodLineItems.get(0).getProductCategoryDisplayOrder(), is(productCategoryDisplayOrder));
assertThat(orderPodLineItems.get(0).getProductDisplayOrder(), is(productDisplayOrder));
assertThat(orderPodLineItems.get(0).getQuantityShipped(), is(quantityShipped));
assertThat(orderPodLineItems.get(0).getQuantityReturned(), is(quantityReturned));
}
@Test
public void shouldGetPodLineItemsByOrderId() throws SQLException {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.setFacilityId(order.getRnr().getFacility().getId());
orderPod.setPeriodId(order.getRnr().getPeriod().getId());
orderPod.setProgramId(1L);
mapper.insertPOD(orderPod);
String productCode1 = "productCode 1";
String productCode2 = "ProductCode 2";
String productCode3 = "productCode 3";
insertProduct(productCode1);
insertProduct(productCode2);
insertProduct(productCode3);
String productCategory = "product Category";
Integer productCategoryDisplayOrder1 = 1;
Integer productDisplayOrder1 = 1;
queryExecutor.executeUpdate(
"INSERT INTO pod_line_items (podId, productCode, productCategory, productCategoryDisplayOrder, productDisplayOrder, quantityReceived, createdBy, modifiedBy) values(?, ?, ?, ?, ?, ?, ?, ?)",
orderPod.getId(), productCode, this.productCategory, this.productCategoryDisplayOrder, productDisplayOrder, 100, 1, 1);
queryExecutor.executeUpdate(
"INSERT INTO pod_line_items (podId, productCode, productCategory, productCategoryDisplayOrder, productDisplayOrder, quantityReceived, createdBy, modifiedBy) values(?, ?, ?, ?, ?, ?, ?, ?)",
orderPod.getId(), productCode1, productCategory, productCategoryDisplayOrder1, productDisplayOrder1, 100, 1, 1);
queryExecutor.executeUpdate(
"INSERT INTO pod_line_items (podId, productCode, productCategory, productCategoryDisplayOrder, productDisplayOrder, quantityReceived, createdBy, modifiedBy) values(?, ?, ?, ?, ?, ?, ?, ?)",
orderPod.getId(), productCode3, productCategory, productCategoryDisplayOrder1, productDisplayOrder, 100, 1, 1);
queryExecutor.executeUpdate(
"INSERT INTO pod_line_items (podId, productCode, productCategory, productCategoryDisplayOrder, productDisplayOrder, quantityReceived, createdBy, modifiedBy) values(?, ?, ?, ?, ?, ?, ?, ?)",
orderPod.getId(), productCode2, productCategory, productCategoryDisplayOrder1, productDisplayOrder1, 100, 1, 1);
List<OrderPODLineItem> orderPodLineItems = mapper.getPODLineItemsByPODId(orderPod.getId());
assertThat(orderPodLineItems.size(), is(4));
assertThat(orderPodLineItems.get(0).getProductCode(), is(productCode1));
assertThat(orderPodLineItems.get(0).getProductCategoryDisplayOrder(), is(productCategoryDisplayOrder1));
assertThat(orderPodLineItems.get(0).getProductDisplayOrder(), is(productDisplayOrder1));
assertThat(orderPodLineItems.get(1).getProductCode(), is(productCode2));
assertThat(orderPodLineItems.get(1).getProductCategoryDisplayOrder(), is(productCategoryDisplayOrder1));
assertThat(orderPodLineItems.get(1).getProductDisplayOrder(), is(productDisplayOrder1));
assertThat(orderPodLineItems.get(2).getProductCode(), is(productCode3));
assertThat(orderPodLineItems.get(2).getProductCategoryDisplayOrder(), is(productCategoryDisplayOrder1));
assertThat(orderPodLineItems.get(2).getProductDisplayOrder(), is(productDisplayOrder));
assertThat(orderPodLineItems.get(3).getProductCode(), is(productCode));
assertThat(orderPodLineItems.get(3).getProductCategoryDisplayOrder(), is(productCategoryDisplayOrder));
}
@Test
public void shouldGetPODByOrderId() throws SQLException {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
queryExecutor.executeUpdate("INSERT INTO pod(orderId, orderNumber, " +
"facilityId, programId, periodId) values(?,?,?,?,?)", order.getId(), "OYELL_FVR00000001R", order.getRnr().getFacility().getId(),
1L, order.getRnr().getPeriod().getId());
OrderPOD savedOrderPOD = mapper.getPODByOrderId(order.getId());
assertThat(savedOrderPOD, is(notNullValue()));
assertThat(savedOrderPOD.getOrderId(), is(order.getId()));
}
@Test
public void shouldGetNPreviousPODLineItemsAfterGivenTrackingDateForGivenProgramPeriodAndProduct() {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.fillPOD(order.getRnr());
Rnr requisition = order.getRnr();
mapper.insertPOD(orderPod);
OrderPODLineItem orderPodLineItem = new OrderPODLineItem(orderPod.getId(), productCode, 100);
mapper.insertPODLineItem(orderPodLineItem);
List<OrderPODLineItem> nOrderPodLineItems = mapper.getNPodLineItems(productCode, requisition, 1,
DateTime.now().minusDays(5).toDate());
assertThat(nOrderPodLineItems, hasItems(orderPodLineItem));
}
@Test
public void shouldGetPODWithLineItemsByPODId() throws Exception {
OrderPOD expectedOrderPod = new OrderPOD();
expectedOrderPod.setOrderId(order.getId());
expectedOrderPod.setOrderNumber("OYELL_FVR00000001R");
expectedOrderPod.setFacilityId(order.getRnr().getFacility().getId());
expectedOrderPod.setPeriodId(order.getRnr().getPeriod().getId());
expectedOrderPod.setProgramId(1L);
mapper.insertPOD(expectedOrderPod);
OrderPODLineItem lineItem1 = new OrderPODLineItem(expectedOrderPod.getId(), productCode, productCategory,
productCategoryDisplayOrder, productDisplayOrder, 100, productName, dispensingUnit, 10, null, null, true, null, null);
mapper.insertPODLineItem(lineItem1);
OrderPOD orderPOD = mapper.getPODById(expectedOrderPod.getId());
assertThat(orderPOD.getPodLineItems().size(), is(1));
assertThat(orderPOD.getPodLineItems().get(0), is(lineItem1));
}
@Test
public void shouldUpdatePOD() {
Long createdBy = 1L;
Long modifiedBy = 2L;
OrderPOD orderPod = new OrderPOD();
orderPod.setFacilityId(order.getRnr().getFacility().getId());
orderPod.setPeriodId(order.getRnr().getPeriod().getId());
orderPod.setProgramId(1L);
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.setCreatedBy(createdBy);
orderPod.setModifiedBy(createdBy);
mapper.insertPOD(orderPod);
orderPod.setModifiedBy(modifiedBy);
orderPod.setReceivedBy("acceptedBy");
orderPod.setDeliveredBy("deliveredBy");
Date receivedDate = new Date();
orderPod.setReceivedDate(receivedDate);
mapper.update(orderPod);
OrderPOD updatedPOD = mapper.getPODById(orderPod.getId());
assertThat(updatedPOD.getModifiedBy(), is(modifiedBy));
assertThat(updatedPOD.getReceivedDate(), is(receivedDate));
assertThat(updatedPOD.getReceivedBy(), is("acceptedBy"));
assertThat(updatedPOD.getDeliveredBy(), is("deliveredBy"));
}
@Test
public void shouldUpdatePODLineItem() throws Exception {
OrderPOD orderPod = new OrderPOD();
orderPod.setOrderId(order.getId());
orderPod.setOrderNumber("OYELL_FVR00000001R");
orderPod.setFacilityId(order.getRnr().getFacility().getId());
orderPod.setPeriodId(order.getRnr().getPeriod().getId());
orderPod.setProgramId(1L);
mapper.insertPOD(orderPod);
OrderPODLineItem orderPodLineItem = new OrderPODLineItem(orderPod.getId(), productCode, null);
mapper.insertPODLineItem(orderPodLineItem);
orderPodLineItem.setNotes("notes");
orderPodLineItem.setQuantityReceived(345);
orderPodLineItem.setQuantityReturned(100);
orderPodLineItem.setModifiedBy(3L);
mapper.updateLineItem(orderPodLineItem);
OrderPODLineItem lineItem = mapper.getPODLineItemsByPODId(orderPod.getId()).get(0);
assertThat(lineItem.getModifiedBy(), is(orderPodLineItem.getModifiedBy()));
assertThat(lineItem, is(orderPodLineItem));
}
}