package org.jboss.seam.example.seampay.test;
import java.math.BigDecimal;
import java.util.Date;
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.SeamTest;
import org.testng.annotations.Test;
public class PaymentProcessorTest
extends SeamTest
{
static final String ACCOUNT_NUMBER = "X12345";
static final BigDecimal INITIAL_BALANCE = new BigDecimal("1000");
@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;
}
}