/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.internal.constraintvalidators.bv.time;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectPropertyPaths;
import static org.hibernate.validator.testutils.ValidatorUtil.getConfiguration;
import java.time.Clock;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import javax.validation.ClockProvider;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Future;
import org.hibernate.validator.testutil.TestForIssue;
import org.joda.time.DateTime;
import org.joda.time.ReadableInstant;
import org.joda.time.ReadablePartial;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Test for using the {@code ClockProvider} contract in {@code @Future} validators not covered by the TCK.
*
* @author Gunnar Morling
* @author Guillaume Smet
*/
@TestForIssue(jiraKey = "HV-897")
public class ClockProviderFutureTest {
private static final ZoneId TZ_BERLIN = ZoneId.of( "Europe/Berlin" );
private static ValidatorFactory validatorFactory;
private Validator validator;
@BeforeClass
public static void setupValidatorFactoryAndValidationXmlTestHelper() {
FixedClockProvider clockProvider = new FixedClockProvider(
ZonedDateTime.of(
2100, 2, 15, 4, 0, 0, 0,
TZ_BERLIN
)
);
validatorFactory = getConfiguration()
.clockProvider( clockProvider )
.buildValidatorFactory();
}
@BeforeMethod
public void setupValidator() {
validator = validatorFactory.getValidator();
}
@Test
public void clockProviderIsUsedForFutureOnReadableInstant() {
Order order = new Order();
order.shipmentDateAsReadableInstant = new DateTime( 2099, 2, 15, 4, 0, 0 );
assertCorrectPropertyPaths( validator.validate( order ), "shipmentDateAsReadableInstant" );
}
@Test
public void clockProviderIsUsedForFutureOnReadablePartial() {
Order order = new Order();
order.shipmentDateAsReadablePartial = new org.joda.time.LocalDateTime( 2099, 2, 15, 4, 0, 0 );
assertCorrectPropertyPaths( validator.validate( order ), "shipmentDateAsReadablePartial" );
}
private static class Order {
@Future
private ReadableInstant shipmentDateAsReadableInstant;
@Future
private ReadablePartial shipmentDateAsReadablePartial;
}
private static class FixedClockProvider implements ClockProvider {
private Clock clock;
public FixedClockProvider(ZonedDateTime dateTime) {
clock = Clock.fixed( dateTime.toInstant(), dateTime.getZone() );
}
@Override
public Clock getClock() {
return clock;
}
}
}