package eu.ggnet.dwoss.report;
import eu.ggnet.dwoss.report.ReportAgent;
import java.text.ParseException;
import java.util.*;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.embeddable.EJBContainer;
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.report.ReportAgent.SearchParameter;
import eu.ggnet.dwoss.report.assist.ReportPu;
import eu.ggnet.dwoss.report.assist.Reports;
import eu.ggnet.dwoss.report.assist.gen.ReportLineGenerator;
import eu.ggnet.dwoss.report.entity.Report;
import eu.ggnet.dwoss.report.entity.ReportLine;
import eu.ggnet.dwoss.report.entity.partial.SimpleReportLine;
import eu.ggnet.dwoss.util.DateFormats;
import static eu.ggnet.dwoss.rules.DocumentType.*;
import static eu.ggnet.dwoss.rules.PositionType.*;
import static eu.ggnet.dwoss.rules.TradeName.*;
import static java.util.Arrays.asList;
import static org.junit.Assert.*;
/**
*
* @author oliver.guenther
*/
public class ReportAgentIT {
private final static Date D0 = parse("2012-01-01");
private final static Date D1 = parse("2013-01-01");
private final static Date D2 = parse("2013-01-15");
private EJBContainer container;
@EJB
private ReportAgent agent;
@Inject
private Helper helper;
@Before
public void setUp() throws NamingException {
Map<String, Object> c = new HashMap<>();
c.putAll(ReportPu.CMP_IN_MEMORY);
c.putAll(SystemConfig.OPENEJB_EJB_XML_DISCOVER);
c.putAll(SystemConfig.OPENEJB_LOG_TESTING);
container = EJBContainer.createEJBContainer(c);
container.getContext().bind("inject", this);
}
@After
public void tearDown() {
container.close();
}
@Test
public void testDanglingCloser() {
long idDangling = helper.prepareDangling();
List<ReportLine> lines = agent.findAllEager(ReportLine.class);
assertEquals("Size of prepared elements has changed, verifiy Test expectations", 6, lines.size());
List<Report> reports = agent.findAll(Report.class);
assertEquals("Should only have one report", 1, reports.size());
Set<ReportLine> attached = agent.attachDanglingComplaints(LENOVO, D2);
assertEquals("Unexpected ammount of dangling complaints", 1, attached.size());
assertEquals("Unexpected ReportLine.id of dangling complaint", idDangling, attached.iterator().next().getId());
Set<ReportLine> unreported2 = agent.prepareReport(
ReportAgent.ReportParameter.builder().contractor(LENOVO).start(D0).end(D2).reportName("A Report").build(),
true).getAllLines();
assertNull("The unreported lines does still contain the dangling complaint", filter(unreported2, idDangling));
NavigableSet<ReportLine> reportlines = agent.findReportResult(reports.get(0).getId()).getAllLines();
assertNotNull("The original report does not contain the dangling complaint", filter(reportlines, idDangling));
}
@Test
public void testSearch() {
String refurbishId = helper.prepareSearch();
long count = agent.count(new SearchParameter(refurbishId));
assertTrue(count > 1);
List<SimpleReportLine> find = agent.findSimple(new SearchParameter(refurbishId), 0, 100);
assertEquals(count, find.size());
}
@Stateless
public static class Helper {
@Inject
@Reports
private EntityManager em;
private final ReportLineGenerator generator = new ReportLineGenerator();
/**
* Generates some random Data, but ensures, that at least one line has the characteristic of a Dangling Complaint.
* <p>
* @return some random Data, but ensures, that at least one line has the characteristic of a Dangling Complaint.
*/
public long prepareDangling() {
ReportLine invoice1 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine invoice2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine annulationInvoiceFor2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(ANNULATION_INVOICE));
annulationInvoiceFor2.setRefurbishId(invoice2.getRefurbishId());
annulationInvoiceFor2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(annulationInvoiceFor2);
ReportLine invoice3 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine invoice4 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
em.persist(invoice1);
em.persist(invoice2);
em.persist(annulationInvoiceFor2);
em.persist(invoice3);
em.persist(invoice4);
Report r = new Report("Lenovo", LENOVO, D1, D2);
r.add(invoice1);
r.add(invoice2);
r.add(annulationInvoiceFor2);
em.persist(r);
ReportLine danglingComplaintFor2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(COMPLAINT));
danglingComplaintFor2.setRefurbishId(invoice2.getRefurbishId());
danglingComplaintFor2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(danglingComplaintFor2);
annulationInvoiceFor2.add(danglingComplaintFor2);
em.persist(danglingComplaintFor2);
return danglingComplaintFor2.getId();
}
/**
* Generates some reportlines. The returned refurbishId has references, but with different refurbishIds.
* <p>
* @return refurbishId has references, but with different refurbishIds.
*/
public String prepareSearch() {
ReportLine invoice1 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine invoice2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine annulationInvoiceFor2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(ANNULATION_INVOICE));
annulationInvoiceFor2.setRefurbishId(invoice2.getRefurbishId());
annulationInvoiceFor2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(annulationInvoiceFor2);
ReportLine invoice3 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine invoice4 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
ReportLine complaintFor2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(COMPLAINT));
complaintFor2.setRefurbishId(invoice2.getRefurbishId());
complaintFor2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(complaintFor2);
annulationInvoiceFor2.add(complaintFor2);
ReportLine differentFor2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
differentFor2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(differentFor2);
ReportLine different2For2 = generator.makeReportLine(asList(LENOVO), D1, 5, asList(UNIT), asList(INVOICE));
different2For2.setUniqueUnitId(invoice2.getUniqueUnitId());
invoice2.add(different2For2);
em.persist(invoice1);
em.persist(invoice2);
em.persist(annulationInvoiceFor2);
em.persist(invoice3);
em.persist(invoice4);
em.persist(differentFor2);
em.persist(different2For2);
return invoice2.getRefurbishId();
}
}
private ReportLine filter(Collection<ReportLine> lines, long id) {
for (ReportLine line : lines) {
if ( line.getId() == id ) return line;
}
return null;
}
private static Date parse(String dateString) {
try {
return DateFormats.ISO.parse(dateString);
} catch (ParseException ex) {
throw new RuntimeException(ex);
}
}
}