Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index 3a14ae9..62a79f5 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -29,7 +29,12 @@ import javax.inject.Named;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.usage.api.UsageUserApi;
+import org.killbill.billing.util.api.TagApiException;
+import org.killbill.billing.util.api.TagDefinitionApiException;
+import org.killbill.billing.util.tag.ControlTagType;
+import org.killbill.billing.util.tag.Tag;
import org.skife.jdbi.v2.IDBI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -100,6 +105,7 @@ import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Stage;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
@@ -573,6 +579,21 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
}, events);
}
+ protected void add_AUTO_PAY_OFF_Tag(final UUID id, final ObjectType type) throws TagDefinitionApiException, TagApiException {
+ busHandler.pushExpectedEvent(NextEvent.TAG);
+ tagUserApi.addTag(id, type, ControlTagType.AUTO_PAY_OFF.getId(), callContext);
+ assertListenerStatus();
+
+ final List<Tag> tags = tagUserApi.getTagsForObject(id, type, false, callContext);
+ assertEquals(tags.size(), 1);
+ }
+
+ protected void remove_AUTO_PAY_OFF_Tag(final UUID id, final ObjectType type) throws TagDefinitionApiException, TagApiException {
+ busHandler.pushExpectedEvent(NextEvent.TAG);
+ tagUserApi.removeTag(id, type, ControlTagType.AUTO_PAY_OFF.getId(), callContext);
+ assertListenerStatus();
+ }
+
private <T> T doCallAndCheckForCompletion(Function<Void, T> f, final NextEvent... events) {
Joiner joiner = Joiner.on(", ");
log.debug(" ************ STARTING BUS HANDLER CHECK : {} ********************", joiner.join(events));
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
index de0c16b..5afe70e 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
@@ -18,8 +18,6 @@ package org.killbill.billing.beatrix.integration;
import java.math.BigDecimal;
import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
import org.joda.time.DateTime;
import org.testng.annotations.BeforeMethod;
@@ -35,12 +33,7 @@ import org.killbill.billing.entitlement.api.DefaultEntitlement;
import org.killbill.billing.invoice.api.Invoice;
import org.killbill.billing.invoice.api.InvoiceUserApi;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
-import org.killbill.billing.util.api.TagApiException;
-import org.killbill.billing.util.api.TagDefinitionApiException;
-import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.config.PaymentConfig;
-import org.killbill.billing.util.tag.ControlTagType;
-import org.killbill.billing.util.tag.Tag;
import com.google.inject.Inject;
@@ -51,12 +44,6 @@ import static org.testng.Assert.assertTrue;
public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
@Inject
- private InvoiceUserApi invoiceApi;
-
- @Inject
- private TagUserApi tagApi;
-
- @Inject
private PaymentConfig paymentConfig;
private Account account;
@@ -84,7 +71,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
final DefaultEntitlement bpEntitlement = createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey", productName, ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.INVOICE);
assertNotNull(bpEntitlement);
- Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ Collection<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 1);
busHandler.pushExpectedEvents(NextEvent.PHASE);
@@ -93,7 +80,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -107,7 +94,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
assertListenerStatus();
addDelayBceauseOfLackOfCorrectSynchro();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -127,7 +114,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
final DefaultEntitlement bpEntitlement = createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey", productName, ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.INVOICE);
assertNotNull(bpEntitlement);
- Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ Collection<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 1);
busHandler.pushExpectedEvents(NextEvent.PHASE);
@@ -136,7 +123,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -151,7 +138,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
assertListenerStatus();
addDelayBceauseOfLackOfCorrectSynchro();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -168,7 +155,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
clock.addDays(nbDaysBeforeRetry + 1);
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
continue;
@@ -188,7 +175,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
final DefaultEntitlement bpEntitlement = createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey", productName, ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.INVOICE);
assertNotNull(bpEntitlement);
- Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ Collection<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 1);
// CREATE FIRST NON NULL INVOICE + FIRST PAYMENT/ATTEMPT -> AUTO_PAY_OFF
@@ -197,7 +184,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
clock.addDays(31); // After trial
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -213,7 +200,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
assertListenerStatus();
addDelayBceauseOfLackOfCorrectSynchro();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -231,7 +218,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
clock.addDays(nbDaysBeforeRetry + 1);
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
assertEquals(invoices.size(), 2);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -253,7 +240,7 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
clock.addDays(nbDaysBeforeRetry + 1);
assertListenerStatus();
- invoices = invoiceApi.getInvoicesByAccount(account.getId(), callContext);
+ invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
for (Invoice cur : invoices) {
if (cur.getChargedAmount().compareTo(BigDecimal.ZERO) == 0) {
continue;
@@ -265,20 +252,6 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
}
- private void add_AUTO_PAY_OFF_Tag(final UUID id, final ObjectType type) throws TagDefinitionApiException, TagApiException {
- busHandler.pushExpectedEvent(NextEvent.TAG);
- tagApi.addTag(id, type, ControlTagType.AUTO_PAY_OFF.getId(), callContext);
- assertListenerStatus();
-
- final List<Tag> tags = tagApi.getTagsForObject(id, type, false, callContext);
- assertEquals(tags.size(), 1);
- }
-
- private void remove_AUTO_PAY_OFF_Tag(final UUID id, final ObjectType type) throws TagDefinitionApiException, TagApiException {
- busHandler.pushExpectedEvent(NextEvent.TAG);
- tagApi.removeTag(id, type, ControlTagType.AUTO_PAY_OFF.getId(), callContext);
- assertListenerStatus();
- }
private void addDelayBceauseOfLackOfCorrectSynchro() {
// TODO When removing the tag, the payment system will schedule retries for payments that are in non terminal state
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPayment.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPayment.java
new file mode 100644
index 0000000..d9e2992
--- /dev/null
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPayment.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2014 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.beatrix.integration;
+
+import java.math.BigDecimal;
+
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountData;
+import org.killbill.billing.api.TestApiListener.NextEvent;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.invoice.api.Invoice;
+import org.killbill.billing.invoice.api.InvoiceItem;
+import org.killbill.billing.payment.api.Payment;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertTrue;
+
+public class TestPayment extends TestIntegrationBase {
+
+ @Test(groups = "slow")
+ public void testPartialPayments() throws Exception {
+
+ final AccountData accountData = getAccountData(1);
+ final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+ accountChecker.checkAccount(account.getId(), accountData, callContext);
+
+ add_AUTO_PAY_OFF_Tag(account.getId(), ObjectType.ACCOUNT);
+
+ clock.setDay(new LocalDate(2012, 4, 1));
+
+ busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
+ final InvoiceItem item1 = invoiceUserApi.insertExternalCharge(account.getId(), BigDecimal.TEN, "Initial external charge", clock.getToday(DateTimeZone.UTC), Currency.USD, callContext);
+ assertListenerStatus();
+
+ busHandler.pushExpectedEvents(NextEvent.PAYMENT);
+ final Payment payment1 = paymentApi.createPayment(account, item1.getInvoiceId(), new BigDecimal("4.00"), callContext);
+ assertListenerStatus();
+
+ Invoice invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext);
+ assertTrue(invoice1.getBalance().compareTo(new BigDecimal("6.00")) == 0);
+ assertTrue(invoice1.getPaidAmount().compareTo(new BigDecimal("4.00")) == 0);
+ assertTrue(invoice1.getChargedAmount().compareTo(BigDecimal.TEN) == 0);
+
+ BigDecimal accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext);
+ assertTrue(accountBalance.compareTo(new BigDecimal("6.00")) == 0);
+
+ busHandler.pushExpectedEvents(NextEvent.PAYMENT);
+ final Payment payment2 = paymentApi.createPayment(account, item1.getInvoiceId(), new BigDecimal("6.00"), callContext);
+ assertListenerStatus();
+
+ invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext);
+ assertTrue(invoice1.getBalance().compareTo(BigDecimal.ZERO) == 0);
+ assertTrue(invoice1.getPaidAmount().compareTo(BigDecimal.TEN) == 0);
+ assertTrue(invoice1.getChargedAmount().compareTo(BigDecimal.TEN) == 0);
+
+ accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext);
+ assertTrue(accountBalance.compareTo(BigDecimal.ZERO) == 0);
+
+/*
+ This does not work since item is paid across multiple payments and so the mount is bigger than the payment.
+
+ // Now, issue refund with item adjustment on first invoice/item
+ paymentApi.createRefundWithItemsAdjustments(account, payment1.getId(), Sets.<UUID>newHashSet(item1.getId()), callContext);
+
+ invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext);
+ assertTrue(invoice1.getBalance().compareTo(BigDecimal.ZERO) == 0);
+
+ accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext);
+ assertTrue(accountBalance.compareTo(BigDecimal.ZERO) == 0);
+
+*/
+ // And then issue refund with item adjustment on first invoice/item
+ paymentApi.createRefund(account, payment2.getId(), new BigDecimal("5.00"), callContext);
+
+ invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext);
+ assertTrue(invoice1.getBalance().compareTo(new BigDecimal("5.00")) == 0);
+
+ accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext);
+ assertTrue(accountBalance.compareTo(new BigDecimal("5.00")) == 0);
+
+ }
+}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
index d3c8485..80fa6a4 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
@@ -24,11 +24,11 @@ import java.util.UUID;
import javax.annotation.Nullable;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
+import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountData;
import org.killbill.billing.api.TestApiListener.NextEvent;
import org.killbill.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
import org.killbill.billing.beatrix.util.PaymentChecker.ExpectedPaymentCheck;
@@ -42,12 +42,17 @@ import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.payment.api.Payment;
import org.killbill.billing.payment.api.PaymentStatus;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
public class TestPaymentRefund extends TestIntegrationBase {
@@ -81,7 +86,8 @@ public class TestPaymentRefund extends TestIntegrationBase {
invoice = invoiceChecker.checkInvoice(account.getId(), invoiceItemCount++, callContext,
new ExpectedInvoiceItemCheck(new LocalDate(2012, 3, 2),
new LocalDate(2012, 3, 31), InvoiceItemType.RECURRING, new BigDecimal("233.82")),
- new ExpectedInvoiceItemCheck(InvoiceItemType.ITEM_ADJ, new BigDecimal("-233.82")));
+ new ExpectedInvoiceItemCheck(InvoiceItemType.ITEM_ADJ, new BigDecimal("-233.82"))
+ );
}
@Test(groups = "slow")
@@ -91,10 +97,12 @@ public class TestPaymentRefund extends TestIntegrationBase {
invoice = invoiceChecker.checkInvoice(account.getId(), invoiceItemCount++, callContext,
new ExpectedInvoiceItemCheck(new LocalDate(2012, 3, 2),
new LocalDate(2012, 3, 31), InvoiceItemType.RECURRING, new BigDecimal("233.82")),
- new ExpectedInvoiceItemCheck(InvoiceItemType.REFUND_ADJ, new BigDecimal("-233.82")));
-
+ new ExpectedInvoiceItemCheck(InvoiceItemType.REFUND_ADJ, new BigDecimal("-233.82"))
+ );
}
+
+
private void setupRefundTest() throws Exception {
final int billingDay = 31;