package jpasearch.repository.comparable;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Date;
import javax.inject.Inject;
import javax.transaction.Transactional;
import jpasearch.TestApplication;
import jpasearch.domain.comparable.EntityWithComparableField;
import jpasearch.domain.comparable.EntityWithComparableField_;
import jpasearch.repository.query.SearchParameters;
import jpasearch.repository.query.builder.SearchBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
/**
* @author speralta
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class EntityWithComparableFieldRepositoryIT {
@Inject
private EntityWithComparableFieldRepository entityWithComparableFieldRepository;
@Test
public void test() {
final Date testValue = new Date();
assertThat(entityWithComparableFieldRepository.findCount(findByRange(testValue))).isEqualTo(0);
EntityWithComparableField entityWithComparableField = new EntityWithComparableField();
entityWithComparableField.setDate(testValue);
entityWithComparableField = entityWithComparableFieldRepository.save(entityWithComparableField);
assertThat(entityWithComparableFieldRepository.find(findByRange(testValue))).containsExactly(entityWithComparableField);
}
private SearchParameters<EntityWithComparableField> findByRange(Date value) {
Date from = new Date();
from.setTime(value.getTime() - 10000);
Date to = new Date();
to.setTime(value.getTime() + 10000);
return new SearchBuilder<EntityWithComparableField>() //
.rangeOn(EntityWithComparableField_.date).between(from, to) //
.build();
}
@Test
public void test_includeNull() {
final Date testValue = new Date();
assertThat(entityWithComparableFieldRepository.findCount(findByRangeIncludingNull(testValue))).isEqualTo(0);
EntityWithComparableField entityWithComparableField = new EntityWithComparableField();
entityWithComparableField.setDate(testValue);
entityWithComparableField = entityWithComparableFieldRepository.save(entityWithComparableField);
EntityWithComparableField entityWithNullField = new EntityWithComparableField();
entityWithNullField.setDate(null);
entityWithNullField = entityWithComparableFieldRepository.save(entityWithNullField);
assertThat(entityWithComparableFieldRepository.find(findByRange(testValue))).containsExactly(entityWithComparableField);
assertThat(entityWithComparableFieldRepository.find(findByRangeIncludingNull(testValue))).containsExactly(entityWithComparableField, entityWithNullField);
}
private SearchParameters<EntityWithComparableField> findByRangeIncludingNull(Date value) {
Date from = new Date();
from.setTime(value.getTime() - 10000);
Date to = new Date();
to.setTime(value.getTime() + 10000);
return new SearchBuilder<EntityWithComparableField>() //
.rangeOn(EntityWithComparableField_.date).includingNull().between(from, to) //
.build();
}
@Test
public void test_excludeBounds() {
final Date testValue = new Date();
final Date from = new Date();
from.setTime(testValue.getTime() - 1000);
final Date to = new Date();
to.setTime(testValue.getTime() + 1000);
assertThat(entityWithComparableFieldRepository.findCount(findByRangeExcludingBounds(from, to))).isEqualTo(0);
EntityWithComparableField entityWithComparableField = new EntityWithComparableField();
entityWithComparableField.setDate(testValue);
entityWithComparableField = entityWithComparableFieldRepository.save(entityWithComparableField);
EntityWithComparableField entityFrom = new EntityWithComparableField();
entityFrom.setDate(from);
entityFrom = entityWithComparableFieldRepository.save(entityFrom);
EntityWithComparableField entityTo = new EntityWithComparableField();
entityTo.setDate(to);
entityTo = entityWithComparableFieldRepository.save(entityTo);
assertThat(entityWithComparableFieldRepository.find(findByRange(testValue))).containsExactly(entityWithComparableField, entityFrom, entityTo);
assertThat(entityWithComparableFieldRepository.find(findByRangeExcludingBounds(from, to))).containsExactly(entityWithComparableField);
}
private SearchParameters<EntityWithComparableField> findByRangeExcludingBounds(Date from, Date to) {
return new SearchBuilder<EntityWithComparableField>() //
.rangeOn(EntityWithComparableField_.date).excludingBounds().between(from, to) //
.build();
}
}