/* * Copyright 2014-2017 Groupon, Inc * Copyright 2014-2017 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.killbill.billing.entitlement.api; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.UUID; import org.joda.time.DateTime; import org.killbill.billing.entitlement.DefaultEntitlementService; import org.killbill.billing.entitlement.EntitlementTestSuiteNoDB; import org.killbill.billing.junction.DefaultBlockingState; import org.killbill.billing.subscription.api.user.SubscriptionBaseTransition; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.Test; // invocationCount > 1 to verify flakiness public class TestBlockingStateOrdering extends EntitlementTestSuiteNoDB { private long globalOrdering = 0; @Test(groups = "fast", invocationCount = 10) public void testIgnore_ENTITLEMENT_SERVICE_NAME_WithNoFlag() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now.plusDays(1))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 3); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); } @Test(groups = "fast", invocationCount = 10) public void test_ENT_STATE_IsNotInterpreted() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, "svc1", false, false, now.plusDays(1))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_CANCELLED, "svc1", false, false, now.plusDays(2))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.SERVICE_STATE_CHANGE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.SERVICE_STATE_CHANGE); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PHASE); } @Test(groups = "fast", invocationCount = 10) public void testPauseAtStart() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, true, now)); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PHASE); } @Test(groups = "fast", invocationCount = 10) public void testPausePostPhase_0_17_X() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, true, now.plusDays(40))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testPausePostPhase() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, true, now.plusDays(40))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testPauseAtPhase() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, true, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testPauseResumeAtPhase() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, true, now.plusDays(30))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", false, false, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 7); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); Assert.assertEquals(allEvents.get(5).getSubscriptionEventType(), SubscriptionEventType.RESUME_ENTITLEMENT); Assert.assertEquals(allEvents.get(6).getSubscriptionEventType(), SubscriptionEventType.RESUME_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testPauseAccountAtPhase() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(UUID.randomUUID(), BlockingStateType.ACCOUNT, "stuff", "svc1", true, true, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 5); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testDifferentTypesOfBlockingSameService() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(UUID.randomUUID(), BlockingStateType.ACCOUNT, "stuff", "svc1", false, true, now.plusDays(10))); // Same service blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", true, false, now.plusDays(15))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc1", false, false, now.plusDays(20))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.ACCOUNT, "stuff", "svc1", false, false, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 8); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.RESUME_BILLING); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(5).getSubscriptionEventType(), SubscriptionEventType.RESUME_ENTITLEMENT); Assert.assertEquals(allEvents.get(6).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(7).getSubscriptionEventType(), SubscriptionEventType.SERVICE_STATE_CHANGE); } @Test(groups = "fast", invocationCount = 10) public void testDifferentTypesOfBlockingDifferentServices() throws Exception { final DateTime now = clock.getUTCNow(); final UUID subscriptionId1 = UUID.randomUUID(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(UUID.randomUUID(), BlockingStateType.ACCOUNT, "stuff", "svc1", false, true, now.plusDays(10))); // Different service blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc2", true, false, now.plusDays(15))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, "stuff", "svc2", false, false, now.plusDays(20))); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.ACCOUNT, "stuff", "svc1", false, false, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 7); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.RESUME_ENTITLEMENT); Assert.assertEquals(allEvents.get(5).getSubscriptionEventType(), SubscriptionEventType.PHASE); Assert.assertEquals(allEvents.get(6).getSubscriptionEventType(), SubscriptionEventType.RESUME_BILLING); } @Test(groups = "fast", invocationCount = 10) public void testPauseAccountAtPhaseAndPauseOtherSubscriptionFutureStartedV1() throws Exception { final UUID subscriptionId1 = UUID.randomUUID(); UUID subscriptionId2 = UUID.randomUUID(); while (subscriptionId2.compareTo(subscriptionId1) <= 0) { subscriptionId2 = UUID.randomUUID(); } testPauseAccountAtPhaseAndPauseOtherSubscriptionFutureStarted(subscriptionId1, subscriptionId2); } @Test(groups = "fast", invocationCount = 10) public void testPauseAccountAtPhaseAndPauseOtherSubscriptionFutureStartedV2() throws Exception { final UUID subscriptionId1 = UUID.randomUUID(); UUID subscriptionId2 = UUID.randomUUID(); while (subscriptionId2.compareTo(subscriptionId1) >= 0) { subscriptionId2 = UUID.randomUUID(); } testPauseAccountAtPhaseAndPauseOtherSubscriptionFutureStarted(subscriptionId1, subscriptionId2); } private void testPauseAccountAtPhaseAndPauseOtherSubscriptionFutureStarted(final UUID subscriptionId1, final UUID subscriptionId2) throws Exception { final DateTime now = clock.getUTCNow(); final Collection<BlockingState> blockingStates = new LinkedList<BlockingState>(); blockingStates.add(createBlockingState(subscriptionId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(subscriptionId2, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_START, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, now)); blockingStates.add(createBlockingState(UUID.randomUUID(), BlockingStateType.ACCOUNT, "stuff", "svc1", true, true, now.plusDays(30))); final LinkedList<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>(); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.START_BILLING, now)); allEvents.add(createEvent(subscriptionId1, SubscriptionEventType.PHASE, now.plusDays(30))); allEvents.add(createEvent(subscriptionId2, SubscriptionEventType.START_BILLING, now.plusDays(40))); computeEvents(allEvents, blockingStates); Assert.assertEquals(allEvents.size(), 8); Assert.assertEquals(allEvents.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(1).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); Assert.assertEquals(allEvents.get(2).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); Assert.assertEquals(allEvents.get(3).getSubscriptionEventType(), SubscriptionEventType.PHASE); if (subscriptionId1.compareTo(subscriptionId2) >= 0) { Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(5).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(6).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); } else { Assert.assertEquals(allEvents.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); Assert.assertEquals(allEvents.get(5).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING); Assert.assertEquals(allEvents.get(6).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); } Assert.assertEquals(allEvents.get(7).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); } private BlockingState createBlockingState(final UUID blockedId, final BlockingStateType blockingStateType, final String stateName, final String service, final boolean blockEntitlement, final boolean blockBilling, final DateTime effectiveDate) { return new DefaultBlockingState(UUID.randomUUID(), blockedId, blockingStateType, stateName, service, false, blockEntitlement, blockBilling, effectiveDate, effectiveDate, effectiveDate, globalOrdering++); } // Re-use SubscriptionEventOrdering method, as it's the input of BlockingStateOrdering private SubscriptionEvent createEvent(final UUID subscriptionId, final SubscriptionEventType type, final DateTime effectiveDate) { final SubscriptionBaseTransition subscriptionBaseTransition = Mockito.mock(SubscriptionBaseTransition.class); Mockito.when(subscriptionBaseTransition.getId()).thenReturn(UUID.randomUUID()); Mockito.when(subscriptionBaseTransition.getSubscriptionId()).thenReturn(subscriptionId); Mockito.when(subscriptionBaseTransition.getEffectiveTransitionTime()).thenReturn(effectiveDate); return SubscriptionEventOrdering.toSubscriptionEvent(subscriptionBaseTransition, type, internalCallContext); } private void computeEvents(final LinkedList<SubscriptionEvent> allEvents, final Collection<BlockingState> blockingStates) { final Collection<UUID> allEntitlementUUIDs = new HashSet<UUID>(); for (final SubscriptionEvent subscriptionEvent : allEvents) { allEntitlementUUIDs.add(subscriptionEvent.getEntitlementId()); } for (final BlockingState blockingState : blockingStates) { if (blockingState.getType() == BlockingStateType.SUBSCRIPTION) { allEntitlementUUIDs.add(blockingState.getBlockedId()); } } BlockingStateOrdering.INSTANCE.computeEvents(new LinkedList<UUID>(allEntitlementUUIDs), blockingStates, internalCallContext, allEvents); } }