killbill-aplcache

Details

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;
+    }
 
 
 }