killbill-aplcache

Merge branch 'integration' of github.com:ning/killbill

5/31/2012 3:12:42 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
index 2c774e8..2da5922 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -207,8 +207,8 @@ public class BusinessAccountRecorder {
                 lastPaymentStatus = payment.getStatus();
                 paymentMethod = payment.getPaymentMethod();
                 creditCardType = payment.getCardType();
+                billingAddressCountry = payment.getCardCountry();
             }
-            billingAddressCountry = payment.getCardCountry();
 
             bac.setLastPaymentStatus(lastPaymentStatus);
             bac.setPaymentMethod(paymentMethod);

beatrix/pom.xml 1(+1 -0)

diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index a81c264..547db04 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -111,6 +111,7 @@
             <artifactId>jdbi</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
index 2a0f5cd..bc4f5a9 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
@@ -16,7 +16,160 @@
 
 package com.ning.billing.beatrix.integration;
 
-public class TestIntegrationWithAutoInvoiceOffTag {
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.inject.Inject;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.api.TestApiListener.NextEvent;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.PlanPhaseSpecifier;
+import com.ning.billing.catalog.api.PriceListSet;
+import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.ControlTagType;
+import com.ning.billing.util.tag.Tag;
+import com.ning.billing.util.tag.TagDefinition;
+
+@Guice(modules = {BeatrixModule.class})
+public class TestIntegrationWithAutoInvoiceOffTag extends TestIntegrationBase {
+
+    @Inject
+    private InvoiceUserApi invoiceApi;
+
+    @Inject
+    private TagUserApi tagApi;
+
+    private Account account;
+    private SubscriptionBundle bundle;
+    private String productName;
+    private BillingPeriod term;
+    private String planSetName;
+
+    @BeforeMethod(groups = {"slow"})
+    public void setupOverdue() throws Exception {
+        
+        account = accountUserApi.createAccount(getAccountData(25), null, null, context);
+        assertNotNull(account);
+
+        bundle = entitlementUserApi.createBundleForAccount(account.getId(), "whatever", context);
+
+        productName = "Shotgun";
+        term = BillingPeriod.MONTHLY;
+        planSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
+    }
+
+    @Test(groups={"slow"}, enabled = true)
+    public void testAutoInvoiceOffAccount() throws Exception {
+        clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
+        addTag(account.getId(), ObjectType.ACCOUNT);
+       
+        // set next invoice to fail and create network 
+        busHandler.pushExpectedEvents(NextEvent.CREATE);
+        SubscriptionData baseSubscription = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+                new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
+        assertNotNull(baseSubscription);
+        assertTrue(busHandler.isCompleted(DELAY));
+
+ 
+        Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 0);
+ 
+        clock.addDays(10); // DAY 10 still in trial
+        assertTrue(busHandler.isCompleted(DELAY));
+
+        invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 0);
+
+        busHandler.pushExpectedEvents(NextEvent.PHASE);
+        clock.addDays(30); // DAY 40 out of trial
+        assertTrue(busHandler.isCompleted(DELAY));
+
+        invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 0);
+
+    }
+    
+    @Test(groups={"slow"}, enabled = true)
+    public void testAutoInvoiceOffSingleSubscription() throws Exception {
+        clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
+       
+        // set next invoice to fail and create network 
+        busHandler.pushExpectedEvents(NextEvent.CREATE,NextEvent.INVOICE);
+        SubscriptionData baseSubscription = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+                new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
+        assertNotNull(baseSubscription);
+        assertTrue(busHandler.isCompleted(DELAY));
+        
+        Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 1); // first invoice is generated immediately after creation can't reliably stop it
+ 
+
+        addTag(baseSubscription.getBundleId(), ObjectType.BUNDLE);
+
+        busHandler.pushExpectedEvents(NextEvent.PHASE);
+        clock.addDays(40); // DAY 40 out of trial
+        assertTrue(busHandler.isCompleted(DELAY));
+
+        invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 1); //No additional invoices generated
+
+    }
+
     
-    //TODO MDW write this test TestIntegrationWithAutoInvoiceOffTag
+    @Test(groups={"slow"}, enabled = true)
+    public void testAutoInvoiceOffMultipleSubscriptions() throws Exception {
+        clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
+       
+        // set next invoice to fail and create network 
+        busHandler.pushExpectedEvents(NextEvent.CREATE,NextEvent.INVOICE);
+        SubscriptionData baseSubscription = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+                new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
+        assertNotNull(baseSubscription);
+        assertTrue(busHandler.isCompleted(DELAY));
+ 
+        SubscriptionBundle bundle2 = entitlementUserApi.createBundleForAccount(account.getId(), "whatever", context);
+
+        busHandler.pushExpectedEvents(NextEvent.CREATE,NextEvent.INVOICE);
+        SubscriptionData baseSubscription2 = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle2.getId(),
+                new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
+        assertNotNull(baseSubscription2);
+        assertTrue(busHandler.isCompleted(DELAY));
+
+        Collection<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 2); // first invoice is generated immediately after creation can't reliably stop it
+ 
+        addTag(baseSubscription.getBundleId(), ObjectType.BUNDLE);
+
+        busHandler.pushExpectedEvents(NextEvent.PHASE,NextEvent.PHASE,NextEvent.INVOICE);
+        clock.addDays(40); // DAY 40 out of trial
+        assertTrue(busHandler.isCompleted(DELAY));
+
+        invoices = invoiceApi.getInvoicesByAccount(account.getId());       
+        assertEquals(invoices.size(), 3); // Only one additional invoice generated
+    }
+
+
+    private void addTag(UUID id, ObjectType type) throws TagDefinitionApiException {
+        TagDefinition def = tagApi.getTagDefinition(ControlTagType.AUTO_INVOICING_OFF.name());
+        tagApi.addTag(id, type, def, context);
+        Map<String,Tag> tags = tagApi.getTags(id, type);
+        assertNotNull(tags.get(ControlTagType.AUTO_INVOICING_OFF.name()));
+    }
 }
