package eu.ggnet.dwoss.redtape;
import eu.ggnet.dwoss.rules.DocumentType;
import eu.ggnet.dwoss.rules.PaymentMethod;
import eu.ggnet.dwoss.rules.AddressType;
import eu.ggnet.dwoss.redtape.entity.Position;
import eu.ggnet.dwoss.redtape.assist.RedTapePu;
import eu.ggnet.dwoss.redtape.assist.RedTapes;
import eu.ggnet.dwoss.redtape.entity.Dossier;
import eu.ggnet.dwoss.redtape.entity.Document;
import java.util.*;
import javax.ejb.*;
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.customer.assist.CustomerPu;
import eu.ggnet.dwoss.customer.assist.gen.CustomerGeneratorOperation;
import eu.ggnet.dwoss.redtape.RedTapeWorker.Addresses;
import eu.ggnet.dwoss.stock.assist.StockPu;
import static org.junit.Assert.*;
/**
* Test the correct changes of Flags in a Document
*
* @author oliver.guenther
*/
public class DocumentSupporterFlagIT {
private EJBContainer container;
@Inject
@RedTapes
private EntityManager redTapeEm;
@EJB
private RedTapeWorker redTapeWorker;
@EJB
private DocumentSupporter documentSupporter;
@Inject
private CustomerGeneratorOperation cgo;
private long customerId;
private final String arranger = "JUnit";
@Before
public void setUp() throws NamingException {
Map<String, Object> c = new HashMap<>();
c.putAll(CustomerPu.CMP_IN_MEMORY);
c.putAll(StockPu.CMP_IN_MEMORY);
c.putAll(RedTapePu.CMP_IN_MEMORY);
c.putAll(SystemConfig.OPENEJB_EJB_XML_DISCOVER);
c.putAll(SystemConfig.OPENEJB_LOG_WARN);
container = EJBContainer.createEJBContainer(c);
container.getContext().bind("inject", this);
customerId = cgo.makeCustomer();
}
@After
public void tearDown() {
container.close();
}
@Test
public void testDocumentFlags() {
Document doc = testBriefed();
doc = testOrder(doc);
doc = testInvoice(doc);
testCreditMemo(doc);
testClosed();
}
private void testClosed() {
Dossier dos = redTapeWorker.create(customerId, true, "JUnit");
Document doc = dos.getActiveDocuments().get(0);
addRandomPositions(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertNotBriefed(doc);
dos = documentSupporter.briefed(doc, arranger);
assertExactlyBriefed(dos.getActiveDocuments().get(0));
doc = dos.getActiveDocuments().get(0);
doc.setClosed(true);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
}
private Document testBriefed() {
Dossier dos = redTapeWorker.create(customerId, true, "JUnit");
Document doc = dos.getActiveDocuments().get(0);
addRandomPositions(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertNotBriefed(doc);
dos = documentSupporter.briefed(doc, arranger);
assertExactlyBriefed(dos.getActiveDocuments().get(0));
return dos.getActiveDocuments().get(0);
}
private Document testOrder(Document doc) {
// Changes that impact the Exactly Briefed Flag, but not the Briefed Flag
modify2ndPosition(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments().get(0);
changeInvoiceAddress(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments().get(0);
assertFalse(PaymentMethod.CASH_ON_DELIVERY == doc.getDossier().getPaymentMethod());
doc.getDossier().setPaymentMethod(PaymentMethod.CASH_ON_DELIVERY);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments().get(0);
doc.getDossier().setDispatch(!doc.getDossier().isDispatch());
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
// Changes that have no impact to Exactly Briefed and Briefed
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments().get(0);
doc.add(Document.Condition.PAID);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
doc.setDirective(Document.Directive.PREPARE_SHIPPING);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
return doc;
}
private Document testInvoice(Document doc) {
doc.setType(DocumentType.INVOICE);
doc = redTapeWorker.update(doc, null, arranger);
assertNotBriefed(doc);
// Changes that impact the Exactly Briefed Flag, but not the Briefed Flag
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.INVOICE).get(0);
modify2ndPosition(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.INVOICE).get(0);
changeInvoiceAddress(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
// Changes that have no impact to Exactly Briefed and Briefed
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.INVOICE).get(0);
doc.add(Document.Condition.PICKED_UP);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
doc.setDirective(Document.Directive.WAIT_FOR_MONEY);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
return doc;
}
private Document testCreditMemo(Document doc) {
doc.setType(DocumentType.CREDIT_MEMO);
doc = redTapeWorker.update(doc, null, arranger);
assertNotBriefed(doc);
// Changes that impact the Exactly Briefed Flag, but not the Briefed Flag
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.CREDIT_MEMO).get(0);
modify2ndPosition(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.CREDIT_MEMO).get(0);
changeInvoiceAddress(doc);
doc = redTapeWorker.update(doc, null, arranger);
assertOnlyBriefed(doc);
// Changes that have no impact to Exactly Briefed and Briefed
doc = documentSupporter.briefed(doc, arranger).getActiveDocuments(DocumentType.CREDIT_MEMO).get(0);
doc.add(Document.Condition.REPAYMENT_BALANCED);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
doc.setDirective(Document.Directive.SEND_CASH_ON_DELIVERY_CONTRACT);
doc = redTapeWorker.update(doc, null, arranger);
assertExactlyBriefed(doc);
return doc;
}
private void addRandomPositions(Document doc) {
doc.append(NaivBuilderUtil.comment());
doc.append(NaivBuilderUtil.service());
doc.append(NaivBuilderUtil.shippingcost());
}
private void modify2ndPosition(Document doc) {
Position p2 = doc.getPosition(2);
p2.setPrice(p2.getPrice() + 50);
p2.setAfterTaxPrice(p2.getPrice() + 50);
}
private void changeInvoiceAddress(Document doc) {
cgo.scrambleAddress(customerId, AddressType.INVOICE);
Addresses addresses = redTapeWorker.requestAdressesByCustomer(customerId);
doc.setInvoiceAddress(addresses.getInvoice());
}
private void assertOnlyBriefed(Document doc) {
assertTrue("Document must contain " + Document.Flag.CUSTOMER_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_BRIEFED));
assertFalse("Document must not contain " + Document.Flag.CUSTOMER_EXACTLY_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_EXACTLY_BRIEFED));
}
private void assertExactlyBriefed(Document doc) {
assertTrue("Document must contain " + Document.Flag.CUSTOMER_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_BRIEFED));
assertTrue("Document must contain " + Document.Flag.CUSTOMER_EXACTLY_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_EXACTLY_BRIEFED));
}
private void assertNotBriefed(Document doc) {
assertFalse("Document must not contain " + Document.Flag.CUSTOMER_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_BRIEFED));
assertFalse("Document must not contain " + Document.Flag.CUSTOMER_EXACTLY_BRIEFED + " but is " + doc, doc.getFlags().contains(Document.Flag.CUSTOMER_EXACTLY_BRIEFED));
}
// @Stateless
// public static class DocumentSupportFlagCustomerHelper {
//
// @Inject
// private CustomerGeneratorOperation cgo;
//
// private final Random R = new Random();
//
// public void changeInvoiceAddress(long customerId) {
// cgo.scrambleAddress(customerId, AddressType.INVOICE);
// }
//
// }
}