Search in sources :

Example 61 with DefaultBlockingState

use of org.killbill.billing.junction.DefaultBlockingState in project killbill by killbill.

the class TestWithInvoiceHardening method testFixParkedAccountByVoidingInvoices.

// 
// Complicated scenario where we want to test that given some bad data
// 1/ leading the account to be parked and
// 2/ leading the system to have both generated and used some credit
// we are able using our 'void' and credit 'deletion api' to come back to a good state, i.e
// credit was reclaimed, and account is back into a good state
// 
@Test(groups = "slow")
public void testFixParkedAccountByVoidingInvoices() throws Exception {
    final DateTimeZone testTimeZone = DateTimeZone.UTC;
    final DateTime initialDate = new DateTime(2019, 4, 27, 0, 13, 42, 0, testTimeZone);
    clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
    final Account account = createAccountWithNonOsgiPaymentMethod(getAccountData(0));
    assertNotNull(account);
    add_AUTO_PAY_OFF_Tag(account.getId(), ObjectType.ACCOUNT);
    add_AUTO_INVOICING_OFF_Tag(account.getId(), ObjectType.ACCOUNT);
    busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK);
    final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Blowdart", BillingPeriod.MONTHLY, "notrial", null);
    UUID entitlementId = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), "Something", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
    assertListenerStatus();
    final BlockingState blockingState2 = new DefaultBlockingState(entitlementId, BlockingStateType.SUBSCRIPTION, "SOMETHING_BLOCK", "company.a.b.c", true, true, true, null);
    subscriptionApi.addBlockingState(blockingState2, new LocalDate(2019, 5, 17), ImmutableList.<PluginProperty>of(), callContext);
    // 2019-05-17
    busHandler.pushExpectedEvents(NextEvent.BLOCK);
    clock.addDays(20);
    assertListenerStatus();
    // 
    // Simulate some bad data on disk
    // 
    // Invoice 1: RECURRING 2019-4-27 -> 2019-5-27
    final InvoiceModelDao firstInvoice = new InvoiceModelDao(UUID.randomUUID(), clock.getUTCNow(), account.getId(), null, new LocalDate(2019, 4, 27), new LocalDate(2019, 4, 27), account.getCurrency(), false, InvoiceStatus.COMMITTED, false);
    final UUID initialRecuringItemId = UUID.randomUUID();
    firstInvoice.addInvoiceItem(new InvoiceItemModelDao(initialRecuringItemId, clock.getUTCNow(), InvoiceItemType.RECURRING, firstInvoice.getId(), account.getId(), null, null, entitlementId, "", "Blowdart", "blowdart-monthly-notrial", "blowdart-monthly-notrial-evergreen", null, null, new LocalDate(2019, 4, 27), new LocalDate(2019, 5, 27), new BigDecimal("29.95"), new BigDecimal("29.95"), account.getCurrency(), null, null, null));
    insertInvoiceItems(firstInvoice);
    // Invoice 2: REPAIR_ADJ 2019-5-3 -> 2019-5-27 => Simulate the BLOCK billing on 2019-5-3
    final InvoiceModelDao secondInvoice = new InvoiceModelDao(UUID.randomUUID(), clock.getUTCNow(), account.getId(), null, new LocalDate(2019, 5, 3), new LocalDate(2019, 5, 3), account.getCurrency(), false, InvoiceStatus.COMMITTED, false);
    secondInvoice.addInvoiceItem(new InvoiceItemModelDao(UUID.randomUUID(), clock.getUTCNow(), InvoiceItemType.REPAIR_ADJ, secondInvoice.getId(), account.getId(), null, null, entitlementId, "", null, null, null, null, null, new LocalDate(2019, 5, 3), new LocalDate(2019, 5, 27), new BigDecimal("-23.96"), null, account.getCurrency(), initialRecuringItemId, null, null));
    insertInvoiceItems(secondInvoice);
    // Invoice 3: REPAIR_ADJ 2019-4-27 -> 2019-5-03 => Simulate the UNBLOCK billing on 2019-5-3 and RECURRING 2019-4-27 -> 2019-5-27
    // Original initialRecuringItemId is now fully repaired and we have re-invoiced for the full period
    // 
    final InvoiceModelDao thirdInvoice = new InvoiceModelDao(UUID.randomUUID(), clock.getUTCNow(), account.getId(), null, new LocalDate(2019, 5, 3), new LocalDate(2019, 5, 3), account.getCurrency(), false, InvoiceStatus.COMMITTED, false);
    final UUID secondRecurringItemId = UUID.randomUUID();
    thirdInvoice.addInvoiceItem(new InvoiceItemModelDao(secondRecurringItemId, clock.getUTCNow(), InvoiceItemType.RECURRING, thirdInvoice.getId(), account.getId(), null, null, entitlementId, "", "Blowdart", "blowdart-monthly-notrial", "blowdart-monthly-notrial-evergreen", null, null, new LocalDate(2019, 4, 27), new LocalDate(2019, 5, 27), new BigDecimal("29.95"), new BigDecimal("29.95"), account.getCurrency(), null, null, null));
    thirdInvoice.addInvoiceItem(new InvoiceItemModelDao(UUID.randomUUID(), clock.getUTCNow(), InvoiceItemType.REPAIR_ADJ, thirdInvoice.getId(), account.getId(), null, null, entitlementId, "", null, null, null, null, null, new LocalDate(2019, 4, 27), new LocalDate(2019, 5, 03), new BigDecimal("-5.99"), null, account.getCurrency(), initialRecuringItemId, null, null));
    insertInvoiceItems(thirdInvoice);
    // Invoice 4: REPAIR_ADJ 2019-5-17 -> 2019-5-27 => Simulate the BLOCK billing on 2019-5-17
    final InvoiceModelDao fourthInvoice = new InvoiceModelDao(UUID.randomUUID(), clock.getUTCNow(), account.getId(), null, new LocalDate(2019, 5, 17), new LocalDate(2019, 5, 17), account.getCurrency(), false, InvoiceStatus.COMMITTED, false);
    fourthInvoice.addInvoiceItem(new InvoiceItemModelDao(UUID.randomUUID(), clock.getUTCNow(), InvoiceItemType.REPAIR_ADJ, fourthInvoice.getId(), account.getId(), null, null, entitlementId, "", null, null, null, null, null, new LocalDate(2019, 5, 17), new LocalDate(2019, 5, 27), new BigDecimal("-9.98"), null, account.getCurrency(), secondRecurringItemId, null, null));
    insertInvoiceItems(fourthInvoice);
    // Invoice 5: RECURRING 2019-4-17 -> 2019-5-17
    final InvoiceModelDao fifthInvoice = new InvoiceModelDao(UUID.randomUUID(), clock.getUTCNow(), account.getId(), null, new LocalDate(2019, 5, 17), new LocalDate(2019, 5, 17), account.getCurrency(), false, InvoiceStatus.COMMITTED, false);
    final UUID thirdRecurringItemId = UUID.randomUUID();
    fifthInvoice.addInvoiceItem(new InvoiceItemModelDao(thirdRecurringItemId, clock.getUTCNow(), InvoiceItemType.RECURRING, fifthInvoice.getId(), account.getId(), null, null, entitlementId, "", "Blowdart", "blowdart-monthly-notrial", "blowdart-monthly-notrial-evergreen", null, null, new LocalDate(2019, 4, 27), new LocalDate(2019, 5, 17), new BigDecimal("5.99"), new BigDecimal("29.95"), account.getCurrency(), null, null, null));
    insertInvoiceItems(fifthInvoice);
    // Trigger IllegalStateException: Double billing detected
    busHandler.pushExpectedEvents(NextEvent.INVOICE, NextEvent.INVOICE, NextEvent.INVOICE, NextEvent.INVOICE, NextEvent.INVOICE, NextEvent.TAG);
    tagUserApi.removeTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.AUTO_INVOICING_OFF.getId(), callContext);
    busHandler.waitAndIgnoreEvents(3000);
    // <! end of setup>
    // 
    // We need to first VOID invoices that have REPAIR items otherwsie VOID operation on invoices being repaired would fail
    // However, in order to VOID such REPAIR invoices for which (system) credit was generated, we need to ensure there is enough
    // credit available on the account, hence the step of manually reclaiming credit before each operation.
    // 
    deleteUsedCredit(account.getId(), new BigDecimal("-23.96"));
    busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
    invoiceUserApi.voidInvoice(secondInvoice.getId(), callContext);
    assertListenerStatus();
    deleteUsedCredit(account.getId(), new BigDecimal("-5.99"));
    deleteUsedCredit(account.getId(), new BigDecimal("-3.99"));
    busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
    invoiceUserApi.voidInvoice(fourthInvoice.getId(), callContext);
    assertListenerStatus();
    busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
    invoiceUserApi.voidInvoice(thirdInvoice.getId(), callContext);
    assertListenerStatus();
    busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
    invoiceUserApi.voidInvoice(firstInvoice.getId(), callContext);
    assertListenerStatus();
    // This remove the __PARK__ tag and fixes the state !
    busHandler.pushExpectedEvents(NextEvent.TAG, NextEvent.NULL_INVOICE);
    try {
        invoiceUserApi.triggerInvoiceGeneration(account.getId(), new LocalDate(2019, 5, 17), callContext);
        fail();
    } catch (final InvoiceApiException e) {
        assertEquals(e.getCode(), INVOICE_NOTHING_TO_DO.getCode());
    } finally {
        assertListenerStatus();
    }
}
Also used : PlanPhaseSpecifier(org.killbill.billing.catalog.api.PlanPhaseSpecifier) Account(org.killbill.billing.account.api.Account) InvoiceModelDao(org.killbill.billing.invoice.dao.InvoiceModelDao) DefaultBlockingState(org.killbill.billing.junction.DefaultBlockingState) BlockingState(org.killbill.billing.entitlement.api.BlockingState) LocalDate(org.joda.time.LocalDate) DateTimeZone(org.joda.time.DateTimeZone) DateTime(org.joda.time.DateTime) BigDecimal(java.math.BigDecimal) DefaultEntitlementSpecifier(org.killbill.billing.entitlement.api.DefaultEntitlementSpecifier) InvoiceApiException(org.killbill.billing.invoice.api.InvoiceApiException) InvoiceItemModelDao(org.killbill.billing.invoice.dao.InvoiceItemModelDao) UUID(java.util.UUID) DefaultBlockingState(org.killbill.billing.junction.DefaultBlockingState) Test(org.testng.annotations.Test)

