diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
index ac4a1b0..14cbf50 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
@@ -27,11 +27,13 @@ import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.killbill.billing.catalog.DefaultLimit;
import org.killbill.billing.catalog.DefaultTier;
+import org.killbill.billing.catalog.DefaultTieredBlock;
import org.killbill.billing.catalog.DefaultUnit;
import org.killbill.billing.catalog.DefaultUsage;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.TierBlockPolicy;
import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.model.FixedPriceInvoiceItem;
@@ -249,139 +251,84 @@ public class TestContiguousIntervalCapacityInArrear extends TestUsageInArrearBas
@Test(groups = "fast")
public void testComputeMissingItemsAggregateMode() throws CatalogApiException, IOException {
- final LocalDate startDate = new LocalDate(2014, 03, 20);
- final LocalDate firstBCDDate = new LocalDate(2014, 04, 15);
- final LocalDate secondBCDDate = new LocalDate(2014, 05, 15);
- final LocalDate endDate = new LocalDate(2014, 06, 15);
-
- // 2 items for startDate - firstBCDDate
- final List<RawUsage> rawUsages = new ArrayList<RawUsage>();
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 5L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 99L));
- // 2 items for firstBCDDate - secondBCDDate
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 04, 15), "FOO", 5L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 04, 16), "BAR", 101L));
- // 2 items for secondBCDDate - endDate
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 05, 19), "FOO", 75L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 05, 20), "BAR", 101L));
-
- final DefaultUnit unitFoo = new DefaultUnit().setName("FOO");
- final DefaultUnit unitBar = new DefaultUnit().setName("BAR");
-
- final DefaultLimit unitFooLimitTier1 = new DefaultLimit().setUnit(unitFoo).setMax((double) 10);
- final DefaultLimit unitBarLimitTier1 = new DefaultLimit().setUnit(unitBar).setMax((double) 100);
- final DefaultTier tier1 = createDefaultTierWithLimits(BigDecimal.ONE, unitFooLimitTier1, unitBarLimitTier1);
-
- final DefaultLimit unitFooLimitTier2 = new DefaultLimit().setUnit(unitFoo).setMax((double) 50);
- final DefaultLimit unitBarLimitTier2 = new DefaultLimit().setUnit(unitBar).setMax((double) 500);
- final DefaultTier tier2 = createDefaultTierWithLimits(BigDecimal.TEN, unitFooLimitTier2, unitBarLimitTier2);
-
- final DefaultLimit unitFooLimitTier3 = new DefaultLimit().setUnit(unitFoo).setMax((double) 75);
- final DefaultLimit unitBarLimitTier3 = new DefaultLimit().setUnit(unitBar).setMax((double) 750);
- final DefaultTier tier3 = createDefaultTierWithLimits(new BigDecimal("100.0"), unitFooLimitTier3, unitBarLimitTier3);
-
- final DefaultUsage usage = createCapacityInArrearUsage(usageName, BillingPeriod.MONTHLY, tier1, tier2, tier3);
-
-
- final LocalDate targetDate = endDate;
+ testComputeMissingItemsByMode(UsageDetailMode.AGGREGATE);
+ }
- final BillingEvent event1 = createMockBillingEvent(startDate.toDateTimeAtStartOfDay(DateTimeZone.UTC),BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
- final BillingEvent event2 = createMockBillingEvent(secondBCDDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
- final BillingEvent event3 = createMockBillingEvent(endDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
+ @Test(groups = "fast")
+ public void testComputeMissingItemsDetailMode() throws CatalogApiException, IOException {
- final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, rawUsages, targetDate, true, event1, event2, event3);
+ testComputeMissingItemsByMode(UsageDetailMode.DETAIL);
+ }
- final UsageInArrearItemsAndNextNotificationDate usageResult = intervalConsumableInArrear.computeMissingItemsAndNextNotificationDate(ImmutableList.<InvoiceItem>of());
- final List<InvoiceItem> rawResults = usageResult.getInvoiceItems();
- assertEquals(rawResults.size(), 6);
-
- final List<InvoiceItem> result = ImmutableList.copyOf(Iterables.filter(rawResults, new Predicate<InvoiceItem>() {
- @Override
- public boolean apply(final InvoiceItem input) {
- return input.getAmount().compareTo(BigDecimal.ZERO) > 0;
- }
- }));
+ private void testComputeMissingItemsByMode(UsageDetailMode usageDetailMode) throws CatalogApiException, IOException {
+ // Case 1
+ List<RawUsage> rawUsages = new ArrayList<RawUsage>();
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 5L));
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 99L));
- assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("1.0")), 0, String.format("%s != 1.0", result.get(0).getAmount()));
- assertEquals(result.get(0).getCurrency(), Currency.BTC);
- assertEquals(result.get(0).getAccountId(), accountId);
- assertEquals(result.get(0).getBundleId(), bundleId);
- assertEquals(result.get(0).getSubscriptionId(), subscriptionId);
- assertEquals(result.get(0).getPlanName(), planName);
- assertEquals(result.get(0).getPhaseName(), phaseName);
- assertEquals(result.get(0).getUsageName(), usage.getName());
- assertTrue(result.get(0).getStartDate().compareTo(startDate) == 0);
- assertTrue(result.get(0).getEndDate().compareTo(firstBCDDate) == 0);
- // check item detail
- List<UsageInArrearDetail> itemDetails1 = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
- assertEquals(itemDetails1.size(), 2);
- assertEquals(itemDetails1.get(0).getTier(), 1);
- assertEquals(itemDetails1.get(0).getQuantity().intValue(), 99);
- assertEquals(itemDetails1.get(0).getTierPrice().compareTo(BigDecimal.ONE), 0);
- assertEquals(itemDetails1.get(1).getTier(), 1);
- assertEquals(itemDetails1.get(1).getQuantity().intValue(), 5);
- assertEquals(itemDetails1.get(1).getTierPrice().compareTo(BigDecimal.ONE), 0);
-
- assertEquals(result.get(1).getAmount().compareTo(new BigDecimal("10.0")), 0, String.format("%s != 10.0", result.get(0).getAmount()));
- assertEquals(result.get(1).getCurrency(), Currency.BTC);
- assertEquals(result.get(1).getAccountId(), accountId);
- assertEquals(result.get(1).getBundleId(), bundleId);
- assertEquals(result.get(1).getSubscriptionId(), subscriptionId);
- assertEquals(result.get(1).getPlanName(), planName);
- assertEquals(result.get(1).getPhaseName(), phaseName);
- assertEquals(result.get(1).getUsageName(), usage.getName());
- assertTrue(result.get(1).getStartDate().compareTo(firstBCDDate) == 0);
- assertTrue(result.get(1).getEndDate().compareTo(secondBCDDate) == 0);
- // check item detail
- List<UsageInArrearDetail> itemDetails2 = objectMapper.readValue(result.get(1).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
- assertEquals(itemDetails2.size(), 2);
- assertEquals(itemDetails2.get(0).getTier(), 2);
- assertEquals(itemDetails2.get(0).getQuantity().intValue(), 101);
- assertEquals(itemDetails2.get(0).getTierPrice().compareTo(BigDecimal.TEN), 0);
- assertEquals(itemDetails2.get(1).getTier(), 2);
- assertEquals(itemDetails2.get(1).getQuantity().intValue(), 5);
- assertEquals(itemDetails2.get(1).getTierPrice().compareTo(BigDecimal.TEN), 0);
-
- assertEquals(result.get(2).getAmount().compareTo(new BigDecimal("100.0")), 0, String.format("%s != 100.0", result.get(0).getAmount()));
- assertEquals(result.get(2).getCurrency(), Currency.BTC);
- assertEquals(result.get(2).getAccountId(), accountId);
- assertEquals(result.get(2).getBundleId(), bundleId);
- assertEquals(result.get(2).getSubscriptionId(), subscriptionId);
- assertEquals(result.get(2).getPlanName(), planName);
- assertEquals(result.get(2).getPhaseName(), phaseName);
- assertEquals(result.get(2).getUsageName(), usage.getName());
- assertTrue(result.get(2).getStartDate().compareTo(secondBCDDate) == 0);
- assertTrue(result.get(2).getEndDate().compareTo(endDate) == 0);
- // check item detail
- List<UsageInArrearDetail> itemDetails3 = objectMapper.readValue(result.get(2).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
- assertEquals(itemDetails3.size(), 2);
- assertEquals(itemDetails3.get(0).getTier(), 3);
- assertEquals(itemDetails3.get(0).getQuantity().intValue(), 101);
- assertEquals(itemDetails3.get(0).getTierPrice().compareTo(new BigDecimal("100.0")), 0);
- assertEquals(itemDetails3.get(1).getTier(), 3);
- assertEquals(itemDetails3.get(1).getQuantity().intValue(), 75);
- assertEquals(itemDetails3.get(1).getTierPrice().compareTo(new BigDecimal("100.0")), 0);
+ List<InvoiceItem> result = produceInvoiceItems(rawUsages, usageDetailMode);
+ assertEquals(result.size(), 1);
+ assertEquals(result.get(0).getAmount().compareTo(BigDecimal.ONE),0, String.format("%s != 1.0", result.get(0).getAmount()));
+
+ List<UsageInArrearDetail> itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
+ // BAR item detail
+ assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
+ assertEquals(itemDetails.get(0).getTier(), 1);
+ assertEquals(itemDetails.get(0).getQuantity().intValue(), 99);
+ assertEquals(itemDetails.get(0).getTierPrice().compareTo(BigDecimal.ONE), 0);
+ // FOO item detail
+ assertEquals(itemDetails.get(1).getTierUnit(), "FOO");
+ assertEquals(itemDetails.get(1).getTier(), 1);
+ assertEquals(itemDetails.get(1).getQuantity().intValue(), 5);
+ assertEquals(itemDetails.get(1).getTierPrice().compareTo(BigDecimal.ONE), 0);
+
+ // Case 2
+ rawUsages = new ArrayList<RawUsage>();
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 5L));
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 101L));
+ result = produceInvoiceItems(rawUsages, usageDetailMode);
+ assertEquals(result.size(), 1);
+ assertEquals(result.get(0).getAmount().compareTo(BigDecimal.TEN),0, String.format("%s != 10.0", result.get(0).getAmount()));
+
+ itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
+ // BAR item detail
+ assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
+ assertEquals(itemDetails.get(0).getTier(), 2);
+ assertEquals(itemDetails.get(0).getQuantity().intValue(), 101);
+ assertEquals(itemDetails.get(0).getTierPrice().compareTo(BigDecimal.TEN), 0);
+ // FOO item detail
+ assertEquals(itemDetails.get(1).getTierUnit(), "FOO");
+ assertEquals(itemDetails.get(1).getTier(), 2);
+ assertEquals(itemDetails.get(1).getQuantity().intValue(), 5);
+ assertEquals(itemDetails.get(1).getTierPrice().compareTo(BigDecimal.TEN), 0);
+
+ // Case 3
+ rawUsages = new ArrayList<RawUsage>();
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 75L));
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 101L));
+ result = produceInvoiceItems(rawUsages, usageDetailMode);
+ assertEquals(result.size(), 1);
+ assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("100.0")),0, String.format("%s != 100.0", result.get(0).getAmount()));
+
+ itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageInArrearDetail>>() {});
+ // BAR item detail
+ assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
+ assertEquals(itemDetails.get(0).getTier(), 3);
+ assertEquals(itemDetails.get(0).getQuantity().intValue(), 101);
+ assertEquals(itemDetails.get(0).getTierPrice().compareTo(new BigDecimal("100.0")), 0);
+ // FOO item detail
+ assertEquals(itemDetails.get(1).getTierUnit(), "FOO");
+ assertEquals(itemDetails.get(1).getTier(), 3);
+ assertEquals(itemDetails.get(1).getQuantity().intValue(), 75);
+ assertEquals(itemDetails.get(1).getTierPrice().compareTo(new BigDecimal("100.0")), 0);
}
- @Test(groups = "fast")
- public void testComputeMissingItemsDetailMode() throws CatalogApiException {
+ private List<InvoiceItem> produceInvoiceItems(List<RawUsage> rawUsages, UsageDetailMode usageDetailMode) throws CatalogApiException {
final LocalDate startDate = new LocalDate(2014, 03, 20);
final LocalDate firstBCDDate = new LocalDate(2014, 04, 15);
- final LocalDate secondBCDDate = new LocalDate(2014, 05, 15);
- final LocalDate endDate = new LocalDate(2014, 06, 15);
-
- // 2 items for startDate - firstBCDDate
- final List<RawUsage> rawUsages = new ArrayList<RawUsage>();
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 5L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 99L));
- // 2 items for firstBCDDate - secondBCDDate
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 04, 15), "FOO", 5L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 04, 16), "BAR", 101L));
- // 2 items for secondBCDDate - endDate
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 05, 19), "FOO", 75L));
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 05, 20), "BAR", 101L));
+ final LocalDate endDate = new LocalDate(2014, 05, 15);
final DefaultUnit unitFoo = new DefaultUnit().setName("FOO");
final DefaultUnit unitBar = new DefaultUnit().setName("BAR");
@@ -399,26 +346,24 @@ public class TestContiguousIntervalCapacityInArrear extends TestUsageInArrearBas
final DefaultTier tier3 = createDefaultTierWithLimits(new BigDecimal("100.0"), unitFooLimitTier3, unitBarLimitTier3);
final DefaultUsage usage = createCapacityInArrearUsage(usageName, BillingPeriod.MONTHLY, tier1, tier2, tier3);
+
final LocalDate targetDate = endDate;
final BillingEvent event1 = createMockBillingEvent(startDate.toDateTimeAtStartOfDay(DateTimeZone.UTC),BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
- final BillingEvent event2 = createMockBillingEvent(secondBCDDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
- final BillingEvent event3 = createMockBillingEvent(endDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
+ final BillingEvent event2 = createMockBillingEvent(endDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), BillingPeriod.MONTHLY, Collections.<Usage>emptyList());
- final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, rawUsages, targetDate, true, UsageDetailMode.DETAIL, event1, event2, event3);
+ final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, rawUsages, targetDate, true, usageDetailMode, event1, event2);
final UsageInArrearItemsAndNextNotificationDate usageResult = intervalConsumableInArrear.computeMissingItemsAndNextNotificationDate(ImmutableList.<InvoiceItem>of());
final List<InvoiceItem> rawResults = usageResult.getInvoiceItems();
- assertEquals(rawResults.size(), 9);
-
final List<InvoiceItem> result = ImmutableList.copyOf(Iterables.filter(rawResults, new Predicate<InvoiceItem>() {
@Override
public boolean apply(final InvoiceItem input) {
- return input.getAmount().compareTo(BigDecimal.ZERO) > 0 || input.getQuantity() != null;
+ return input.getAmount().compareTo(BigDecimal.ZERO) > 0;
}
}));
- for (InvoiceItem item: result){
+ for (InvoiceItem item: result) {
assertEquals(item.getCurrency(), Currency.BTC);
assertEquals(item.getAccountId(), accountId);
assertEquals(item.getBundleId(), bundleId);
@@ -426,44 +371,12 @@ public class TestContiguousIntervalCapacityInArrear extends TestUsageInArrearBas
assertEquals(item.getPlanName(), planName);
assertEquals(item.getPhaseName(), phaseName);
assertEquals(item.getUsageName(), usage.getName());
+ assertTrue(item.getStartDate().compareTo(startDate) == 0);
+ assertTrue(item.getEndDate().compareTo(firstBCDDate) == 0);
}
- assertEquals(result.get(0).getAmount().compareTo(BigDecimal.ZERO), 0, String.format("%s != 0", result.get(0).getAmount()));
- assertEquals(result.get(0).getQuantity().intValue(), 99);
- assertEquals(result.get(0).getRate().compareTo(BigDecimal.ONE), 0);
- assertTrue(result.get(0).getStartDate().compareTo(startDate) == 0);
- assertTrue(result.get(0).getEndDate().compareTo(firstBCDDate) == 0);
-
- assertEquals(result.get(1).getAmount().compareTo(BigDecimal.ONE), 0, String.format("%s != 1", result.get(1).getAmount()));
- assertEquals(result.get(1).getQuantity().intValue(), 5);
- assertEquals(result.get(1).getRate().compareTo(BigDecimal.ONE), 0);
- assertTrue(result.get(1).getStartDate().compareTo(startDate) == 0);
- assertTrue(result.get(1).getEndDate().compareTo(firstBCDDate) == 0);
-
- assertEquals(result.get(2).getAmount().compareTo(BigDecimal.ZERO), 0, String.format("%s != 0", result.get(2).getAmount()));
- assertEquals(result.get(2).getQuantity().intValue(), 101);
- assertEquals(result.get(2).getRate().compareTo(BigDecimal.TEN), 0);
- assertTrue(result.get(2).getStartDate().compareTo(firstBCDDate) == 0);
- assertTrue(result.get(2).getEndDate().compareTo(secondBCDDate) == 0);
-
- assertEquals(result.get(3).getAmount().compareTo(BigDecimal.TEN), 0, String.format("%s != 1", result.get(3).getAmount()));
- assertEquals(result.get(3).getQuantity().intValue(), 5);
- assertEquals(result.get(3).getRate().compareTo(BigDecimal.TEN), 0);
- assertTrue(result.get(3).getStartDate().compareTo(firstBCDDate) == 0);
- assertTrue(result.get(3).getEndDate().compareTo(secondBCDDate) == 0);
-
- assertEquals(result.get(4).getAmount().compareTo(BigDecimal.ZERO), 0, String.format("%s != 0.0", result.get(4).getAmount()));
- assertEquals(result.get(4).getQuantity().intValue(), 101);
- assertEquals(result.get(4).getRate().compareTo(new BigDecimal("100.0")), 0);
- assertTrue(result.get(4).getStartDate().compareTo(secondBCDDate) == 0);
- assertTrue(result.get(4).getEndDate().compareTo(endDate) == 0);
-
- assertEquals(result.get(5).getAmount().compareTo(new BigDecimal("100.0")), 0, String.format("%s != 50.0", result.get(5).getAmount()));
- assertEquals(result.get(5).getQuantity().intValue(), 75);
- assertEquals(result.get(5).getRate().compareTo(new BigDecimal("100.0")), 0);
- assertTrue(result.get(5).getStartDate().compareTo(secondBCDDate) == 0);
- assertTrue(result.get(5).getEndDate().compareTo(endDate) == 0);
- }
+ return result;
+ }
}