killbill-memoizeit
Changes
beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java 31(+20 -11)
invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java 27(+18 -9)
invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java 39(+21 -18)
Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
index d3ffe9c..b4a65ac 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
@@ -88,11 +88,14 @@ public class TestConsumableInArrear extends TestIntegrationBase {
new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2013, 5, 1), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
new ExpectedInvoiceItemCheck(new LocalDate(2012, 4, 1), new LocalDate(2012, 5, 1), InvoiceItemType.USAGE, new BigDecimal("5.90")));
- // We don't expect any invoice
- busHandler.pushExpectedEvents(NextEvent.NULL_INVOICE);
+ // $0 invoice
+ busHandler.pushExpectedEvents(NextEvent.INVOICE);
clock.addMonths(1);
assertListenerStatus();
+ invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+ new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 6, 1), InvoiceItemType.USAGE, BigDecimal.ZERO));
+
setUsage(aoSubscription.getId(), "bullets", new LocalDate(2012, 6, 1), 50L, callContext);
setUsage(aoSubscription.getId(), "bullets", new LocalDate(2012, 6, 16), 300L, callContext);
@@ -100,7 +103,7 @@ public class TestConsumableInArrear extends TestIntegrationBase {
clock.addMonths(1);
assertListenerStatus();
- invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+ invoiceChecker.checkInvoice(account.getId(), 4, callContext,
new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 1), new LocalDate(2012, 7, 1), InvoiceItemType.USAGE, new BigDecimal("11.80")));
// Should be ignored because this is outside of optimization range (org.killbill.invoice.readMaxRawUsagePreviousPeriod = 2) => we will only look for items > 2012-7-1 - 2 months = 2012-5-1
@@ -117,14 +120,14 @@ public class TestConsumableInArrear extends TestIntegrationBase {
clock.addMonths(1);
assertListenerStatus();
- invoiceChecker.checkInvoice(account.getId(), 4, callContext,
+ invoiceChecker.checkInvoice(account.getId(), 5, callContext,
new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 6, 1), InvoiceItemType.USAGE, new BigDecimal("5.90")),
new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 1), new LocalDate(2012, 8, 1), InvoiceItemType.USAGE, new BigDecimal("11.80")));
// Add a few more month of usage data and check correctness of invoice: iterate 8 times until 2013-4-1 (prior ANNUAL renewal)
LocalDate startDate = new LocalDate(2012, 8, 1);
- int currentInvoice = 5;
+ int currentInvoice = 6;
for (int i = 0; i < 8; i++) {
setUsage(aoSubscription.getId(), "bullets", startDate.plusDays(15), 350L, callContext);
@@ -225,12 +228,18 @@ public class TestConsumableInArrear extends TestIntegrationBase {
final DateTime firstExpectedCTD = account.getReferenceTime().withMonthOfYear(5).withDayOfMonth(1);
Assert.assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(firstExpectedCTD), 0);
- // No usage in second month
- busHandler.pushExpectedEvents(NextEvent.NULL_INVOICE);
+ // $0 invoice
+ busHandler.pushExpectedEvents(NextEvent.INVOICE);
clock.addMonths(1);
assertListenerStatus();
- Assert.assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(firstExpectedCTD), 0);
+
+ invoiceChecker.checkInvoice(account.getId(), 2, callContext,
+ new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 6, 1), InvoiceItemType.USAGE, BigDecimal.ZERO));
+
+ final DateTime secondExpectedCTD = account.getReferenceTime().withMonthOfYear(6).withDayOfMonth(1);
+
+ Assert.assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(secondExpectedCTD), 0);
// Record usage for third month (verify invoicing resumes)
setUsage(bpSubscription.getId(), "stones", new LocalDate(2012, 6, 5), 25L, callContext);
@@ -240,11 +249,11 @@ public class TestConsumableInArrear extends TestIntegrationBase {
clock.addMonths(1);
assertListenerStatus();
- invoiceChecker.checkInvoice(account.getId(), 2, callContext,
+ invoiceChecker.checkInvoice(account.getId(), 3, callContext,
new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 1), new LocalDate(2012, 7, 1), InvoiceItemType.USAGE, new BigDecimal("100")));
- final DateTime secondExpectedCTD = account.getReferenceTime().withMonthOfYear(7).withDayOfMonth(1);
- Assert.assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(secondExpectedCTD), 0);
+ final DateTime thirdExpectedCTD = account.getReferenceTime().withMonthOfYear(7).withDayOfMonth(1);
+ Assert.assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(thirdExpectedCTD), 0);
}
private void setUsage(final UUID subscriptionId, final String unitType, final LocalDate startDate, final Long amount, final CallContext context) throws UsageApiException {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
index 90b9501..a55c0bf 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
@@ -63,19 +63,21 @@ public class ContiguousIntervalCapacityUsageInArrear extends ContiguousIntervalU
}
@Override
- protected void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final List<InvoiceItem> result) throws InvoiceApiException {
+ protected void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final boolean isPeriodPreviouslyBilled, final List<InvoiceItem> result) throws InvoiceApiException {
// Compute final amount by subtracting amount that was already billed.
final BigDecimal amountToBill = toBeBilledUsage.subtract(billedUsage);
- if (amountToBill.compareTo(BigDecimal.ZERO) > 0) {
- final String itemDetails = areAllBilledItemsWithDetails ? toJson(toBeBilledUsageDetails) : null;
- final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(),
- getPhaseName(), usage.getName(), startDate, endDate, amountToBill, null, getCurrency(), null, itemDetails);
- result.add(item);
- } else if (amountToBill.compareTo(BigDecimal.ZERO) < 0) {
+ if (amountToBill.compareTo(BigDecimal.ZERO) < 0) {
throw new InvoiceApiException(ErrorCode.UNEXPECTED_ERROR,
String.format("ILLEGAL INVOICING STATE: Usage period start='%s', end='%s', previously billed amount='%.2f', new proposed amount='%.2f'",
startDate, endDate, billedUsage, toBeBilledUsage));
+ } else /* amountToBill.compareTo(BigDecimal.ZERO) >= 0 */ {
+ if (!isPeriodPreviouslyBilled || amountToBill.compareTo(BigDecimal.ZERO) > 0) {
+ final String itemDetails = areAllBilledItemsWithDetails ? toJson(toBeBilledUsageDetails) : null;
+ final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(),
+ getPhaseName(), usage.getName(), startDate, endDate, amountToBill, null, getCurrency(), null, itemDetails);
+ result.add(item);
+ }
}
}
@@ -105,22 +107,29 @@ public class ContiguousIntervalCapacityUsageInArrear extends ContiguousIntervalU
final List<UsageInArrearTierUnitDetail> toBeBilledDetails = Lists.newLinkedList();
for (final Tier cur : tiers) {
tierNum++;
+ final BigDecimal curTierPrice = cur.getRecurringPrice().getPrice(getCurrency());
+
boolean complies = true;
+ boolean allUnitAmountToZero = true; // Support for $0 Usage item
for (final RolledUpUnit ro : roUnits) {
+
final Limit tierLimit = getTierLimit(cur, ro.getUnitType());
// We ignore the min and only look at the max Limit as the tiers should be contiguous.
// Specifying a -1 value for last max tier will make the validation works
if (tierLimit.getMax() != (double) -1 && ro.getAmount().doubleValue() > tierLimit.getMax()) {
complies = false;
} else {
+
+ allUnitAmountToZero = ro.getAmount() > 0 ? false : allUnitAmountToZero;
+
if (!perUnitTypeDetailTierLevel.contains(ro.getUnitType())) {
- toBeBilledDetails.add(new UsageInArrearTierUnitDetail(tierNum, ro.getUnitType(), cur.getRecurringPrice().getPrice(getCurrency()), ro.getAmount().intValue()));
+ toBeBilledDetails.add(new UsageInArrearTierUnitDetail(tierNum, ro.getUnitType(), curTierPrice, ro.getAmount().intValue()));
perUnitTypeDetailTierLevel.add(ro.getUnitType());
}
}
}
if (complies) {
- return new UsageCapacityInArrearAggregate(toBeBilledDetails, cur.getRecurringPrice().getPrice(getCurrency()));
+ return new UsageCapacityInArrearAggregate(toBeBilledDetails, allUnitAmountToZero ? BigDecimal.ZERO : curTierPrice);
}
}
// Probably invalid catalog config
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
index d6148b5..747a501 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
@@ -72,30 +72,33 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
}
@Override
- protected void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final List<InvoiceItem> result) throws InvoiceApiException {
+ protected void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final boolean isPeriodPreviouslyBilled, final List<InvoiceItem> result) throws InvoiceApiException {
// In the case past invoice items showed the details (areAllBilledItemsWithDetails=true), billed usage has already been taken into account
// as it part of the reconciliation logic, so no need to subtract it here
final BigDecimal amountToBill = (usage.getTierBlockPolicy() == TierBlockPolicy.ALL_TIERS && areAllBilledItemsWithDetails) ? toBeBilledUsage : toBeBilledUsage.subtract(billedUsage);
- if (amountToBill.compareTo(BigDecimal.ZERO) > 0) {
- if (UsageDetailMode.DETAIL == usageDetailMode) {
+ if (amountToBill.compareTo(BigDecimal.ZERO) < 0) {
+ throw new InvoiceApiException(ErrorCode.UNEXPECTED_ERROR,
+ String.format("ILLEGAL INVOICING STATE: Usage period start='%s', end='%s', previously billed amount='%.2f', new proposed amount='%.2f'",
+ startDate, endDate, billedUsage, toBeBilledUsage));
- for (UsageConsumableInArrearTierUnitAggregate toBeBilledUsageDetail : ((UsageConsumableInArrearAggregate) toBeBilledUsageDetails).getTierDetails()) {
- final String itemDetails = toJson(toBeBilledUsageDetail);
+ } else /* amountToBill.compareTo(BigDecimal.ZERO) >= 0 */ {
+ if (!isPeriodPreviouslyBilled || amountToBill.compareTo(BigDecimal.ZERO) > 0) {
+ if (UsageDetailMode.DETAIL == usageDetailMode) {
+
+ for (UsageConsumableInArrearTierUnitAggregate toBeBilledUsageDetail : ((UsageConsumableInArrearAggregate) toBeBilledUsageDetails).getTierDetails()) {
+ final String itemDetails = toJson(toBeBilledUsageDetail);
+ final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(),
+ getPhaseName(), usage.getName(), startDate, endDate, toBeBilledUsageDetail.getAmount(), toBeBilledUsageDetail.getTierPrice(), getCurrency(), toBeBilledUsageDetail.getQuantity(), itemDetails);
+ result.add(item);
+ }
+ } else {
+ final String itemDetails = toJson(toBeBilledUsageDetails);
final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(),
- getPhaseName(), usage.getName(), startDate, endDate, toBeBilledUsageDetail.getAmount(), toBeBilledUsageDetail.getTierPrice(), getCurrency(), toBeBilledUsageDetail.getQuantity(), itemDetails);
+ getPhaseName(), usage.getName(), startDate, endDate, amountToBill, null, getCurrency(), null, itemDetails);
result.add(item);
}
- } else {
- final String itemDetails = toJson(toBeBilledUsageDetails);
- final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(),
- getPhaseName(), usage.getName(), startDate, endDate, amountToBill, null, getCurrency(), null, itemDetails);
- result.add(item);
}
- } else if (amountToBill.compareTo(BigDecimal.ZERO) < 0) {
- throw new InvoiceApiException(ErrorCode.UNEXPECTED_ERROR,
- String.format("ILLEGAL INVOICING STATE: Usage period start='%s', end='%s', previously billed amount='%.2f', new proposed amount='%.2f'",
- startDate, endDate, billedUsage, toBeBilledUsage));
}
}
@@ -204,8 +207,8 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
nbUsedTierBlocks = tmp;
remainingUnits = 0;
}
-
- if (nbUsedTierBlocks > 0) {
+ // We generate an entry if we consumed anything on this tier or if this is the first tier to also support $0 Usage item
+ if (tierNum == 1 || nbUsedTierBlocks > 0) {
if (hasPreviousUsage) {
final Integer previousUsageQuantity = tierNum <= lastPreviousUsageTier ? previousUsage.get(tierNum - 1).getQuantity() : 0;
if (tierNum < lastPreviousUsageTier) {
@@ -217,7 +220,7 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
}
nbUsedTierBlocks = nbUsedTierBlocks - previousUsageQuantity;
}
- if (nbUsedTierBlocks > 0) {
+ if (tierNum == 1 || nbUsedTierBlocks > 0) {
toBeBilledDetails.add(new UsageConsumableInArrearTierUnitAggregate(tierNum, tieredBlock.getUnit().getName(), tieredBlock.getPrice().getPrice(getCurrency()), blockTierSize, nbUsedTierBlocks));
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
index f119913..f83f6da 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
@@ -181,20 +181,22 @@ public abstract class ContiguousIntervalUsageInArrear {
final Iterable<InvoiceItem> billedItems = getBilledItems(ru.getStart(), ru.getEnd(), existingUsage);
// 2. Verify whether previously built items have the item_details section
final boolean areAllBilledItemsWithDetails = areAllBilledItemsWithDetails(billedItems);
- // 3. Computes total billed usage amount
+ // 3. verify if we already billed that period - use to decide whether we should include $0 items when there is nothing to bill for.
+ final boolean isPeriodPreviouslyBilled = !Iterables.isEmpty(billedItems);
+ // 4. Computes total billed usage amount
final BigDecimal billedUsage = computeBilledUsage(billedItems);
final List<RolledUpUnit> rolledUpUnits = ru.getRolledUpUnits();
final UsageInArrearAggregate toBeBilledUsageDetails = getToBeBilledUsageDetails(rolledUpUnits, billedItems, areAllBilledItemsWithDetails);
final BigDecimal toBeBilledUsage = toBeBilledUsageDetails.getAmount();
- populateResults(ru.getStart(), ru.getEnd(), billedUsage, toBeBilledUsage, toBeBilledUsageDetails, areAllBilledItemsWithDetails, result);
+ populateResults(ru.getStart(), ru.getEnd(), billedUsage, toBeBilledUsage, toBeBilledUsageDetails, areAllBilledItemsWithDetails, isPeriodPreviouslyBilled, result);
}
final LocalDate nextNotificationDate = computeNextNotificationDate();
return new UsageInArrearItemsAndNextNotificationDate(result, nextNotificationDate);
}
- protected abstract void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final List<InvoiceItem> result) throws InvoiceApiException;
+ protected abstract void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final boolean isPeriodPreviouslyBilled, final List<InvoiceItem> result) throws InvoiceApiException;
protected abstract UsageInArrearAggregate getToBeBilledUsageDetails(final List<RolledUpUnit> rolledUpUnits, final Iterable<InvoiceItem> billedItems, final boolean areAllBilledItemsWithDetails) throws CatalogApiException;
@@ -259,16 +261,19 @@ public abstract class ContiguousIntervalUsageInArrear {
//
// Loop through each interval [prevDate, curDate) and consume as many rawSubscriptionUsage elements within that range
- // to create one RolledUpUsage per interval. If an interval does not have any rawSubscriptionUsage element, there will be no
- // matching RolledUpUsage for that interval, and we'll detect that in the 'computeMissingItems' logic
+ // to create one RolledUpUsage per interval.
//
LocalDate prevDate = null;
for (final LocalDate curDate : transitionTimes) {
if (prevDate != null) {
- // Allocate new perRangeUnitToAmount for this interval and populate with rawSubscriptionUsage items
+ // Allocate and initialize new perRangeUnitToAmount for this interval and populate with rawSubscriptionUsage items
final Map<String, Long> perRangeUnitToAmount = new HashMap<String, Long>();
+ for (String unitType : unitTypes) {
+ perRangeUnitToAmount.put(unitType, 0L);
+ }
+
// Start consuming prevRawUsage element if it exists and falls into the range
if (prevRawUsage != null) {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
index be5c8de..476c420 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
@@ -466,23 +466,34 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, rawUsage, targetDate, true, eventT0, eventT1, eventT2, eventT3);
final List<RolledUpUsage> unsortedRolledUpUsage = intervalConsumableInArrear.getRolledUpUsage();
- Assert.assertEquals(unsortedRolledUpUsage.size(), 2);
+ Assert.assertEquals(unsortedRolledUpUsage.size(), 3);
final List<RolledUpUsage> rolledUpUsage = TEST_ROLLED_UP_FIRST_USAGE_ORDERING.sortedCopy(unsortedRolledUpUsage);
Assert.assertEquals(rolledUpUsage.get(0).getStart().compareTo(t0), 0);
Assert.assertEquals(rolledUpUsage.get(0).getEnd().compareTo(t1), 0);
- Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().size(), 1);
+ Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().size(), 2);
Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().get(0).getUnitType(), "unit");
Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().get(0).getAmount(), new Long(10L));
+ Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().get(1).getUnitType(), "unit2");
+ Assert.assertEquals(rolledUpUsage.get(0).getRolledUpUnits().get(1).getAmount(), new Long(0L));
- Assert.assertEquals(rolledUpUsage.get(1).getStart().compareTo(t2), 0);
- Assert.assertEquals(rolledUpUsage.get(1).getEnd().compareTo(t3), 0);
+ Assert.assertEquals(rolledUpUsage.get(1).getStart().compareTo(t1), 0);
+ Assert.assertEquals(rolledUpUsage.get(1).getEnd().compareTo(t2), 0);
Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().size(), 2);
Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(0).getUnitType(), "unit");
- Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(0).getAmount(), new Long(20L));
+ Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(0).getAmount(), new Long(0L));
Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(1).getUnitType(), "unit2");
- Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(1).getAmount(), new Long(21L));
+ Assert.assertEquals(rolledUpUsage.get(1).getRolledUpUnits().get(1).getAmount(), new Long(0L));
+
+
+ Assert.assertEquals(rolledUpUsage.get(2).getStart().compareTo(t2), 0);
+ Assert.assertEquals(rolledUpUsage.get(2).getEnd().compareTo(t3), 0);
+ Assert.assertEquals(rolledUpUsage.get(2).getRolledUpUnits().size(), 2);
+ Assert.assertEquals(rolledUpUsage.get(2).getRolledUpUnits().get(0).getUnitType(), "unit");
+ Assert.assertEquals(rolledUpUsage.get(2).getRolledUpUnits().get(0).getAmount(), new Long(20L));
+ Assert.assertEquals(rolledUpUsage.get(2).getRolledUpUnits().get(1).getUnitType(), "unit2");
+ Assert.assertEquals(rolledUpUsage.get(2).getRolledUpUnits().get(1).getAmount(), new Long(21L));
}
@Test(groups = "fast", description = "See https://github.com/killbill/killbill/issues/706")
@@ -893,18 +904,25 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
// FOO item detail
assertEquals(itemDetails.get(2).getTierUnit(), "FOO");
- assertEquals(itemDetails.get(2).getTier(), 2);
+ assertEquals(itemDetails.get(2).getTier(), 1);
assertEquals(itemDetails.get(2).getTierBlockSize(), 1);
- assertEquals(itemDetails.get(2).getQuantity().intValue(), 10);
- assertEquals(itemDetails.get(2).getTierPrice().compareTo(new BigDecimal("10.00")), 0);
- assertEquals(itemDetails.get(2).getAmount().compareTo(new BigDecimal("100.00")), 0);
+ assertEquals(itemDetails.get(2).getQuantity().intValue(), 0);
+ assertEquals(itemDetails.get(2).getTierPrice().compareTo(new BigDecimal("1.00")), 0);
+ assertEquals(itemDetails.get(2).getAmount().compareTo(new BigDecimal("0.00")), 0);
assertEquals(itemDetails.get(3).getTierUnit(), "FOO");
- assertEquals(itemDetails.get(3).getTier(), 3);
+ assertEquals(itemDetails.get(3).getTier(), 2);
assertEquals(itemDetails.get(3).getTierBlockSize(), 1);
assertEquals(itemDetails.get(3).getQuantity().intValue(), 10);
- assertEquals(itemDetails.get(3).getTierPrice().compareTo(new BigDecimal("100.00")), 0);
- assertEquals(itemDetails.get(3).getAmount().compareTo(new BigDecimal("1000.00")), 0);
+ assertEquals(itemDetails.get(3).getTierPrice().compareTo(new BigDecimal("10.00")), 0);
+ assertEquals(itemDetails.get(3).getAmount().compareTo(new BigDecimal("100.00")), 0);
+
+ assertEquals(itemDetails.get(4).getTierUnit(), "FOO");
+ assertEquals(itemDetails.get(4).getTier(), 3);
+ assertEquals(itemDetails.get(4).getTierBlockSize(), 1);
+ assertEquals(itemDetails.get(4).getQuantity().intValue(), 10);
+ assertEquals(itemDetails.get(4).getTierPrice().compareTo(new BigDecimal("100.00")), 0);
+ assertEquals(itemDetails.get(4).getAmount().compareTo(new BigDecimal("1000.00")), 0);
}
@Test(groups = "fast")