diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
index b2fb830..9e54c06 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
@@ -105,7 +105,11 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected Account createAccount() throws Exception {
- final Account input = getAccount();
+ return createAccount(null);
+ }
+
+ protected Account createAccount(final UUID parentAccountId) throws Exception {
+ final Account input = getAccount(parentAccountId);
return killBillClient.createAccount(input, createdBy, reason, comment);
}
@@ -154,10 +158,18 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected Account getAccount() {
- return getAccount(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString().substring(0, 5) + '@' + UUID.randomUUID().toString().substring(0, 5));
+ return getAccount(null);
+ }
+
+ protected Account getAccount(final UUID parentAccountId) {
+ return getAccount(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString().substring(0, 5) + '@' + UUID.randomUUID().toString().substring(0, 5), parentAccountId);
}
public Account getAccount(final String name, final String externalKey, final String email) {
+ return getAccount(name, externalKey, email, null);
+ }
+
+ public Account getAccount(final String name, final String externalKey, final String email, final UUID parentAccountId) {
final UUID accountId = UUID.randomUUID();
final int length = 4;
final String currency = DEFAULT_CURRENCY;
@@ -171,9 +183,10 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
final String country = "France";
final String locale = "fr";
final String phone = "81 53 26 56";
+ final boolean isPaymentDelegatedToParent = parentAccountId != null;
// Note: the accountId payload is ignored on account creation
- return new Account(accountId, name, length, externalKey, email, null, currency, null, false, null, timeZone,
+ return new Account(accountId, name, length, externalKey, email, null, currency, parentAccountId, isPaymentDelegatedToParent, null, timeZone,
address1, address2, postalCode, company, city, state, country, locale, phone, false, false, null, null);
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
index deaf3fc..87806c2 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
@@ -30,6 +30,7 @@ import org.joda.time.LocalDate;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.ProductCategory;
+import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
import org.killbill.billing.client.model.AuditLog;
import org.killbill.billing.client.model.Credit;
@@ -678,6 +679,7 @@ public class TestInvoice extends TestJaxrsBase {
invoice = killBillClient.getInvoice(creditJson.getInvoiceId());
Assert.assertEquals(invoice.getStatus(), InvoiceStatus.COMMITTED.toString());
}
+
@Test(groups = "slow", description = "Can create a migration invoice")
public void testInvoiceMigration() throws Exception {
final Account accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
@@ -711,4 +713,58 @@ public class TestInvoice extends TestJaxrsBase {
assertEquals(accountWithBalanceAfterMigration.getAccountBalance().compareTo(accountWithBalance.getAccountBalance()), 0);
}
+ @Test(groups = "slow", description = "Can transfer credit to parent account")
+ public void testInvoiceTransferCreditToParentAccount() throws Exception {
+ final Account parentAccount = createAccount();
+ final Account childAccount = createAccount(parentAccount.getAccountId());
+
+ final BigDecimal creditAmount = BigDecimal.TEN;
+ final Credit credit = new Credit();
+ credit.setAccountId(childAccount.getAccountId());
+ credit.setInvoiceId(null);
+ credit.setCreditAmount(creditAmount);
+
+ // insert credit to child account
+ final Credit creditJson = killBillClient.createCredit(credit, false, createdBy, reason, comment);
+
+ Invoices childInvoices = killBillClient.getInvoicesForAccount(childAccount.getAccountId(), true, false);
+ Assert.assertEquals(childInvoices.size(), 1);
+ Assert.assertEquals(childInvoices.get(0).getCreditAdj().compareTo(BigDecimal.TEN), 0);
+
+ Invoices parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false);
+ Assert.assertEquals(parentInvoices.size(), 0);
+
+ // transfer credit to parent account
+ killBillClient.transferChildCreditToParent(childAccount.getAccountId(), createdBy, reason, comment);
+
+ childInvoices = killBillClient.getInvoicesForAccount(childAccount.getAccountId(), true, false);
+ Assert.assertEquals(childInvoices.size(), 2);
+ Assert.assertEquals(childInvoices.get(1).getCreditAdj().compareTo(BigDecimal.TEN.negate()), 0);
+
+ parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false);
+ Assert.assertEquals(parentInvoices.size(), 1);
+ Assert.assertEquals(parentInvoices.get(0).getCreditAdj().compareTo(BigDecimal.TEN), 0);
+ }
+
+ @Test(groups = "slow", description = "Fail to transfer credit from an account without parent account",
+ expectedExceptions = KillBillClientException.class, expectedExceptionsMessageRegExp = ".* does not have a Parent Account associated")
+ public void testInvoiceTransferCreditAccountNoParent() throws Exception {
+ final Account account = createAccount();
+
+ // transfer credit to parent account
+ killBillClient.transferChildCreditToParent(account.getAccountId(), createdBy, reason, comment);
+
+ }
+
+ @Test(groups = "slow", description = "Fail to transfer credit from an account without parent account",
+ expectedExceptions = KillBillClientException.class, expectedExceptionsMessageRegExp = ".* does not have credit")
+ public void testInvoiceTransferCreditAccountNoCredit() throws Exception {
+ final Account parentAccount = createAccount();
+ final Account childAccount = createAccount(parentAccount.getAccountId());
+
+ // transfer credit to parent account
+ killBillClient.transferChildCreditToParent(childAccount.getAccountId(), createdBy, reason, comment);
+
+ }
+
}