/*
* Copyright 2010-2014 Ning, Inc.
* Copyright 2014-2016 Groupon, Inc
* Copyright 2014-2016 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.invoice.proRations.inAdvance;
import static org.killbill.billing.invoice.TestInvoiceHelper.*;
import java.math.BigDecimal;
import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import org.killbill.billing.invoice.model.InvalidDateSequenceException;
import org.killbill.billing.util.currency.KillBillMoney;
public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBase {
/**
* used for testing cancellation in less than a single billing period
*
* @return BigDecimal the number of days in the billing period beginning 2011/1/1
*/
protected abstract BigDecimal getDaysInTestPeriod();
@Test(groups = "fast")
public void testSinglePlan_OnStartDate() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
testCalculateNumberOfBillingCycles(startDate, startDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LessThanOnePeriod() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_OnePeriodLessADayAfterStart() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
final LocalDate targetDate = startDate.plus(getBillingPeriod().getPeriod()).plusDays(-1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_ExactlyOnePeriodAfterStart() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
final LocalDate targetDate = startDate.plus(getBillingPeriod().getPeriod());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_SlightlyMoreThanOnePeriodAfterStart() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
final LocalDate targetDate = startDate.plus(getBillingPeriod().getPeriod()).plusDays(1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 12, 15);
final LocalDate oneCycleLater = startDate.plus(getBillingPeriod().getPeriod());
// test just before the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 15, ONE);
// test on the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater, 15, TWO);
// test just after the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(1), 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_StartingMidFebruary() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
final LocalDate targetDate = startDate.plus(getBillingPeriod().getPeriod());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_StartingMidFebruaryOfLeapYear() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 15);
final LocalDate targetDate = startDate.plus(getBillingPeriod().getPeriod());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_MovingForwardThroughTime() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 31);
BigDecimal expectedValue = ONE;
for (int i = 1; i <= 12; i++) {
LocalDate oneCycleLater = startDate;
for (int j = 0; j < i; j++) {
oneCycleLater = oneCycleLater.plus(getBillingPeriod().getPeriod());
}
// test just before the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 31, expectedValue);
expectedValue = expectedValue.add(ONE);
// test on the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater, 31, expectedValue);
// test just after the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(1), 31, expectedValue);
}
}
// tests for cancellation in less than one period, beginning Jan 1
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateInStartDate() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateInSubscriptionPeriod() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 7);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateOnEndDate() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAfterEndDateButInFirstBillingPeriod() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 17);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAtEndOfFirstBillingPeriod() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 5);
final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), KillBillMoney.ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
}