Skip to content

Commit

Permalink
Issue#839 - Fixes to capacity usage unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wwjbatista committed Feb 7, 2018
1 parent d04d069 commit 581416e
Showing 1 changed file with 79 additions and 166 deletions.
Expand Up @@ -27,11 +27,13 @@
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;
Expand Down Expand Up @@ -249,139 +251,84 @@ public boolean apply(final InvoiceItem input) {
@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");
Expand All @@ -399,71 +346,37 @@ public void testComputeMissingItemsDetailMode() throws CatalogApiException {
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);
assertEquals(item.getSubscriptionId(), subscriptionId);
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;
}


}

0 comments on commit 581416e

Please sign in to comment.