Details
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java b/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java
new file mode 100644
index 0000000..00882fa
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.api;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+
+public class InvoicePayment {
+ private final UUID invoiceId;
+ private final UUID paymentAttemptId;
+ private final DateTime paymentAttemptDate;
+ private final BigDecimal amount;
+ private final Currency currency;
+
+ public InvoicePayment(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate) {
+ this.invoiceId = invoiceId;
+ this.paymentAttemptId = paymentAttemptId;
+ this.paymentAttemptDate = paymentAttemptDate;
+ this.amount = amount;
+ this.currency = currency;
+ }
+
+ public UUID getInvoiceId() {
+ return invoiceId;
+ }
+
+ public UUID getPaymentAttemptId() {
+ return paymentAttemptId;
+ }
+
+ public DateTime getPaymentAttemptDate() {
+ return paymentAttemptDate;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ @Override
+ public String toString() {
+ return "InvoicePayment [invoiceId=" + invoiceId + ", paymentAttemptId=" + paymentAttemptId + ", paymentAttemptDate=" + paymentAttemptDate + ", amount=" + amount + ", currency=" + currency + "]";
+ }
+
+}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
index 8240931..54f8747 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
@@ -16,13 +16,14 @@
package com.ning.billing.invoice.api;
-import com.ning.billing.catalog.api.Currency;
-
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
+
import org.joda.time.DateTime;
+import com.ning.billing.catalog.api.Currency;
+
public interface InvoicePaymentApi {
public void paymentSuccessful(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate);
@@ -31,4 +32,6 @@ public interface InvoicePaymentApi {
public List<Invoice> getInvoicesByAccount(UUID accountId);
public Invoice getInvoice(UUID invoiceId);
+
+ public InvoicePayment getInvoicePayment(UUID invoiceId, UUID paymentAttemptId);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index fac63ba..2fda310 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -19,11 +19,13 @@ package com.ning.billing.invoice.api.invoice;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
+
import org.joda.time.DateTime;
-import org.skife.jdbi.v2.IDBI;
+
import com.google.inject.Inject;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.api.InvoicePaymentApi;
import com.ning.billing.invoice.dao.InvoiceDao;
@@ -54,4 +56,10 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
public Invoice getInvoice(UUID invoiceId) {
return dao.getById(invoiceId.toString());
}
+
+ @Override
+ public InvoicePayment getInvoicePayment(UUID invoiceId, UUID paymentAttemptId) {
+ throw new UnsupportedOperationException();
+ }
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index 797f587..cc408fb 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -16,26 +16,27 @@
package com.ning.billing.invoice.model;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.util.clock.DefaultClock;
-import org.joda.time.DateTime;
-
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.util.clock.DefaultClock;
+
public class DefaultInvoice implements Invoice {
private final InvoiceItemList items = new InvoiceItemList();
private final UUID id;
- private UUID accountId;
+ private final UUID accountId;
private final DateTime invoiceDate;
private final DateTime targetDate;
- private Currency currency;
- private BigDecimal amountPaid;
- private DateTime lastPaymentAttempt;
+ private final Currency currency;
+ private final BigDecimal amountPaid;
+ private final DateTime lastPaymentAttempt;
public DefaultInvoice(UUID accountId, DateTime targetDate, Currency currency) {
this(UUID.randomUUID(), accountId, new DefaultClock().getUTCNow(), targetDate, currency, null, BigDecimal.ZERO, new ArrayList<InvoiceItem>());
@@ -132,5 +133,11 @@ public class DefaultInvoice implements Invoice {
return lastPaymentAttempt.plusDays(numberOfDays).isBefore(targetDate);
}
+
+ @Override
+ public String toString() {
+ return "DefaultInvoice [items=" + items + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + amountPaid + ", lastPaymentAttempt=" + lastPaymentAttempt + "]";
+ }
+
}
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
index 3a60656..a5bf03e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
@@ -74,46 +74,20 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
InvoicePayment invoicePayment = new InvoicePayment(invoiceId, null, null, paymentAttemptId, paymentAttemptDate);
for (InvoicePayment existingInvoicePayment : invoicePayments) {
if (existingInvoicePayment.getInvoiceId().equals(invoiceId) && existingInvoicePayment.getPaymentAttemptId().equals(paymentAttemptId)) {
- invoicePayments.remove(invoicePayment);
+ invoicePayments.remove(existingInvoicePayment);
}
}
invoicePayments.add(invoicePayment);
}
- private static class InvoicePayment {
- private final UUID invoiceId;
- private final UUID paymentAttemptId;
- private final DateTime paymentAttemptDate;
- private final BigDecimal amount;
- private final Currency currency;
-
- public InvoicePayment(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate) {
- this.invoiceId = invoiceId;
- this.paymentAttemptId = paymentAttemptId;
- this.paymentAttemptDate = paymentAttemptDate;
- this.amount = amount;
- this.currency = currency;
- }
-
- public UUID getInvoiceId() {
- return invoiceId;
- }
-
- public UUID getPaymentAttemptId() {
- return paymentAttemptId;
- }
-
- public DateTime getPaymentAttemptDate() {
- return paymentAttemptDate;
- }
-
- public BigDecimal getAmount() {
- return amount;
- }
-
- public Currency getCurrency() {
- return currency;
+ @Override
+ public InvoicePayment getInvoicePayment(UUID invoiceId, UUID paymentAttemptId) {
+ for (InvoicePayment existingInvoicePayment : invoicePayments) {
+ if (existingInvoicePayment.getInvoiceId().equals(invoiceId) && existingInvoicePayment.getPaymentAttemptId().equals(paymentAttemptId)) {
+ return existingInvoicePayment;
+ }
}
-
+ return null;
}
+
}
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 db5abcf..1da8bd9 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -79,11 +79,17 @@ public class RequestProcessor {
Either<PaymentError, PaymentInfo> result = plugin.processInvoice(account, invoice);
if (result.isLeft()) {
- invoiceApi.paymentFailed(invoice.getId(), paymentAttempt.getPaymentAttemptId(), paymentAttempt.getPaymentAttemptDate());
+ invoiceApi.paymentFailed(invoice.getId(),
+ paymentAttempt.getPaymentAttemptId(),
+ paymentAttempt.getPaymentAttemptDate());
}
else {
updatePaymentAttemptWithPaymentInfoId(result.getRight().getId(), plugin);
- invoiceApi.paymentSuccessful(invoice.getId(), paymentAmount, invoice.getCurrency(), paymentAttempt.getPaymentAttemptId(), paymentAttempt.getPaymentAttemptDate());
+ invoiceApi.paymentSuccessful(invoice.getId(),
+ paymentAmount,
+ invoice.getCurrency(),
+ paymentAttempt.getPaymentAttemptId(),
+ paymentAttempt.getPaymentAttemptDate());
}
eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
}
diff --git a/payment/src/test/java/com/ning/billing/payment/TestNotifyInvoicePaymentApi.java b/payment/src/test/java/com/ning/billing/payment/TestNotifyInvoicePaymentApi.java
new file mode 100644
index 0000000..660b25f
--- /dev/null
+++ b/payment/src/test/java/com/ning/billing/payment/TestNotifyInvoicePaymentApi.java
@@ -0,0 +1,50 @@
+package com.ning.billing.payment;
+
+import static org.testng.Assert.assertNotNull;
+
+import java.util.UUID;
+
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.payment.setup.PaymentTestModule;
+
+@Guice(modules = PaymentTestModule.class)
+public class TestNotifyInvoicePaymentApi extends TestPaymentProvider {
+
+ @Test
+ public void testNotifyPaymentSuccess() {
+ final Account account = createTestAccount();
+ final Invoice invoice = createTestInvoice(account);
+
+ PaymentAttempt paymentAttempt = new PaymentAttempt(UUID.randomUUID(), invoice);
+ invoicePaymentApi.paymentSuccessful(invoice.getId(),
+ invoice.getAmountOutstanding(),
+ invoice.getCurrency(),
+ paymentAttempt.getPaymentAttemptId(),
+ paymentAttempt.getPaymentAttemptDate());
+
+ InvoicePayment invoicePayment = invoicePaymentApi.getInvoicePayment(invoice.getId(), paymentAttempt.getPaymentAttemptId());
+
+ assertNotNull(invoicePayment);
+ }
+
+ @Test
+ public void testNotifyPaymentFailure() {
+ final Account account = createTestAccount();
+ final Invoice invoice = createTestInvoice(account);
+
+ PaymentAttempt paymentAttempt = new PaymentAttempt(UUID.randomUUID(), invoice);
+ invoicePaymentApi.paymentFailed(invoice.getId(),
+ paymentAttempt.getPaymentAttemptId(),
+ paymentAttempt.getPaymentAttemptDate());
+
+ InvoicePayment invoicePayment = invoicePaymentApi.getInvoicePayment(invoice.getId(), paymentAttempt.getPaymentAttemptId());
+
+ assertNotNull(invoicePayment);
+ }
+
+}
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 9be2dc1..5ceba69 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
@@ -58,7 +58,7 @@ public class TestPaymentProvider {
@Inject
protected MockAccountUserApi accountUserApi;
@Inject
- protected MockInvoicePaymentApi invoiceApi;
+ protected MockInvoicePaymentApi invoicePaymentApi;
private MockPaymentInfoReceiver paymentInfoReceiver;
@@ -76,18 +76,67 @@ public class TestPaymentProvider {
eventBus.stop();
}
- protected Account createAccount() {
+ protected Account createTestAccount() {
String name = "First" + RandomStringUtils.random(5) + " " + "Last" + RandomStringUtils.random(5);
String externalKey = "12345";
return accountUserApi.createAccount(UUID.randomUUID(), externalKey, "user@example.com", name, name.length(), "123-456-7890", Currency.USD, 1, null, BigDecimal.ZERO);
}
+ @Test
+ public void testSimpleInvoice() throws Exception {
+ final Account account = createTestAccount();
+ final Invoice invoice = createTestInvoice(account);
+
+ eventBus.post(createNotificationFor(invoice));
+ await().atMost(1, MINUTES).until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ List<PaymentInfo> processedPayments = paymentInfoReceiver.getProcessedPayments();
+ List<PaymentError> errors = paymentInfoReceiver.getErrors();
+
+ return processedPayments.size() == 1 || errors.size() == 1;
+ }
+ });
+
+ assertFalse(paymentInfoReceiver.getProcessedPayments().isEmpty());
+ assertTrue(paymentInfoReceiver.getErrors().isEmpty());
+
+ final PaymentInfo paymentInfo = paymentInfoReceiver.getProcessedPayments().get(0);
+ final PaymentInfoRequest paymentInfoRequest = new PaymentInfoRequest(account.getId(), paymentInfo.getId());
+
+ paymentInfoReceiver.clear();
+ eventBus.post(paymentInfoRequest);
+ await().atMost(5, MINUTES).until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ List<PaymentInfo> processedPayments = paymentInfoReceiver.getProcessedPayments();
+ List<PaymentError> errors = paymentInfoReceiver.getErrors();
+
+ return processedPayments.size() == 1 || errors.size() == 1;
+ }
+ });
+
+ assertFalse(paymentInfoReceiver.getProcessedPayments().isEmpty());
+ assertTrue(paymentInfoReceiver.getErrors().isEmpty());
+ assertEquals(paymentInfoReceiver.getProcessedPayments().get(0), paymentInfo);
+ }
+
+ protected Invoice createTestInvoice(final Account account) {
+ final DateTime now = new DateTime();
+ final UUID subscriptionId = UUID.randomUUID();
+ final BigDecimal amount = new BigDecimal("10.00");
+ final Invoice invoice = createInvoice(account, now, Currency.USD);
+
+ invoice.add(new DefaultInvoiceItem(invoice.getId(), subscriptionId, now, now.plusMonths(1), "Test", amount, new BigDecimal("1.0"), Currency.USD));
+ return invoice;
+ }
+
protected Invoice createInvoice(Account account,
DateTime targetDate,
Currency currency) {
Invoice invoice = new DefaultInvoice(account.getId(), targetDate, currency);
- invoiceApi.add(invoice);
+ invoicePaymentApi.add(invoice);
return invoice;
}
@@ -120,47 +169,4 @@ public class TestPaymentProvider {
};
}
- @Test
- public void testSimpleInvoice() throws Exception {
- final Account account = createAccount();
- final DateTime now = new DateTime();
- final UUID subscriptionId = UUID.randomUUID();
- final BigDecimal amount = new BigDecimal("10.00");
- final Invoice invoice = createInvoice(account, now, Currency.USD);
-
- invoice.add(new DefaultInvoiceItem(invoice.getId(), subscriptionId, now, now.plusMonths(1), "Test", amount, new BigDecimal("1.0"), Currency.USD));
-
- eventBus.post(createNotificationFor(invoice));
- await().atMost(1, MINUTES).until(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- List<PaymentInfo> processedPayments = paymentInfoReceiver.getProcessedPayments();
- List<PaymentError> errors = paymentInfoReceiver.getErrors();
-
- return processedPayments.size() == 1 || errors.size() == 1;
- }
- });
-
- assertFalse(paymentInfoReceiver.getProcessedPayments().isEmpty());
- assertTrue(paymentInfoReceiver.getErrors().isEmpty());
-
- final PaymentInfo paymentInfo = paymentInfoReceiver.getProcessedPayments().get(0);
- final PaymentInfoRequest paymentInfoRequest = new PaymentInfoRequest(account.getId(), paymentInfo.getId());
-
- paymentInfoReceiver.clear();
- eventBus.post(paymentInfoRequest);
- await().atMost(5, MINUTES).until(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- List<PaymentInfo> processedPayments = paymentInfoReceiver.getProcessedPayments();
- List<PaymentError> errors = paymentInfoReceiver.getErrors();
-
- return processedPayments.size() == 1 || errors.size() == 1;
- }
- });
-
- assertFalse(paymentInfoReceiver.getProcessedPayments().isEmpty());
- assertTrue(paymentInfoReceiver.getErrors().isEmpty());
- assertEquals(paymentInfoReceiver.getProcessedPayments().get(0), paymentInfo);
- }
}