package org.openbankdata.bank.americanexpress.service;
import static org.junit.Assert.assertEquals;
import org.openbankdata.bank.americanexpress.client.AmericanExpressBankClient;
import org.openbankdata.bank.americanexpress.client.AmericanExpressTransactionPaginationStrategy;
import org.openbankdata.core.Account;
import org.openbankdata.core.Transaction;
import org.openbankdata.core.client.BankResponse;
import org.openbankdata.core.client.MockedBankResponse;
import org.openbankdata.core.client.PagedBankRequest;
import org.openbankdata.core.service.TransactionService;
import org.easymock.EasyMock;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Currency;
import java.util.List;
public class AmericanExpressTransactionServiceTest {
private TransactionService mTransactionService;
private AmericanExpressBankClient mockedBankClient;
private static final String TRANSACTIONS_URL =
"https://global.americanexpress.com/myca/intl/estatement/emea/statement.do";
private static final String ACCOUNT_ID = "0";
@Before
public void setUp() {
mockedBankClient = EasyMock.createMock(AmericanExpressBankClient.class);
mTransactionService = new AmericanExpressTransactionService(mockedBankClient);
}
@Test
public void testGetTransactions() {
// Given
// The transactions for Account 0 is splitted into two separate pages
EasyMock.expect(mockedBankClient.get(getFirstTransactionRequest())).andReturn(
mockedFirstTransactionResponse());
EasyMock.expect(mockedBankClient.get(getSecondTransactionRequest())).andReturn(
mockedSecondTransactionResponse());
EasyMock.replay(mockedBankClient);
// When
// Getting all available transactions for Account 0
Account account = new Account();
account.setId(ACCOUNT_ID);
List<Transaction> actual = mTransactionService.getTransactions(account);
// Then
assertEquals("All available transactions should have been returned", 2, actual.size());
assertEquals("The transactions should have been correctly mapped.",
expectedTransactions(), actual);
}
private List<Transaction> expectedTransactions() {
List<Transaction> transactions = new ArrayList<Transaction>();
Transaction t1 = new Transaction();
t1.setAmount(new BigDecimal(-1625));
t1.setCurrency(Currency.getInstance("SEK"));
t1.setDescription("Company name 1");
t1.setTransactionDate(new LocalDate("2014-01-23"));
transactions.add(t1);
Transaction t2 = new Transaction();
t2.setAmount(new BigDecimal(2980));
t2.setCurrency(Currency.getInstance("SEK"));
t2.setDescription("Betalning");
t2.setTransactionDate(new LocalDate("2014-01-27"));
transactions.add(t2);
return transactions;
}
private PagedBankRequest getFirstTransactionRequest() {
return (PagedBankRequest) new PagedBankRequest()
.setPaginationStrategy(new AmericanExpressTransactionPaginationStrategy())
.setUri(TRANSACTIONS_URL)
.addParam("sorted_index", ACCOUNT_ID)
.addParam("Face", "sv_SE");
}
private PagedBankRequest getSecondTransactionRequest() {
PagedBankRequest request = getFirstTransactionRequest();
request.setPage(1);
return request;
}
private BankResponse mockedFirstTransactionResponse() {
MockedBankResponse response = new MockedBankResponse("americanexpress-paginated-transactions-1.htm");
response.code(200);
return response;
}
private BankResponse mockedSecondTransactionResponse() {
MockedBankResponse response = new MockedBankResponse("americanexpress-paginated-transactions-2.htm");
response.code(200);
return response;
}
}