diff --git a/beatrix/src/test/resources/log4j.xml b/beatrix/src/test/resources/log4j.xml
index ac530a1..79e0ec2 100644
--- a/beatrix/src/test/resources/log4j.xml
+++ b/beatrix/src/test/resources/log4j.xml
@@ -33,6 +33,10 @@
         <level value="info"/>
     </logger>
 
+    <logger name="com.ning.billing.junction">
+        <level value="debug"/>
+    </logger>
+
     <root>
         <priority value="info"/>
         <appender-ref ref="stdout"/>
diff --git a/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java b/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
index 80db3b8..e8002f0 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
@@ -37,12 +37,12 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
 
     @Override
     public boolean isLast(BillingEvent event) {
-        return isAccountInvoiceOff;
-    }
+        return event == last();
+     }
 
     @Override
     public boolean isAccountAutoInvoiceOff() {
-        return false;
+        return isAccountInvoiceOff;
     }
 
     @Override
@@ -50,6 +50,14 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
         return subscriptionIdsWithAutoInvoiceOff;
     }
 
+    public void setAccountInvoiceOff(boolean isAccountInvoiceOff) {
+        this.isAccountInvoiceOff = isAccountInvoiceOff;
+    }
+
+    public void setSubscriptionIdsWithAutoInvoiceOff(List<UUID> subscriptionIdsWithAutoInvoiceOff) {
+        this.subscriptionIdsWithAutoInvoiceOff = subscriptionIdsWithAutoInvoiceOff;
+    }
+
     public void clearSubscriptionsWithAutoInvoiceOff() {
         subscriptionIdsWithAutoInvoiceOff.clear();
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index d416812..8f381bc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -862,7 +862,28 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     }
 
     @Test
-    public void testAutoInvoiceOff() throws CatalogApiException, InvoiceApiException {
+    public void testAutoInvoiceOffAccount() throws Exception {
+        MockBillingEventSet events = new MockBillingEventSet();
+        events.setAccountInvoiceOff(true);
+
+        Subscription sub = createZombieSubscription();
+        DateTime startDate = buildDateTime(2011, 9, 1);
+
+        Plan plan = new MockPlan();
+        BigDecimal rate1 = TEN;
+        PlanPhase phase = createMockMonthlyPlanPhase(rate1);
+
+        BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
+        events.add(event);
+
+        DateTime targetDate = buildDateTime(2011, 10, 3);
+        UUID accountId = UUID.randomUUID();
+        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+
+        assertNull(invoice);
+    }
+    
+    public void testAutoInvoiceOffWithCredits() throws CatalogApiException, InvoiceApiException {
         Currency currency = Currency.USD;
         List<Invoice> invoices = new ArrayList<Invoice>();
         MockBillingEventSet eventSet = new MockBillingEventSet();
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
index cee92dc..6d91e7c 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
@@ -16,8 +16,10 @@
 
 package com.ning.billing.junction.plumbing.billing;
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedSet;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -99,9 +101,23 @@ public class DefaultBillingApi implements BillingApi {
         } catch (AccountApiException e) {
             log.warn("Failed while getting BillingEvent", e);
         }
+        
+        debugLog(result, "********* Billing Events Raw");
         blockCalculator.insertBlockingEvents(result);
+        debugLog(result,"*********  Billing Events After Blocking");
+        
         return result;
     }
+    
+
+    private void debugLog(SortedSet<BillingEvent> result, String title) {
+        log.debug(title);
+        Iterator<BillingEvent> i = result.iterator();
+        while(i.hasNext()) {
+            log.debug(i.next().toString());
+        }
+        
+    }
 
     private void addBillingEventsForBundles(List<SubscriptionBundle> bundles, Account account, CallContext context,
             DefaultBillingEventSet result) {
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEventSet.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEventSet.java
index 0962a73..d26f70b 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEventSet.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEventSet.java
@@ -58,5 +58,14 @@ public class DefaultBillingEventSet extends TreeSet<BillingEvent> implements Sor
     public boolean isLast(final BillingEvent event) {
         return last() == event;
     }
+
+    @Override
+    public String toString() {
+        return "DefaultBillingEventSet [accountAutoInvoiceOff=" + accountAutoInvoiceOff
+                + ", subscriptionIdsWithAutoInvoiceOff=" + subscriptionIdsWithAutoInvoiceOff + ", Events="
+                + super.toString() + "]";
+    }
+    
+    
     
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 1b6ce2a..39970da 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -52,6 +52,12 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
 
     @Override
     public TagDefinition getByName(final String definitionName) {
+        // add control tag definitions
+        for (ControlTagType controlTag : ControlTagType.values()) {
+            if(definitionName.equals(controlTag.name())) {
+                return new DefaultTagDefinition(controlTag.toString(), controlTag.getDescription(), true);
+            }
+        }
         return dao.getByName(definitionName);
     }