@Test(groups = "fast") public void testOneEntitlementNoBlockingStates() throws CatalogApiException { clock.setDay(new LocalDate(2013, 1, 1)); final DateTimeZone accountTimeZone = DateTimeZone.UTC; final UUID accountId = UUID.randomUUID(); final UUID bundleId = UUID.randomUUID(); final String externalKey = "foo"; final UUID entitlementId = UUID.randomUUID(); final List<SubscriptionBaseTransition> allTransitions = new ArrayList<SubscriptionBaseTransition>(); final DateTime requestedDate = new DateTime(); DateTime effectiveDate = new DateTime(2013, 1, 1, 15, 43, 25, 0, DateTimeZone.UTC); final SubscriptionBaseTransition tr1 = createTransition( entitlementId, EventType.API_USER, ApiEventType.CREATE, requestedDate, effectiveDate, clock.getUTCNow(), null, "trial"); allTransitions.add(tr1); effectiveDate = effectiveDate.plusDays(30); clock.addDays(30); final SubscriptionBaseTransition tr2 = createTransition( entitlementId, EventType.PHASE, null, requestedDate, effectiveDate, clock.getUTCNow(), "trial", "phase"); allTransitions.add(tr2); effectiveDate = effectiveDate.plusDays(15); clock.addDays(15); final SubscriptionBaseTransition tr3 = createTransition( entitlementId, EventType.API_USER, ApiEventType.CANCEL, requestedDate, effectiveDate, clock.getUTCNow(), "phase", null); allTransitions.add(tr3); final List<Entitlement> entitlements = new ArrayList<Entitlement>(); final Entitlement entitlement = createEntitlement(entitlementId, allTransitions); entitlements.add(entitlement); final DefaultSubscriptionBundleTimeline timeline = new DefaultSubscriptionBundleTimeline( accountTimeZone, accountId, bundleId, externalKey, entitlements, Collections.<BlockingState>emptyList()); assertEquals(timeline.getAccountId(), accountId); assertEquals(timeline.getBundleId(), bundleId); assertEquals(timeline.getExternalKey(), externalKey); List<SubscriptionEvent> events = timeline.getSubscriptionEvents(); assertEquals(events.size(), 4); assertEquals( events .get(0) .getEffectiveDate() .compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(1) .getEffectiveDate() .compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(2) .getEffectiveDate() .compareTo(new LocalDate(tr2.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(3) .getEffectiveDate() .compareTo(new LocalDate(tr3.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals(events.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); assertEquals(events.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); assertEquals(events.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); assertEquals(events.get(3).getSubscriptionEventType(), SubscriptionEventType.STOP_BILLING); assertEquals(events.get(0).getNextPhase().getName(), "trial"); assertEquals(events.get(1).getNextPhase().getName(), "trial"); assertEquals(events.get(2).getNextPhase().getName(), "phase"); assertEquals(events.get(3).getNextPhase(), null); }
@Test(groups = "fast") public void testWithMultipleEntitlements() throws CatalogApiException { clock.setDay(new LocalDate(2013, 1, 1)); final DateTimeZone accountTimeZone = DateTimeZone.UTC; final UUID accountId = UUID.randomUUID(); final UUID bundleId = UUID.randomUUID(); final String externalKey = "foo"; final UUID entitlementId1 = UUID.fromString("cf5a597a-cf15-45d3-8f02-95371be7f927"); final UUID entitlementId2 = UUID.fromString("e37cc97a-7b98-4ab6-a29a-7259e45c3366"); final List<SubscriptionBaseTransition> allTransitions1 = new ArrayList<SubscriptionBaseTransition>(); final List<SubscriptionBaseTransition> allTransitions2 = new ArrayList<SubscriptionBaseTransition>(); final List<BlockingState> blockingStates = new ArrayList<BlockingState>(); final DateTime requestedDate = new DateTime(); DateTime effectiveDate = new DateTime(2013, 1, 1, 15, 43, 25, 0, DateTimeZone.UTC); final SubscriptionBaseTransition ent1Tr1 = createTransition( entitlementId1, EventType.API_USER, ApiEventType.CREATE, requestedDate, effectiveDate, clock.getUTCNow(), null, "trial1"); allTransitions1.add(ent1Tr1); effectiveDate = effectiveDate.plusDays(15); clock.addDays(15); final SubscriptionBaseTransition ent2Tr1 = createTransition( entitlementId2, EventType.API_USER, ApiEventType.TRANSFER, requestedDate, effectiveDate, clock.getUTCNow(), null, "phase2"); allTransitions2.add(ent2Tr1); effectiveDate = effectiveDate.plusDays(15); clock.addDays(15); final SubscriptionBaseTransition ent1Tr2 = createTransition( entitlementId1, EventType.PHASE, null, requestedDate, effectiveDate, clock.getUTCNow(), "trial1", "phase1"); allTransitions1.add(ent1Tr2); effectiveDate = effectiveDate.plusDays(5); clock.addDays(5); final BlockingState bs1 = new DefaultBlockingState( UUID.randomUUID(), bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, DefaultEntitlementApi.ENT_STATE_BLOCKED, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, true, true, false, effectiveDate, clock.getUTCNow(), clock.getUTCNow()); blockingStates.add(bs1); effectiveDate = effectiveDate.plusDays(15); clock.addDays(15); final SubscriptionBaseTransition ent1Tr3 = createTransition( entitlementId1, EventType.API_USER, ApiEventType.CANCEL, requestedDate, effectiveDate, clock.getUTCNow(), "phase1", null); allTransitions1.add(ent1Tr3); final BlockingState bs2 = new DefaultBlockingState( UUID.randomUUID(), entitlementId1, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_CANCELLED, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, true, true, false, effectiveDate, clock.getUTCNow(), clock.getUTCNow()); blockingStates.add(bs2); final List<Entitlement> entitlements = new ArrayList<Entitlement>(); final Entitlement entitlement1 = createEntitlement(entitlementId1, allTransitions1); entitlements.add(entitlement1); final Entitlement entitlement2 = createEntitlement(entitlementId2, allTransitions2); entitlements.add(entitlement2); final DefaultSubscriptionBundleTimeline timeline = new DefaultSubscriptionBundleTimeline( accountTimeZone, accountId, bundleId, externalKey, entitlements, blockingStates); List<SubscriptionEvent> events = timeline.getSubscriptionEvents(); assertEquals(events.size(), 9); assertEquals( events .get(0) .getEffectiveDate() .compareTo(new LocalDate(ent1Tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(1) .getEffectiveDate() .compareTo(new LocalDate(ent1Tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(2) .getEffectiveDate() .compareTo(new LocalDate(ent2Tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(3) .getEffectiveDate() .compareTo(new LocalDate(ent2Tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(4) .getEffectiveDate() .compareTo(new LocalDate(ent1Tr2.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(5) .getEffectiveDate() .compareTo(new LocalDate(bs1.getEffectiveDate(), accountTimeZone)), 0); assertEquals( events .get(6) .getEffectiveDate() .compareTo(new LocalDate(bs1.getEffectiveDate(), accountTimeZone)), 0); assertEquals( events .get(7) .getEffectiveDate() .compareTo(new LocalDate(ent1Tr3.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(8) .getEffectiveDate() .compareTo(new LocalDate(bs2.getEffectiveDate(), accountTimeZone)), 0); assertEquals(events.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); assertEquals(events.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); assertEquals(events.get(2).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); assertEquals(events.get(3).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); assertEquals(events.get(4).getSubscriptionEventType(), SubscriptionEventType.PHASE); assertEquals(events.get(5).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); assertEquals(events.get(6).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); assertEquals(events.get(7).getSubscriptionEventType(), SubscriptionEventType.STOP_ENTITLEMENT); assertEquals(events.get(8).getSubscriptionEventType(), SubscriptionEventType.STOP_BILLING); assertEquals(events.get(0).getPrevPhase(), null); assertEquals(events.get(0).getNextPhase().getName(), "trial1"); assertEquals(events.get(1).getPrevPhase(), null); assertEquals(events.get(1).getNextPhase().getName(), "trial1"); assertEquals(events.get(2).getPrevPhase(), null); assertEquals(events.get(2).getNextPhase().getName(), "phase2"); assertEquals(events.get(3).getPrevPhase(), null); assertEquals(events.get(3).getNextPhase().getName(), "phase2"); assertEquals(events.get(4).getPrevPhase().getName(), "trial1"); assertEquals(events.get(4).getNextPhase().getName(), "phase1"); assertEquals(events.get(5).getPrevPhase().getName(), "phase1"); assertEquals(events.get(5).getNextPhase().getName(), "phase1"); assertEquals(events.get(6).getPrevPhase().getName(), "phase2"); assertEquals(events.get(6).getNextPhase(), null); assertEquals(events.get(7).getPrevPhase().getName(), "phase1"); assertEquals(events.get(7).getNextPhase(), null); assertEquals(events.get(8).getPrevPhase().getName(), "phase1"); assertEquals(events.get(8).getNextPhase(), null); }
@Test(groups = "fast") public void testOneEntitlementWithBlockingStatesSubscription() throws CatalogApiException { clock.setDay(new LocalDate(2013, 1, 1)); final DateTimeZone accountTimeZone = DateTimeZone.UTC; final UUID accountId = UUID.randomUUID(); final UUID bundleId = UUID.randomUUID(); final String externalKey = "foo"; final UUID entitlementId = UUID.randomUUID(); final List<SubscriptionBaseTransition> allTransitions = new ArrayList<SubscriptionBaseTransition>(); final List<BlockingState> blockingStates = new ArrayList<BlockingState>(); final DateTime requestedDate = new DateTime(); DateTime effectiveDate = new DateTime(2013, 1, 1, 15, 43, 25, 0, DateTimeZone.UTC); final SubscriptionBaseTransition tr1 = createTransition( entitlementId, EventType.API_USER, ApiEventType.CREATE, requestedDate, effectiveDate, clock.getUTCNow(), null, "trial"); allTransitions.add(tr1); effectiveDate = effectiveDate.plusDays(30); clock.addDays(30); final SubscriptionBaseTransition tr2 = createTransition( entitlementId, EventType.PHASE, null, requestedDate, effectiveDate, clock.getUTCNow(), "trial", "phase"); allTransitions.add(tr2); effectiveDate = effectiveDate.plusDays(5); clock.addDays(5); final BlockingState bs1 = new DefaultBlockingState( UUID.randomUUID(), entitlementId, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_BLOCKED, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, true, true, false, effectiveDate, clock.getUTCNow(), clock.getUTCNow()); blockingStates.add(bs1); effectiveDate = effectiveDate.plusDays(15); clock.addDays(15); final SubscriptionBaseTransition tr3 = createTransition( entitlementId, EventType.API_USER, ApiEventType.CANCEL, requestedDate, effectiveDate, clock.getUTCNow(), "phase", null); allTransitions.add(tr3); final BlockingState bs2 = new DefaultBlockingState( UUID.randomUUID(), entitlementId, BlockingStateType.SUBSCRIPTION, DefaultEntitlementApi.ENT_STATE_CANCELLED, DefaultEntitlementService.ENTITLEMENT_SERVICE_NAME, true, true, false, effectiveDate, clock.getUTCNow(), clock.getUTCNow()); blockingStates.add(bs2); final List<Entitlement> entitlements = new ArrayList<Entitlement>(); final Entitlement entitlement = createEntitlement(entitlementId, allTransitions); entitlements.add(entitlement); final DefaultSubscriptionBundleTimeline timeline = new DefaultSubscriptionBundleTimeline( accountTimeZone, accountId, bundleId, externalKey, entitlements, blockingStates); List<SubscriptionEvent> events = timeline.getSubscriptionEvents(); assertEquals(events.size(), 6); assertEquals( events .get(0) .getEffectiveDate() .compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(1) .getEffectiveDate() .compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(2) .getEffectiveDate() .compareTo(new LocalDate(tr2.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(3) .getEffectiveDate() .compareTo(new LocalDate(bs1.getEffectiveDate(), accountTimeZone)), 0); assertEquals( events .get(4) .getEffectiveDate() .compareTo(new LocalDate(tr3.getEffectiveTransitionTime(), accountTimeZone)), 0); assertEquals( events .get(5) .getEffectiveDate() .compareTo(new LocalDate(bs2.getEffectiveDate(), accountTimeZone)), 0); assertEquals(events.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT); assertEquals(events.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING); assertEquals(events.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE); assertEquals(events.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT); assertEquals(events.get(4).getSubscriptionEventType(), SubscriptionEventType.STOP_ENTITLEMENT); assertEquals(events.get(5).getSubscriptionEventType(), SubscriptionEventType.STOP_BILLING); assertEquals(events.get(0).getPrevPhase(), null); assertEquals(events.get(0).getNextPhase().getName(), "trial"); assertEquals(events.get(1).getPrevPhase(), null); assertEquals(events.get(1).getNextPhase().getName(), "trial"); assertEquals(events.get(2).getPrevPhase().getName(), "trial"); assertEquals(events.get(2).getNextPhase().getName(), "phase"); assertEquals(events.get(3).getPrevPhase().getName(), "phase"); assertEquals(events.get(3).getNextPhase().getName(), "phase"); assertEquals(events.get(4).getPrevPhase().getName(), "phase"); assertEquals(events.get(4).getNextPhase(), null); assertEquals(events.get(5).getPrevPhase().getName(), "phase"); assertEquals(events.get(5).getNextPhase(), null); }