package org.jboss.seam.example.seampay.test; import java.math.BigDecimal; import java.util.Date; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.OverProtocol; import org.jboss.arquillian.junit.Arquillian; import org.jboss.seam.example.seampay.Account; import org.jboss.seam.example.seampay.Payment; import org.jboss.seam.example.seampay.PaymentProcessor; import org.jboss.seam.example.seampay.Payment.Frequency; import org.jboss.seam.mock.JUnitSeamTest; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(Arquillian.class) public class PaymentProcessorTest extends JUnitSeamTest { static final String ACCOUNT_NUMBER = "X12345"; static final BigDecimal INITIAL_BALANCE = new BigDecimal("1000"); @Deployment(name="PaymentProcessorTest") @OverProtocol("Servlet 3.0") public static Archive<?> createDeployment() { EnterpriseArchive er = Deployments.seamPayDeployment(); WebArchive web = er.getAsType(WebArchive.class, "seampay-web.war"); web.addClasses(PaymentProcessorTest.class); return er; } @Test public void testInactive() { PaymentProcessor processor = new PaymentProcessor(); Payment payment = createTestPayment(new BigDecimal("100"), Frequency.ONCE); payment.setActive(false); assert payment.getAccount().getBalance().equals(INITIAL_BALANCE); processor.processPayment(payment); assert payment.getAccount().getBalance().equals(INITIAL_BALANCE); assert payment.getLastPaid() == null; } @Test public void testPayOnce() { PaymentProcessor processor = new PaymentProcessor(); Payment payment = createTestPayment(new BigDecimal("100"), Frequency.ONCE); assert payment.getAccount().getBalance().equals(INITIAL_BALANCE); processor.processPayment(payment); assert payment.getAccount().getBalance().equals(new BigDecimal("900")); assert !payment.getActive(); assert payment.getLastPaid() != null; } @Test public void testPayMultiple() { PaymentProcessor processor = new PaymentProcessor(); Payment payment = createTestPayment(new BigDecimal("100"), Frequency.WEEKLY); assert payment.getAccount().getBalance().equals(INITIAL_BALANCE); processor.processPayment(payment); assert payment.getAccount().getBalance().equals(new BigDecimal("900")); assert payment.getActive(); assert payment.getLastPaid() != null; Date firstPayment = payment.getLastPaid(); pause(); // just need to make sure we are some small time in the future processor.processPayment(payment); assert payment.getAccount().getBalance().equals(new BigDecimal("800")); assert payment.getActive(); assert payment.getLastPaid().after(firstPayment); } private void pause() { try { Thread.sleep(1); } catch (InterruptedException e) { } } protected Payment createTestPayment(BigDecimal amount, Frequency frequency) { Account account = new Account(); account.setAccountNumber(ACCOUNT_NUMBER); setField(account, "balance", INITIAL_BALANCE); Payment payment = new Payment(); payment.setAccount(account); payment.setAmount(amount); payment.setPaymentFrequency(frequency); return payment; } }