package eu.ggnet.dwoss.stock.entity;
import java.util.*;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import eu.ggnet.dwoss.stock.assist.StockPu;
import static org.junit.Assert.assertTrue;
public class PersistenceIT {
private EntityManagerFactory emf;
@Before
public void setUp() throws NamingException {
emf = Persistence.createEntityManagerFactory(StockPu.NAME, StockPu.JPA_IN_MEMORY);
}
@After
public void after() {
emf.close();
}
@Test
public void testUniqueUnitReferenceBug() {
EntityManager em = emf.createEntityManager();
Date now = new Date();
em.getTransaction().begin();
Stock s1 = new Stock(1);
s1.setName("1111111111111111");
Stock s2 = new Stock(2);
s2.setName("2222222222222222");
em.persist(s1);
em.persist(s2);
em.getTransaction().commit();
StockLocation s1l1 = new StockLocation("Regal A");
StockLocation s1l2 = new StockLocation("Regal B");
s1.addStockLocation(s1l1);
s1.addStockLocation(s1l2);
StockUnit su1 = new StockUnit("Gerät", 1);
su1.setStockLocation(s1l2);
em.getTransaction().begin();
StockTransaction t1 = new StockTransaction(StockTransactionType.TRANSFER);
t1.addStatus(new StockTransactionStatus(StockTransactionStatusType.PREPARED, now));
t1.setSource(s1);
t1.setDestination(s2);
t1.addPosition(new StockTransactionPosition(su1));
su1.setStock(null);
em.persist(t1);
em.getTransaction().commit();
em.getTransaction().begin();
for (StockTransactionPosition position : t1.getPositions()) {
t1.getDestination().addUnit(position.getStockUnit());
position.setStockUnit(null);
}
em.getTransaction().commit();
em.getTransaction().begin();
t1 = new StockTransaction(StockTransactionType.TRANSFER);
t1.addStatus(new StockTransactionStatus(StockTransactionStatusType.PREPARED, now));
t1.setSource(s2);
t1.setDestination(s1);
t1.addPosition(new StockTransactionPosition(su1));
su1.setStock(null);
em.persist(t1);
em.getTransaction().commit();
em.getTransaction().begin();
for (StockTransactionPosition position : t1.getPositions()) {
t1.getDestination().addUnit(position.getStockUnit());
position.setStockUnit(null);
}
em.getTransaction().commit();
}
@Test
public void testPersistence() {
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Stock s1 = new Stock(1);
s1.setName("1111111111111111");
Stock s2 = new Stock(2);
s2.setName("2222222222222222");
em.persist(s1);
tx.commit();
StockUnit su1 = new StockUnit("g1", 1);
StockUnit su2 = new StockUnit("g2", 2);
StockUnit su3 = new StockUnit("g3", 3);
StockUnit su4 = new StockUnit("g4", 4);
s1.addUnit(su1);
s1.addUnit(su2);
s1.addUnit(su3);
s2.addUnit(su4);
tx = em.getTransaction();
tx.begin();
em.persist(su1);
em.persist(su2);
em.persist(su3);
em.persist(su4);
tx.commit();
tx = em.getTransaction();
tx.begin();
TypedQuery<Stock> q = em.createQuery("Select s from " + Stock.class.getSimpleName() + " s", Stock.class);
List<Stock> sus = q.getResultList();
assertTrue(sus.size() == 2);
Stock st1 = sus.get(0);
if ( st1.getId() == s2.getId() ) {
assertTrue(st1.getUnits().size() == 1);
} else {
assertTrue(st1.getUnits().size() == 3);
}
Stock st2 = sus.get(1);
StockTransaction t1 = new StockTransaction(StockTransactionType.TRANSFER);
// TODO: Long comment fails test.
StringBuilder sb = new StringBuilder("Adding a");
for (int i = 0; i < 255; i++) {
sb.append(" very");
}
sb.append("long comment");
t1.setComment(sb.toString());
t1.setSource(st1);
t1.setDestination(st2);
List<StockUnit> sustemp = new ArrayList<>(st1.getUnits());
for (Iterator<StockUnit> isu = sustemp.iterator(); isu.hasNext();) {
StockUnit su = isu.next();
t1.addPosition(new StockTransactionPosition(su));
su.setStock(null);
}
StockTransactionStatus init = new StockTransactionStatus(StockTransactionStatusType.PREPARED, new Date());
init.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.PICKER, "Hans"));
t1.addStatus(init);
StockTransactionStatus commision = new StockTransactionStatus(StockTransactionStatusType.COMMISSIONED, new Date());
commision.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.PICKER, "User1", true));
commision.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.DELIVERER, "User2", true));
t1.addStatus(commision);
em.persist(t1);
tx.commit();
tx = em.getTransaction();
tx.begin();
StockTransactionStatus transfer = new StockTransactionStatus(StockTransactionStatusType.IN_TRANSFER, new Date());
transfer.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.DELIVERER, "User3", false));
t1.addStatus(transfer);
StockTransactionPosition removePos = t1.getPositions().get(0);
removePos.getStockUnit().setStock(st2);
em.remove(removePos);
tx.commit();
tx = em.getTransaction();
tx.begin();
StockTransactionStatus receive = new StockTransactionStatus(StockTransactionStatusType.RECEIVED, new Date());
receive.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.RECEIVER, "User4", true));
receive.addParticipation(new StockTransactionParticipation(StockTransactionParticipationType.DELIVERER, "User5", true));
t1.addStatus(receive);
tx.commit();
tx = em.getTransaction();
tx.begin();
StockTransaction t2 = em.createQuery("Select t from " + StockTransaction.class.getSimpleName() + " t", StockTransaction.class).getSingleResult();
boolean b1 = false;
boolean b2 = false;
boolean b3 = false;
for (StockTransactionParticipation stp : t2.getParticipations()) {
switch (stp.getType()) {
case DELIVERER:
b1 = true;
break;
case PICKER:
b2 = true;
break;
case RECEIVER:
b3 = true;
}
}
assertTrue(b1 && b2 && b3);
tx.commit();
tx = em.getTransaction();
tx.begin();
for (StockTransactionPosition position : t1.getPositions()) {
t1.getDestination().addUnit(position.getStockUnit());
position.setStockUnit(null);
}
tx.commit();
tx.begin();
List<StockUnit> units = em.createNamedQuery("all", StockUnit.class).getResultList();
LogicTransaction lt = new LogicTransaction();
lt.setDossierId(2);
for (StockUnit stockUnit : units) {
lt.add(stockUnit);
}
em.persist(lt);
tx.commit();
}
}