killbill-memoizeit

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
index 80c2b78..2c1cc04 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
@@ -292,8 +292,90 @@ public class TestWithTimeZones extends TestIntegrationBase {
     }
 
 
+
+
+    @Test(groups = "slow")
+    public void testIntoDaylightSavingTransition2() throws Exception {
+
+        //
+        // Nov 6th Transition date from DST -> ST
+        //
+        // Because we use 30 days trial, we start a bit before and that way we can check that computation of BCD crossing into daylight saving works as expected.
+        //
+        final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
+        clock.setTime(new DateTime(2016, 11, 5, 23, 30, 0, tz));
+
+        final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
+                                                                .timeZone(tz)
+                                                                .build();
+
+        // Create account with non BCD to force junction BCD logic to activate
+        final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+
+        clock.setTime(new DateTime(2017, 3, 1, 23, 30, 0, tz));
+
+        createBaseEntitlementAndCheckForCompletion(account.getId(), "bundleKey", "Pistol", ProductCategory.BASE, BillingPeriod.MONTHLY,  NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE);
+
+        final Account accountWithBCD = accountUserApi.getAccountById(account.getId(), callContext);
+        //
+        // Ok, it's a little bit tricky here:
+        //
+        // Intuitively we would expect a BCD of 31 (same as previous test testIntoDaylightSavingTransition1), however our implementation relies on TimeAwareContext for all TZ
+        // computation. This context stores an offset from UTC which is then used as a reference and because we created an account before Nov 6 (DST), the offest is (-7)
+        // so the result is different than previous test (where offset was -8)
+        // What 's important is the fact that BCD and invoiceDate align in such a way that:
+        // 1. we see no leading pro-ration
+        // 2. Invoice is correctly generated (don't miss it because too early or don't invoice loop)
+        //
+        assertEquals(accountWithBCD.getBillCycleDayLocal().intValue(), 1);
+
+        busHandler.pushExpectedEvents(NextEvent.PHASE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        clock.addDays(30);
+        assertListenerStatus();
+
+
+        final List<ExpectedInvoiceItemCheck> expectedInvoices = new ArrayList<ExpectedInvoiceItemCheck>();
+        expectedInvoices.add(new ExpectedInvoiceItemCheck(new LocalDate(2017, 4, 1), new LocalDate(2017, 5, 1), InvoiceItemType.RECURRING, new BigDecimal("29.95")));
+        invoiceChecker.checkInvoice(account.getId(), 2, callContext, expectedInvoices);
+        expectedInvoices.clear();
+    }
+
+
+    @Test(groups = "slow")
+    public void testIntoDaylightSavingTransition3() throws Exception {
+
+        final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
+        clock.setTime(new DateTime(2017, 3, 1, 23, 30, 0, tz));
+
+
+        final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
+                                                                .timeZone(tz)
+                                                                .build();
+
+        // Create account with non BCD to force junction BCD logic to activate
+        final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+
+        final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("pistol-monthly-notrial",null);
+        busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE, NextEvent.INVOICE_PAYMENT, NextEvent.PAYMENT);
+        entitlementApi.createBaseEntitlement(account.getId(), spec, "bundleExternalKey", ImmutableList.<PlanPhasePriceOverride>of(), null, null, false, ImmutableList.<PluginProperty>of(), callContext);
+        assertListenerStatus();
+
+
+        busHandler.pushExpectedEvents(NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        // Technically, we should see the invoice at the end of day in the account timezone, but this is not the case, the invoice comes slightly after (30')
+        // clock.setTime(new DateTime(2017, 4, 1, 23, 59, 0, tz));
+        //
+        // But this is really not very important as long as invoicing is correct
+        clock.addMonths(1);
+        // Add one hour to hit the notification date of 2017-04-02T07:30:00.000Z
+        clock.addDeltaFromReality(3600 * 1000);
+        assertListenerStatus();
+    }
+
+
+
     @Test(groups = "slow")
-    public void testOutOfDaylightSavingTransition() throws Exception {
+    public void testOutOfDaylightSavingTransition1() throws Exception {
 
         // Transition out of daylight saving is set for Nov 5
         //