package org.multibit.mbm.db.dao.hibernate;
import com.google.common.base.Optional;
import org.junit.Test;
import org.multibit.mbm.core.model.*;
import org.multibit.mbm.db.dao.PurchaseOrderDao;
import org.multibit.mbm.db.dao.ItemDao;
import org.multibit.mbm.db.dao.SupplierDao;
import org.multibit.mbm.db.dao.UserDao;
import org.multibit.mbm.test.BaseIntegrationTests;
import org.springframework.test.context.ContextConfiguration;
import javax.annotation.Resource;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*;
/**
* Integration test to verify the Hibernate annotations of the DTOs against a generated schema
*/
@ContextConfiguration(locations = {"/spring/test-mbm-context.xml"})
public class HibernatePurchaseOrderDaoIntegrationTest extends BaseIntegrationTests {
@Resource(name = "hibernatePurchaseOrderDao")
private PurchaseOrderDao testObject;
@Resource(name = "hibernateSupplierDao")
private SupplierDao supplierDao;
@Resource(name = "hibernateItemDao")
private ItemDao itemDao;
@Resource(name = "hibernateUserDao")
private UserDao userDao;
@Test
public void testPersist() {
Optional<User> user = userDao.getByApiKey("steve123");
assertTrue("Unexpected missing user",user.isPresent());
Supplier supplier = user.get().getSupplier();
PurchaseOrder expectedPurchaseOrder = PurchaseOrderBuilder
.newInstance()
.withSupplier(supplier)
.build();
// Persist with insert (new purchase order)
int originalPurchaseOrderRows = countRowsInTable("purchase_orders");
int originalItemRows = countRowsInTable("items");
int originalSupplierRows = countRowsInTable("suppliers");
int originalPurchaseOrderItemRows = countRowsInTable("purchase_order_items");
expectedPurchaseOrder = testObject.saveOrUpdate(expectedPurchaseOrder);
// Session flush: Expect an insert in purchase orders only
int updatedPurchaseOrderRows = countRowsInTable("purchase_orders");
int updatedItemRows = countRowsInTable("items");
int updatedSupplierRows = countRowsInTable("suppliers");
int updatedPurchaseOrderItemRows = countRowsInTable("purchase_order_items");
assertThat("Expected session flush for first insert", updatedPurchaseOrderRows, equalTo(originalPurchaseOrderRows + 1));
assertThat("Unexpected data in items", updatedItemRows, equalTo(originalItemRows));
assertThat("Unexpected data in suppliers", updatedSupplierRows, equalTo(originalSupplierRows));
assertThat("Unexpected data in purchase_order_items", updatedPurchaseOrderItemRows, equalTo(originalPurchaseOrderItemRows));
// Perform an update to the PurchaseOrder that cascades to an insert in join table
Optional<Item> book1 = itemDao.getBySKU("0099410672");
Optional<Item> book2 = itemDao.getBySKU("0140296034");
expectedPurchaseOrder.setItemQuantity(book1.get(), 1);
expectedPurchaseOrder.setItemQuantity(book2.get(), 2);
expectedPurchaseOrder = testObject.saveOrUpdate(expectedPurchaseOrder);
testObject.flush();
// Session flush: Expect no change to purchaseOrders, 2 inserts into purchaseOrder_items
updatedPurchaseOrderRows = countRowsInTable("purchase_orders");
updatedItemRows = countRowsInTable("items");
updatedSupplierRows = countRowsInTable("suppliers");
updatedPurchaseOrderItemRows = countRowsInTable("purchase_order_items");
assertThat("Unexpected data is purchaseOrders", updatedPurchaseOrderRows, equalTo(originalPurchaseOrderRows + 1));
assertThat("Unexpected data in items", updatedItemRows, equalTo(originalItemRows));
assertThat("Unexpected data in suppliers", updatedSupplierRows, equalTo(originalSupplierRows));
assertThat("Unexpected data in purchaseOrder_items", updatedPurchaseOrderItemRows, equalTo(originalPurchaseOrderItemRows + 2));
assertThat("Unexpected quantity for book1", expectedPurchaseOrder.getPurchaseOrderItemByItem(book1.get()).get().getQuantity(), equalTo(1));
assertThat("Unexpected quantity for book2", expectedPurchaseOrder.getPurchaseOrderItemByItem(book2.get()).get().getQuantity(), equalTo(2));
expectedPurchaseOrder.setItemQuantity(book1.get(), 4);
expectedPurchaseOrder.setItemQuantity(book2.get(), 5);
expectedPurchaseOrder = testObject.saveOrUpdate(expectedPurchaseOrder);
testObject.flush();
// Session flush: Expect no change to purchaseOrders, purchaseOrder_items
updatedPurchaseOrderRows = countRowsInTable("purchase_orders");
updatedItemRows = countRowsInTable("items");
updatedSupplierRows = countRowsInTable("suppliers");
updatedPurchaseOrderItemRows = countRowsInTable("purchase_order_items");
assertThat("Unexpected data is purchaseOrders", updatedPurchaseOrderRows, equalTo(originalPurchaseOrderRows + 1));
assertThat("Unexpected data in items", updatedItemRows, equalTo(originalItemRows));
assertThat("Unexpected data in suppliers", updatedSupplierRows, equalTo(originalSupplierRows));
assertThat("Unexpected data in purchaseOrder_items", updatedPurchaseOrderItemRows, equalTo(originalPurchaseOrderItemRows + 2));
assertThat("Unexpected quantity for book1", expectedPurchaseOrder.getPurchaseOrderItemByItem(book1.get()).get().getQuantity(), equalTo(4));
assertThat("Unexpected quantity for book2", expectedPurchaseOrder.getPurchaseOrderItemByItem(book2.get()).get().getQuantity(), equalTo(5));
// Perform an update to the PurchaseOrder that cascades to a delete in join table
// due to an addition to the linked reference
expectedPurchaseOrder.setItemQuantity(book2.get(), 0);
testObject.saveOrUpdate(expectedPurchaseOrder);
testObject.flush();
// Session flush: Expect no change to purchaseOrders, items, supplier - only a delete from purchaseOrder_items
updatedPurchaseOrderRows = countRowsInTable("purchase_orders");
updatedItemRows = countRowsInTable("items");
updatedSupplierRows = countRowsInTable("suppliers");
updatedPurchaseOrderItemRows = countRowsInTable("purchase_order_items");
assertThat("Unexpected data is purchaseOrders", updatedPurchaseOrderRows, equalTo(originalPurchaseOrderRows + 1));
assertThat("Unexpected data in items", updatedItemRows, equalTo(originalItemRows));
assertThat("Unexpected data in suppliers", updatedSupplierRows, equalTo(originalSupplierRows));
assertThat("Unexpected data in purchaseOrder_items", updatedPurchaseOrderItemRows, equalTo(originalPurchaseOrderItemRows + 1));
assertThat("Unexpected quantity for book1", expectedPurchaseOrder.getPurchaseOrderItemByItem(book1.get()).get().getQuantity(), equalTo(4));
assertFalse("Unexpected existence for book2", expectedPurchaseOrder.getPurchaseOrderItemByItem(book2.get()).isPresent());
}
}