Example 62 with DefaultBlockingState

use of org.killbill.billing.junction.DefaultBlockingState in project killbill by killbill.

the class TestDefaultInternalBillingApi method testUnblockThenBlockBlockingStatesWithSimilarEffectiveDate.

private void testUnblockThenBlockBlockingStatesWithSimilarEffectiveDate(final ReadablePeriod delay) throws Exception {
    final LocalDate initialDate = new LocalDate(2013, 8, 7);
    clock.setDay(initialDate);
    final Account account = createAccount(getAccountData(7));
    testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK);
    final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
    final UUID entitlementId = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), account.getExternalKey(), null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
    final Entitlement entitlement = entitlementApi.getEntitlementForId(entitlementId, callContext);
    final SubscriptionBase subscription = subscriptionInternalApi.getSubscriptionFromId(entitlement.getId(), internalCallContext);
    assertListenerStatus();
    final DateTime block1Date = subscription.getStartDate().plus(delay);
    // Make sure to update the clock here, because we don't disable for periods less than a day
    clock.setTime(block1Date);
    testListener.pushExpectedEvents(NextEvent.BLOCK);
    final DefaultBlockingState state1 = new DefaultBlockingState(account.getId(), BlockingStateType.ACCOUNT, DefaultEntitlementApi.ENT_STATE_BLOCKED, KILLBILL_SERVICES.ENTITLEMENT_SERVICE.getServiceName(), true, true, true, block1Date);
    blockingInternalApi.setBlockingState(state1, internalCallContext);
    assertListenerStatus();
    clock.addDays(1);
    final DateTime block2Date = clock.getUTCNow();
    testListener.pushExpectedEvents(NextEvent.BLOCK, NextEvent.BLOCK);
    final DefaultBlockingState state2 = new DefaultBlockingState(account.getId(), BlockingStateType.ACCOUNT, DefaultEntitlementApi.ENT_STATE_CLEAR, KILLBILL_SERVICES.ENTITLEMENT_SERVICE.getServiceName(), false, false, false, block2Date);
    blockingInternalApi.setBlockingState(state2, internalCallContext);
    // Same date
    final DefaultBlockingState state3 = new DefaultBlockingState(account.getId(), BlockingStateType.ACCOUNT, DefaultEntitlementApi.ENT_STATE_BLOCKED, KILLBILL_SERVICES.ENTITLEMENT_SERVICE.getServiceName(), true, true, true, block2Date);
    blockingInternalApi.setBlockingState(state3, internalCallContext);
    assertListenerStatus();
    // Nothing should happen
    clock.addDays(3);
    assertListenerStatus();
    final List<BillingEvent> events = ImmutableList.<BillingEvent>copyOf(billingInternalApi.getBillingEventsForAccountAndUpdateAccountBCD(account.getId(), null, null, internalCallContext));
    if (delay.toPeriod().toStandardDuration().compareTo(Period.ZERO.toStandardDuration()) == 0) {
        Assert.assertEquals(events.size(), 0);
    } else {
        // Expected blocking duration:
        // * 2013-08-07 to now [2013-08-07 to 2013-08-08 then 2013-08-08 to now]
        Assert.assertEquals(events.size(), 2);
        Assert.assertEquals(events.get(0).getTransitionType(), SubscriptionBaseTransitionType.CREATE);
        Assert.assertEquals(events.get(0).getEffectiveDate(), subscription.getStartDate());
        Assert.assertEquals(events.get(1).getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
        Assert.assertEquals(events.get(1).getEffectiveDate(), block1Date);
    }
}
Also used : PlanPhaseSpecifier(org.killbill.billing.catalog.api.PlanPhaseSpecifier) DefaultEntitlementSpecifier(org.killbill.billing.entitlement.api.DefaultEntitlementSpecifier) SubscriptionBase(org.killbill.billing.subscription.api.SubscriptionBase) Account(org.killbill.billing.account.api.Account) BillingEvent(org.killbill.billing.junction.BillingEvent) UUID(java.util.UUID) Entitlement(org.killbill.billing.entitlement.api.Entitlement) LocalDate(org.joda.time.LocalDate) DateTime(org.joda.time.DateTime) DefaultBlockingState(org.killbill.billing.junction.DefaultBlockingState)

