package org.internna.ossmoney.services.impl;
import java.util.Date;
import java.util.Calendar;
import java.util.Locale;
import java.math.BigDecimal;
import org.junit.Test;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.internna.ossmoney.model.Bill;
import org.internna.ossmoney.model.Account;
import org.internna.ossmoney.model.Bill.RECURRING_INTERVAL;
import org.internna.ossmoney.model.Payee;
import org.internna.ossmoney.model.Subcategory;
import org.internna.ossmoney.util.SecurityUtils;
import org.internna.ossmoney.model.security.UserDetails;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.test.context.transaction.TransactionConfiguration;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = true)
@ContextConfiguration(locations = {"classpath:/META-INF/spring/applicationContext.xml", "classpath:/META-INF/spring/applicationContext-security.xml"})
public class AccountServiceTest {
@Autowired private AccountService accountService;
@Autowired private AuthenticationManager authenticationManager;
@Before
public void setup() {
SecurityUtils.authenticate(authenticationManager, "jose", "jose");
}
@Test
public void testCalculateAmount() {
assertEquals("Negative amount", new BigDecimal(-1), accountService.calculateAmount(new BigDecimal(-1)));
assertEquals("Negative amount always", new BigDecimal(-1), accountService.calculateAmount(BigDecimal.ONE));
}
@Test
public void testCalculateTargetAmount() {
assertEquals("Positive amount", BigDecimal.TEN, accountService.calculateTargetAmount(BigDecimal.ONE, 10));
assertEquals("Positive amount always", BigDecimal.TEN, accountService.calculateTargetAmount(new BigDecimal(-1), 10));
assertEquals("Positive amount with exhange rates", BigDecimal.TEN, accountService.calculateTargetAmount(BigDecimal.ONE, -10));
}
@Test
public void testTransferMoney() {
Account origin = Account.findAccount(1L);
Account target = Account.findAccount(2L);
assertEquals("Six initial transactions", 6, origin.getTransactions().size());
assertEquals("Two initial transactions", 2, target.getTransactions().size());
UserDetails user = new UserDetails();
accountService.transferMoney(user, origin, target, null, BigDecimal.ZERO, BigDecimal.ZERO, 0, null);
assertEquals("Six initial transactions", 6, origin.getTransactions().size());
assertEquals("Two initial transactions", 2, target.getTransactions().size());
user = origin.getOwner();
accountService.transferMoney(user, origin, target, new Date(), BigDecimal.ONE, BigDecimal.ZERO, 1, null);
assertEquals("One transaction added to origin", 7, origin.getTransactions().size());
assertEquals("One transaction added to target", 3, target.getTransactions().size());
accountService.transferMoney(user, origin, target, new Date(), BigDecimal.ONE, BigDecimal.ONE, 1, null);
assertEquals("Two transactions added to origin", 9, origin.getTransactions().size());
assertEquals("One more transaction added to target", 4, target.getTransactions().size());
}
@Test
public void testIsValidTransaction() {
Account account = new Account();
account.setClosed(Boolean.FALSE);
UserDetails user = new UserDetails();
user.setUsername("someuser");
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.YEAR, -1);
account.setOpened(calendar.getTime());
assertFalse("Null user", accountService.isValidTransaction(null, account, now, BigDecimal.ZERO));
assertFalse("Null account", accountService.isValidTransaction(user, null, now, BigDecimal.ZERO));
assertFalse("Not belongs", accountService.isValidTransaction(user, account, now, BigDecimal.ONE));
account.setOwner(user);
assertFalse("Null date", accountService.isValidTransaction(user, account, null, BigDecimal.ONE));
assertFalse("Null amount", accountService.isValidTransaction(user, account, now, null));
assertFalse("Zero amount", accountService.isValidTransaction(user, account, now, BigDecimal.ZERO));
assertTrue("Transaction ok", accountService.isValidTransaction(user, account, now, BigDecimal.ONE));
}
@Test
public void testPayBill() {
UserDetails user = UserDetails.findCurrentUser();
Bill bill = new Bill();
bill.setOwner(user);
bill.setAmount(100D);
bill.setCurrency(Locale.US);
bill.setLastTrigger(new Date());
bill.setPayee(Payee.findMySelf(user));
bill.setPeriod(RECURRING_INTERVAL.MONTHLY);
bill.setCategory(Subcategory.findSubcategory(1L));
bill.setDescription("a bill");
bill.persist();
Account account = Account.findAccount(3L);
int transactions = account.getTransactions().size();
accountService.payBill(user, bill, 3L, 101D, new Date());
assertNotNull("Bill updated", bill.getLastPayment());
assertTrue("Transaction created", (transactions + 1) == account.getTransactions().size());
}
}