killbill-aplcache

Details

diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 90c1eb8..47503f4 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -546,12 +546,61 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         InvoiceGenerator generator = new DefaultInvoiceGenerator();
         Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
 
-        // expect one pro-ration it and one full-period item
+        // expect one pro-ration item and one full-period item
         assertEquals(invoice.getNumberOfItems(), 2);
         assertEquals(invoice.getTotalAmount().compareTo(ZERO), 0);
     }
 
     @Test
+    public void testInvoiceForFreeTrialWithRecurringDiscount() throws InvoiceApiException {
+        DefaultPrice zeroPrice = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
+        MockInternationalPrice fixedPrice = new MockInternationalPrice(zeroPrice);
+        MockPlanPhase phase1 = new MockPlanPhase(null, fixedPrice);
+
+        BigDecimal cheapAmount = new BigDecimal("24.95");
+        DefaultPrice cheapPrice = new DefaultPrice(cheapAmount, Currency.USD);
+        MockInternationalPrice recurringPrice = new MockInternationalPrice(cheapPrice);
+        MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null);
+
+        MockPlan plan = new MockPlan();
+        Subscription subscription = new MockSubscription();
+        DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
+
+        BillingEvent event1 = new DefaultBillingEvent(subscription, effectiveDate1, plan, phase1, fixedPrice,
+                                                     null, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                                                     "testEvent1", SubscriptionTransitionType.CREATE);
+        BillingEventSet events = new BillingEventSet();
+        events.add(event1);
+
+        InvoiceGenerator generator = new DefaultInvoiceGenerator();
+        Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate1, Currency.USD);
+        assertNotNull(invoice1);
+        assertEquals(invoice1.getNumberOfItems(), 1);
+        assertEquals(invoice1.getTotalAmount().compareTo(ZERO), 0);
+
+        List<InvoiceItem> existingItems = invoice1.getInvoiceItems();
+
+        DateTime effectiveDate2 = effectiveDate1.plusDays(30);
+        BillingEvent event2 = new DefaultBillingEvent(subscription, effectiveDate2, plan, phase2, null,
+                                                     recurringPrice, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                     "testEvent2", SubscriptionTransitionType.CHANGE);
+        events.add(event2);
+
+        Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, existingItems, effectiveDate2, Currency.USD);
+        assertNotNull(invoice2);
+        assertEquals(invoice2.getNumberOfItems(), 1);
+        assertEquals(invoice2.getTotalAmount().compareTo(cheapAmount), 0);
+
+        existingItems.addAll(invoice2.getInvoiceItems());
+
+        DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
+        Invoice invoice3 = generator.generateInvoice(UUID.randomUUID(), events, existingItems, effectiveDate3, Currency.USD);
+        assertNotNull(invoice3);
+        assertEquals(invoice3.getNumberOfItems(), 1);
+        assertEquals(invoice3.getTotalAmount().compareTo(cheapAmount), 0);
+    }
+
+    @Test
     public void testInvoiceForEmptyEventSet() throws InvoiceApiException {
         InvoiceGenerator generator = new DefaultInvoiceGenerator();
         BillingEventSet events = new BillingEventSet();