Example 63 with DefaultBlockingState

use of org.killbill.billing.junction.DefaultBlockingState in project killbill by killbill.

the class TestBlockingCalculator method testCreateDisablePairs.

@Test(groups = "fast")
public void testCreateDisablePairs() {
    List<BlockingState> blockingEvents;
    final UUID ovdId = UUID.randomUUID();
    final UUID ovdId2 = UUID.randomUUID();
    final DateTime now = clock.getUTCNow();
    // Simple events open clear -> disabled
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    List<DisabledDuration> pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertNotNull(pairs.get(0).getStart());
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertNull(pairs.get(0).getEnd());
    // Simple events closed clear -> disabled
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(2)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertNotNull(pairs.get(0).getStart());
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertNotNull(pairs.get(0).getEnd());
    assertEquals(pairs.get(0).getEnd(), now.plusDays(2));
    // Simple BUNDLE events closed clear -> disabled
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(2)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertNotNull(pairs.get(0).getStart());
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertNotNull(pairs.get(0).getEnd());
    assertEquals(pairs.get(0).getEnd(), now.plusDays(2));
    // Two or more disabled in a row
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(3)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertNotNull(pairs.get(0).getStart());
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertNotNull(pairs.get(0).getEnd());
    assertEquals(pairs.get(0).getEnd(), now.plusDays(3));
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(3)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(4)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertNotNull(pairs.get(0).getStart());
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertNotNull(pairs.get(0).getEnd());
    assertEquals(pairs.get(0).getEnd(), now.plusDays(4));
    // Verify ordering at the same effective date doesn't matter. This is to work around nondeterministic ordering
    // behavior in ProxyBlockingStateDao#BLOCKING_STATE_ORDERING_WITH_TIES_UNHANDLED. See also TestDefaultInternalBillingApi.
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId2, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId2, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(3)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertEquals(pairs.get(0).getEnd(), now.plusDays(3));
    blockingEvents = new ArrayList<BlockingState>();
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(1)));
    blockingEvents.add(new DefaultBlockingState(ovdId2, BlockingStateType.SUBSCRIPTION_BUNDLE, DISABLED_BUNDLE, "test", true, true, true, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(2)));
    blockingEvents.add(new DefaultBlockingState(ovdId2, BlockingStateType.SUBSCRIPTION_BUNDLE, CLEAR_BUNDLE, "test", false, false, false, now.plusDays(3)));
    pairs = blockingCalculator.createBlockingDurations(blockingEvents);
    assertEquals(pairs.size(), 1);
    assertEquals(pairs.get(0).getStart(), now.plusDays(1));
    assertEquals(pairs.get(0).getEnd(), now.plusDays(3));
}
Also used : DefaultBlockingState(org.killbill.billing.junction.DefaultBlockingState) BlockingState(org.killbill.billing.entitlement.api.BlockingState) UUID(java.util.UUID) DateTime(org.joda.time.DateTime) DefaultBlockingState(org.killbill.billing.junction.DefaultBlockingState) Test(org.testng.annotations.Test)

