killbill-aplcache

Details

diff --git a/account/src/test/java/com/ning/billing/account/api/MockAccountUserApi.java b/account/src/test/java/com/ning/billing/account/api/MockAccountUserApi.java
index 52aa9db..4b6027e 100644
--- a/account/src/test/java/com/ning/billing/account/api/MockAccountUserApi.java
+++ b/account/src/test/java/com/ning/billing/account/api/MockAccountUserApi.java
@@ -21,9 +21,25 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import com.ning.billing.catalog.api.Currency;
+
 public class MockAccountUserApi implements AccountUserApi {
     private final CopyOnWriteArrayList<Account> accounts = new CopyOnWriteArrayList<Account>();
 
+    public Account createAccount(UUID id,
+                                 String externalKey,
+                                 String email,
+                                 String name,
+                                 int firstNameLength,
+                                 String phone,
+                                 Currency currency,
+                                 int billCycleDay,
+                                 String paymentProviderName) {
+        Account result = new DefaultAccount(id, externalKey, email, name, firstNameLength, phone, currency, billCycleDay, paymentProviderName);
+        accounts.add(result);
+        return result;
+    }
+
     @Override
     public Account createAccount(AccountData data) {
         Account result = new DefaultAccount(data);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
new file mode 100644
index 0000000..4899057
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
@@ -0,0 +1,45 @@
+package com.ning.billing.invoice.api;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import com.ning.billing.catalog.api.Currency;
+
+public class MockInvoicePaymentApi implements InvoicePaymentApi
+{
+    private final CopyOnWriteArrayList<Invoice> invoices = new CopyOnWriteArrayList<Invoice>();
+
+    public void add(Invoice invoice) {
+        invoices.add(invoice);
+    }
+
+    @Override
+    public void paymentSuccessful(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentId) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<Invoice> getInvoicesByAccount(UUID accountId) {
+        ArrayList<Invoice> result = new ArrayList<Invoice>();
+
+        for (Invoice invoice : invoices) {
+            if (accountId.equals(invoice.getAccountId())) {
+                result.add(invoice);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public Invoice getInvoice(UUID invoiceId) {
+        for (Invoice invoice : invoices) {
+            if (invoiceId.equals(invoice.getId())) {
+                return invoice;
+            }
+        }
+        return null;
+    }
+}

payment/pom.xml 8(+6 -2)

diff --git a/payment/pom.xml b/payment/pom.xml
index e8e4e90..5e8f86c 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -85,7 +85,11 @@
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.ning.billing</groupId>
+            <artifactId>killbill-invoice</artifactId>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
-    <build>
-    </build>
 </project>
diff --git a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
index 54ca415..6353a1b 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -21,6 +21,8 @@ import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.provider.PaymentProviderPlugin;
@@ -30,38 +32,57 @@ import com.ning.billing.util.eventbus.EventBus.EventBusException;
 
 public class RequestProcessor {
     public static final String PAYMENT_PROVIDER_KEY = "paymentProvider";
+    private final InvoicePaymentApi invoiceApi;
     private final AccountUserApi accountUserApi;
     private final PaymentProviderPluginRegistry pluginRegistry;
     private final EventBus eventBus;
 
     @Inject
     public RequestProcessor(AccountUserApi accountUserApi,
+                            InvoicePaymentApi invoiceApi,
                             PaymentProviderPluginRegistry pluginRegistry,
                             EventBus eventBus) {
+        this.invoiceApi = invoiceApi;
         this.accountUserApi = accountUserApi;
         this.pluginRegistry = pluginRegistry;
         this.eventBus = eventBus;
     }
 
     @Subscribe
-    public void receiveInvoice(Invoice invoice) throws EventBusException {
-        final Account account = accountUserApi.getAccountById(invoice.getAccountId());
-        final String paymentProviderName = account.getFieldValue(PAYMENT_PROVIDER_KEY);
-        final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
+    public void receiveInvoice(InvoiceCreationNotification event) throws EventBusException {
+        final Invoice invoice = invoiceApi.getInvoice(event.getInvoiceId());
+        if (invoice == null) {
+            // TODO: log a warning ?
+        }
+        else {
+            final Account account = accountUserApi.getAccountById(event.getAccountId());
+            if (account == null) {
+                // TODO: log a warning ?
+            }
+            else {
+                final String paymentProviderName = account.getFieldValue(PAYMENT_PROVIDER_KEY);
+                final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
 
-        Either<PaymentError, PaymentInfo> result = plugin.processInvoice(account, invoice);
+                Either<PaymentError, PaymentInfo> result = plugin.processInvoice(account, invoice);
 
-        eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+                eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+            }
+        }
     }
 
     @Subscribe
     public void receivePaymentInfoRequest(PaymentInfoRequest paymentInfoRequest) throws EventBusException {
         final Account account = accountUserApi.getAccountById(paymentInfoRequest.getAccountId());
-        final String paymentProviderName = account.getFieldValue(PAYMENT_PROVIDER_KEY);
-        final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
+        if (account == null) {
+            // TODO: log a warning ?
+        }
+        else {
+            final String paymentProviderName = account.getFieldValue(PAYMENT_PROVIDER_KEY);
+            final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
 
-        Either<PaymentError, PaymentInfo> result = plugin.getPaymentInfo(paymentInfoRequest.getPaymentId());
+            Either<PaymentError, PaymentInfo> result = plugin.getPaymentInfo(paymentInfoRequest.getPaymentId());
 
-        eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+            eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+        }
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java b/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
index 4b96dce..87226bf 100644
--- a/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
+++ b/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
@@ -21,6 +21,10 @@ import org.apache.commons.collections.MapUtils;
 import com.google.common.collect.ImmutableMap;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.api.MockAccountUserApi;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.invoice.api.MockInvoicePaymentApi;
+import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.model.InvoiceGenerator;
 import com.ning.billing.payment.provider.MockPaymentProviderPluginModule;
 import com.ning.billing.util.eventbus.EventBus;
 import com.ning.billing.util.eventbus.MemoryEventBus;
@@ -39,6 +43,10 @@ public class PaymentTestModule extends PaymentModule {
     protected void configure() {
         super.configure();
         bind(EventBus.class).to(MemoryEventBus.class).asEagerSingleton();
-        bind(AccountUserApi.class).to(MockAccountUserApi.class).asEagerSingleton();
+        bind(AccountUserApi.class).to(MockAccountUserApi.class);
+        bind(MockAccountUserApi.class).asEagerSingleton();
+        bind(InvoiceGenerator.class).to(DefaultInvoiceGenerator.class).asEagerSingleton();
+        bind(InvoicePaymentApi.class).to(MockInvoicePaymentApi.class);
+        bind(MockInvoicePaymentApi.class).asEagerSingleton();
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
index 3c2e658..e14235e 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
@@ -36,8 +36,7 @@ import org.testng.annotations.Test;
 
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountUserApi;
-import com.ning.billing.account.api.DefaultAccount;
+import com.ning.billing.account.api.MockAccountUserApi;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.billing.BillingEvent;
@@ -45,7 +44,9 @@ import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.invoice.api.BillingEventSet;
 import com.ning.billing.invoice.api.DefaultBillingEvent;
 import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.MockInvoicePaymentApi;
 import com.ning.billing.invoice.model.InvoiceGenerator;
 import com.ning.billing.invoice.model.InvoiceItemList;
 import com.ning.billing.invoice.tests.InternationalPriceMock;
@@ -61,9 +62,11 @@ public class TestPaymentProvider {
     @Inject
     private RequestProcessor invoiceProcessor;
     @Inject
-    private AccountUserApi accountUserApi;
+    private MockAccountUserApi accountUserApi;
     @Inject
-    private Invoice invoiceApi;
+    private InvoiceGenerator generator;
+    @Inject
+    private MockInvoicePaymentApi invoiceApi;
 
     private MockPaymentInfoReceiver paymentInfoReceiver;
 
@@ -81,19 +84,67 @@ public class TestPaymentProvider {
         eventBus.stop();
     }
 
-    protected Account getTestAccount() {
+    protected Account createAccount() {
         String name = "First" + RandomStringUtils.random(5) + " " + "Last" + RandomStringUtils.random(5);
         String externalKey = "12345";
-//        return accountUserApi.createAccount(new DefaultAccount(UUID.randomUUID(), externalKey, "user@example.com", name, name.length(), "123-456-7890", Currency.USD, 1, null));
-        return new DefaultAccount(UUID.randomUUID(), externalKey, "user@example.com", name, name.length(), "123-456-7890", Currency.USD, 1, null);
+        return accountUserApi.createAccount(UUID.randomUUID(), externalKey, "user@example.com", name, name.length(), "123-456-7890", Currency.USD, 1, null);
+    }
+
+    protected Invoice createInvoice(Account account,
+                                    List<BillingEvent> events,
+                                    List<InvoiceItem> items,
+                                    DateTime targetDate,
+                                    Currency currency) {
+        BillingEventSet billingEvents = null;
+        InvoiceItemList invoiceItems = null;
+
+        if (events != null) {
+            billingEvents = new BillingEventSet();
+            billingEvents.addAll(events);
+        }
+        if (items != null) {
+            invoiceItems = new InvoiceItemList();
+            invoiceItems.addAll(items);
+        }
+
+        Invoice invoice = generator.generateInvoice(account.getId(), billingEvents, invoiceItems, targetDate, currency);
+
+        invoiceApi.add(invoice);
+        return invoice;
+    }
+
+    protected InvoiceCreationNotification createNotificationFor(final Invoice invoice) {
+        return new InvoiceCreationNotification() {
+            @Override
+            public UUID getInvoiceId() {
+                return invoice.getId();
+            }
+
+            @Override
+            public DateTime getInvoiceCreationDate() {
+                return invoice.getInvoiceDate();
+            }
+
+            @Override
+            public Currency getCurrency() {
+                return invoice.getCurrency();
+            }
+
+            @Override
+            public BigDecimal getAmountOwed() {
+                return invoice.getAmountOutstanding();
+            }
+
+            @Override
+            public UUID getAccountId() {
+                return invoice.getAccountId();
+            }
+        };
     }
 
     @Test
     public void testSimpleInvoice() throws Exception {
-        InvoiceGenerator generator = new DefaultInvoiceGenerator();
-
-        final Account account = getTestAccount();
-        final UUID invoiceUuid = UUID.randomUUID();
+        final Account account = createAccount();
         final DateTime now = new DateTime();
 
         BillingEventSet events = new BillingEventSet();
@@ -107,16 +158,9 @@ public class TestPaymentProvider {
                                                1, BillingModeType.IN_ADVANCE);
         events.add(event);
 
-        InvoiceItemList existingInvoiceItems = new InvoiceItemList();
-
-        UUID accountId = UUID.randomUUID();
-
-        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, now, Currency.USD);
-        existingInvoiceItems.addAll(invoice.getItems());
-
-//        DefaultInvoice(account.getId(), lineItems, Currency.USD);
+        final Invoice invoice = createInvoice(account, null, null, new DateTime(), Currency.USD);
 
-        eventBus.post(invoice);
+        eventBus.post(createNotificationFor(invoice));
         await().atMost(1, MINUTES).until(new Callable<Boolean>() {
             @Override
             public Boolean call() throws Exception {

pom.xml 6(+6 -0)

diff --git a/pom.xml b/pom.xml
index a3d4b5b..fd310f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,6 +82,12 @@
             </dependency>
             <dependency>
                 <groupId>com.ning.billing</groupId>
+                <artifactId>killbill-invoice</artifactId>
+                <version>${project.version}</version>
+                <classifier>tests</classifier>
+            </dependency>
+            <dependency>
+                <groupId>com.ning.billing</groupId>
                 <artifactId>killbill-util</artifactId>
                 <version>${project.version}</version>
                 <type>test-jar</type>