package eu.ggnet.dwoss.uniqueunit.op;
import eu.ggnet.dwoss.uniqueunit.entity.PriceType;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnitHistory;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit;
import eu.ggnet.dwoss.uniqueunit.entity.Product;
import java.util.*;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.embeddable.EJBContainer;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import org.junit.*;
import eu.ggnet.dwoss.configuration.SystemConfig;
import eu.ggnet.dwoss.event.UnitHistory;
import eu.ggnet.dwoss.mandator.api.value.Contractors;
import eu.ggnet.dwoss.rules.ProductGroup;
import eu.ggnet.dwoss.rules.TradeName;
import eu.ggnet.dwoss.uniqueunit.UniqueUnitAgent;
import eu.ggnet.dwoss.uniqueunit.assist.UniqueUnitPu;
import eu.ggnet.dwoss.uniqueunit.assist.UniqueUnits;
import eu.ggnet.dwoss.uniqueunit.eao.ProductEao;
import static eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.Identifier.*;
import static org.junit.Assert.*;
/**
*
* @author oliver.guenther
*/
public class UnitHistoryListenerOperationIT {
private EJBContainer container;
@EJB
private UniqueUnitAgent uniqueUnitAgent;
@Inject
private SenderBean senderBean;
@Inject
private UnitBean unitBean;
@Before
public void setUp() throws NamingException {
Map<String, Object> c = new HashMap<>();
c.putAll(UniqueUnitPu.CMP_IN_MEMORY);
c.putAll(SystemConfig.OPENEJB_LOG_WARN);
c.putAll(SystemConfig.OPENEJB_EJB_XML_DISCOVER);
container = EJBContainer.createEJBContainer(c);
container.getContext().bind("inject", this);
}
@After
public void after() {
container.close();
}
@Test
public void testEvent() throws InterruptedException {
String MSG = "Eine Nachricht";
int id1 = unitBean.createSampleUnit();
senderBean.send(id1, MSG, "Junit");
Thread.sleep(1000);
UniqueUnit u1 = uniqueUnitAgent.findByIdEager(UniqueUnit.class, id1);
assertNotNull(u1);
assertEquals("Should have three history Elements, contains " + u1.getHistory(), 3, u1.getHistory().size());
assertTrue("Should contain '" + MSG + "', but has '" + u1 + "'", hasMessage(u1, MSG));
}
private boolean hasMessage(UniqueUnit uu, String msg) {
for (UniqueUnitHistory uuh : uu.getHistory()) {
if ( uuh.getComment().contains(msg) ) return true;
}
return false;
}
@Stateless
//
public static class SenderBean {
@Inject
private Event<UnitHistory> historyEvent;
public void send(int id, String msg, String arranger) {
historyEvent.fire(new UnitHistory(id, msg, arranger));
}
}
@Stateless
//
//
public static class UnitBean {
@Inject
@UniqueUnits
private EntityManager em;
@Inject
private Contractors contractors;
public int createSampleUnit() {
Product p = new ProductEao(em).findByPartNo("AA.AAAAA.AAA");
if ( p == null ) {
p = new Product(ProductGroup.DESKTOP, TradeName.FUJITSU, "AA.AAAAA.AAA", "Verition Stein");
p.setDescription("Ein Tolles Gerät");
p.setPrice(PriceType.MANUFACTURER_COST, 200.0, "JUnit - Testcase");
p.setAdditionalPartNo(contractors.all().iterator().next(), "833.323");
p.setPrice(PriceType.CONTRACTOR_REFERENCE, 240.0, "JUnit - Testcase");
p.addFlag(Product.Flag.PRICE_FIXED);
em.persist(p);
}
UniqueUnit unit = new UniqueUnit(p, new Date(), "");
unit.setIdentifier(SERIAL, "AAAAAAAAAAA123AAADFSADFSA");
unit.setIdentifier(REFURBISHED_ID, "30001");
unit.setContractor(TradeName.ONESELF);
unit.setComment("Ein Commentar");
unit.setCondition(UniqueUnit.Condition.AS_NEW);
em.persist(unit);
return unit.getId();
}
}
}