Aggregations

DefaultBlockingState (org.killbill.billing.junction.DefaultBlockingState)63 UUID (java.util.UUID)46 DateTime (org.joda.time.DateTime)38 BlockingState (org.killbill.billing.entitlement.api.BlockingState)37 Test (org.testng.annotations.Test)35 LocalDate (org.joda.time.LocalDate)34 Account (org.killbill.billing.account.api.Account)23 ArrayList (java.util.ArrayList)21 PlanPhaseSpecifier (org.killbill.billing.catalog.api.PlanPhaseSpecifier)19 DateTimeZone (org.joda.time.DateTimeZone)14 DefaultEntitlementSpecifier (org.killbill.billing.entitlement.api.DefaultEntitlementSpecifier)14 SubscriptionBaseTransition (org.killbill.billing.subscription.api.user.SubscriptionBaseTransition)11 SubscriptionBase (org.killbill.billing.subscription.api.SubscriptionBase)9 Entitlement (org.killbill.billing.entitlement.api.Entitlement)8 InternalCallContext (org.killbill.billing.callcontext.InternalCallContext)7 WithEntitlementPlugin (org.killbill.billing.entitlement.api.EntitlementPluginExecution.WithEntitlementPlugin)7 EntitlementContext (org.killbill.billing.entitlement.plugin.api.EntitlementContext)7 SubscriptionBaseApiException (org.killbill.billing.subscription.api.user.SubscriptionBaseApiException)7 BigDecimal (java.math.BigDecimal)6 BillingEvent (org.killbill.billing.junction.BillingEvent)6