Skip to content

Commit

Permalink
adding tests for subscription date validity
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Jan 18, 2024
1 parent 9e89a6f commit 2298763
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 38 deletions.
Expand Up @@ -6,14 +6,12 @@
*/
package com.evolveum.midpoint.repo.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.validator.routines.checkdigit.VerhoeffCheckDigit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -31,6 +29,8 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.DeploymentInformationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;

import org.jetbrains.annotations.TestOnly;

public class SubscriptionUtil {

private static final Trace LOGGER = TraceManager.getTrace(SubscriptionUtil.class);
Expand Down Expand Up @@ -74,38 +74,13 @@ public static SubscriptionWrapper getSubscriptionType(String subscriptionId) {
return createInvalidSubscription();
}

String substring1 = subscriptionId.substring(2, 4);
String substring2 = subscriptionId.substring(4, 6);
SubscriptionValidity successValidity = SubscriptionValidity.VALID;
SubscriptionValidity successValidity;
try {
if (Integer.parseInt(substring1) < 1 || Integer.parseInt(substring1) > 12) {
SubscriptionValidity resolvedValidity = resolveValidityForSubscriptionId(subscriptionId, new Date(System.currentTimeMillis()));
if (resolvedValidity == SubscriptionValidity.INVALID) {
return createInvalidSubscription();
}

SimpleDateFormat dateFormat = new SimpleDateFormat("yy");
String currentYear = dateFormat.format(Calendar.getInstance().getTime());
if (Integer.parseInt(substring2) < Integer.parseInt(currentYear) && Integer.parseInt(substring1) < 10) {
return createInvalidSubscription();
}

String expDateStr = subscriptionId.substring(2, 6);
dateFormat = new SimpleDateFormat("MMyy");
Date expDate = dateFormat.parse(expDateStr);
Calendar expireCalendarValue = Calendar.getInstance();
expireCalendarValue.setTime(expDate);
expireCalendarValue.add(Calendar.MONTH, 1);
Date currentDate = new Date(System.currentTimeMillis());
if (expireCalendarValue.getTime().before(currentDate) || expireCalendarValue.getTime().equals(currentDate)) {
if (expiresIn(expireCalendarValue, currentDate, 1)) {
successValidity = SubscriptionValidity.INVALID_FIRST_MONTH;
} else if (expiresIn(expireCalendarValue, currentDate, 2)) {
successValidity = SubscriptionValidity.INVALID_SECOND_MONTH;
} else if (expiresIn(expireCalendarValue, currentDate, 3)) {
successValidity = SubscriptionValidity.INVALID_THIRD_MONTH;
} else {
return createInvalidSubscription();
}
}
successValidity = resolvedValidity;
} catch (Exception ex) {
return createInvalidSubscription();
}
Expand All @@ -117,12 +92,46 @@ public static SubscriptionWrapper getSubscriptionType(String subscriptionId) {
return new SubscriptionWrapper(type, successValidity);
}

private static boolean expiresIn(Calendar expireCalendarValue, Date currentDate, int i) {
Date plusOneMonth = DateUtils.addMonths(currentDate, i);
if (expireCalendarValue.getTime().before(plusOneMonth) || expireCalendarValue.getTime().equals(plusOneMonth)) {
return false;
@TestOnly
public static SubscriptionValidity resolveValidityForSubscriptionId(String subscriptionId, Date currentDate) throws ParseException {
String months = subscriptionId.substring(2, 4);
String years = subscriptionId.substring(4, 6);

if (Integer.parseInt(months) < 1 || Integer.parseInt(months) > 12) {
return SubscriptionValidity.INVALID;
}
return true;

SimpleDateFormat dateFormat = new SimpleDateFormat("yy");
String currentYear = dateFormat.format(currentDate);
if (Integer.parseInt(years) < Integer.parseInt(currentYear) && Integer.parseInt(months) < 10) {
return SubscriptionValidity.INVALID;
}

String expDateStr = subscriptionId.substring(2, 6);
dateFormat = new SimpleDateFormat("MMyy");
Date expDate = dateFormat.parse(expDateStr);
Calendar expireCalendarValue = Calendar.getInstance();
expireCalendarValue.setTime(expDate);
expireCalendarValue.add(Calendar.MONTH, 1);
if (expireCalendarValue.getTime().before(currentDate) || expireCalendarValue.getTime().equals(currentDate)) {
if (expiresIn(expireCalendarValue, currentDate, 1)) {
return SubscriptionValidity.INVALID_FIRST_MONTH;
} else if (expiresIn(expireCalendarValue, currentDate, 2)) {
return SubscriptionValidity.INVALID_SECOND_MONTH;
} else if (expiresIn(expireCalendarValue, currentDate, 3)) {
return SubscriptionValidity.INVALID_THIRD_MONTH;
} else {
return SubscriptionValidity.INVALID;
}
}

return SubscriptionValidity.VALID;
}

private static boolean expiresIn(Calendar expireCalendarValue, Date currentDate, int i) {
Calendar expireInFuture = (Calendar) expireCalendarValue.clone();
expireInFuture.add(Calendar.MONTH, i);
return !expireInFuture.getTime().before(currentDate) && !expireInFuture.getTime().equals(currentDate);
}

/**
Expand Down
@@ -0,0 +1,80 @@
package com.evolveum.midpoint.repo.common;

import com.evolveum.midpoint.repo.common.util.SubscriptionUtil;
import com.evolveum.midpoint.repo.common.util.SubscriptionWrapper.SubscriptionValidity;
import com.evolveum.midpoint.tools.testng.AbstractUnitTest;

import org.assertj.core.api.Assertions;
import org.testng.annotations.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
* Tests for date validity of subscription.
*/
public class SubscriptionDateValidityTest extends AbstractUnitTest{

@Test
public void invalidYear() throws Exception{
validateDate("050123", "0124", SubscriptionValidity.INVALID);
}

@Test
public void validDate() throws Exception{
validateDate("050125", "0124", SubscriptionValidity.VALID);
}

@Test
public void firstMonthInvalid() throws Exception{
validateDate("050424", "0524", SubscriptionValidity.INVALID_FIRST_MONTH);
}

@Test
public void secondMonthInvalid() throws Exception{
validateDate("050324", "0524", SubscriptionValidity.INVALID_SECOND_MONTH);
}

@Test
public void thirdMonthInvalid() throws Exception{
validateDate("050224", "0524", SubscriptionValidity.INVALID_THIRD_MONTH);
}

@Test
public void fourthMonthInvalid() throws Exception{
validateDate("050124", "0524", SubscriptionValidity.INVALID);
}

@Test
public void wrongMonth() throws Exception{
validateDate("052123", "0124", SubscriptionValidity.INVALID);
}

@Test
public void firstMonthInvalidThroughEndOfYear() throws Exception{
validateDate("051223", "0124", SubscriptionValidity.INVALID_FIRST_MONTH);
}

@Test
public void secondMonthInvalidThroughEndOfYear() throws Exception{
validateDate("051123", "0124", SubscriptionValidity.INVALID_SECOND_MONTH);
}

@Test
public void thirdMonthInvalidThroughEndOfYear() throws Exception{
validateDate("051023", "0124", SubscriptionValidity.INVALID_THIRD_MONTH);
}

@Test
public void fourthMonthInvalidThroughEndOfYear() throws Exception{
validateDate("050923", "0124", SubscriptionValidity.INVALID);
}

private void validateDate(String testedDatePartOfSubscriptionId, String currentDate, SubscriptionValidity expectedValidity) throws ParseException {

SubscriptionValidity validity = SubscriptionUtil.resolveValidityForSubscriptionId(
testedDatePartOfSubscriptionId,
new SimpleDateFormat("MMyy").parse(currentDate));
Assertions.assertThat(validity).isEqualByComparingTo(expectedValidity);
}
}
6 changes: 5 additions & 1 deletion repo/repo-common/testng-unit.xml
Expand Up @@ -8,5 +8,9 @@

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="unit" parallel="none">
<!-- No unit tests, see integration test suite XML. -->
<test name="Subscription" parallel="none" verbose="10">
<classes>
<class name="com.evolveum.midpoint.repo.common.SubscriptionDateValidityTest"/>
</classes>
</test>
</suite>

0 comments on commit 2298763

Please sign in to comment.